aio: propagate and use queue cookie blk-polled-io
authorJens Axboe <axboe@fb.com>
Thu, 5 Mar 2015 23:29:35 +0000 (16:29 -0700)
committerJens Axboe <axboe@fb.com>
Fri, 6 Mar 2015 15:38:54 +0000 (08:38 -0700)
Signed-off-by: Jens Axboe <axboe@fb.com>
fs/aio.c
fs/direct-io.c
include/linux/aio.h

index f8e52a1854c1ab383e32383ac65a0f167e385793..9ae65c2c9002a181a10124d7b261ec560abe0a99 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -783,11 +783,17 @@ static int kill_ioctx(struct mm_struct *mm, struct kioctx *ctx,
  */
 ssize_t wait_on_sync_kiocb(struct kiocb *req)
 {
+       struct backing_dev_info *bdi = NULL;
+
+       if (req->ki_filp)
+               bdi = inode_to_bdi(req->ki_filp->f_inode);
+
        while (!req->ki_ctx) {
                set_current_state(TASK_UNINTERRUPTIBLE);
                if (req->ki_ctx)
                        break;
-               io_schedule();
+
+               bdi_io_wait(bdi, req->ki_queue_cookie);
        }
        __set_current_state(TASK_RUNNING);
        return req->ki_user_data;
index adc588ad22da1cf0f4fd288ef7c4a73adfcd0189..35c33f4178d229b817018b8a2403eee4ee4c4ff1 100644 (file)
@@ -403,6 +403,9 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
        } else
                dio->bio_cookie = submit_bio(dio->rw, bio);
 
+       if (dio->iocb)
+               dio->iocb->ki_queue_cookie = dio->bio_cookie;
+
        sdio->bio = NULL;
        sdio->boundary = 0;
        sdio->logical_offset_in_bio = 0;
index d9c92daa3944e43a13f285a7baaa1443868cce3d..1e897fd633d5c3645b9b8aa89467a5f7a195219f 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/rcupdate.h>
 
 #include <linux/atomic.h>
+#include <linux/blk_types.h>
 
 struct kioctx;
 struct kiocb;
@@ -52,6 +53,8 @@ struct kiocb {
         * this is the underlying eventfd context to deliver events to.
         */
        struct eventfd_ctx      *ki_eventfd;
+
+       queue_cookie_t          ki_queue_cookie;
 };
 
 static inline bool is_sync_kiocb(struct kiocb *kiocb)