aboutsummaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-11-10 20:23:49 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-11-10 20:23:49 -0500
commit3419b45039c6b799c974a8019361c045e7ca232c (patch)
tree36a63602036cc50f34fadcbd5d5d8fca94e44297 /fs/direct-io.c
parent01504f5e9e071f1dde1062e3be15f54d4555308f (diff)
parentc1c534609fe8a859f9c8108a5591e6e8a97e34d1 (diff)
Merge branch 'for-4.4/io-poll' of git://git.kernel.dk/linux-block
Pull block IO poll support from Jens Axboe: "Various groups have been doing experimentation around IO polling for (really) fast devices. The code has been reviewed and has been sitting on the side for a few releases, but this is now good enough for coordinated benchmarking and further experimentation. Currently O_DIRECT sync read/write are supported. A framework is in the works that allows scalable stats tracking so we can auto-tune this. And we'll add libaio support as well soon. Fow now, it's an opt-in feature for test purposes" * 'for-4.4/io-poll' of git://git.kernel.dk/linux-block: direct-io: be sure to assign dio->bio_bdev for both paths directio: add block polling support NVMe: add blk polling support block: add block polling support blk-mq: return tag/queue combo in the make_request_fn handlers block: change ->make_request_fn() and users to return a queue cookie
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 18e7554cf94c..cb5337d8c273 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -109,6 +109,8 @@ struct dio_submit {
109struct dio { 109struct dio {
110 int flags; /* doesn't change */ 110 int flags; /* doesn't change */
111 int rw; 111 int rw;
112 blk_qc_t bio_cookie;
113 struct block_device *bio_bdev;
112 struct inode *inode; 114 struct inode *inode;
113 loff_t i_size; /* i_size when submitted */ 115 loff_t i_size; /* i_size when submitted */
114 dio_iodone_t *end_io; /* IO completion function */ 116 dio_iodone_t *end_io; /* IO completion function */
@@ -397,11 +399,14 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
397 if (dio->is_async && dio->rw == READ && dio->should_dirty) 399 if (dio->is_async && dio->rw == READ && dio->should_dirty)
398 bio_set_pages_dirty(bio); 400 bio_set_pages_dirty(bio);
399 401
400 if (sdio->submit_io) 402 dio->bio_bdev = bio->bi_bdev;
403
404 if (sdio->submit_io) {
401 sdio->submit_io(dio->rw, bio, dio->inode, 405 sdio->submit_io(dio->rw, bio, dio->inode,
402 sdio->logical_offset_in_bio); 406 sdio->logical_offset_in_bio);
403 else 407 dio->bio_cookie = BLK_QC_T_NONE;
404 submit_bio(dio->rw, bio); 408 } else
409 dio->bio_cookie = submit_bio(dio->rw, bio);
405 410
406 sdio->bio = NULL; 411 sdio->bio = NULL;
407 sdio->boundary = 0; 412 sdio->boundary = 0;
@@ -440,7 +445,8 @@ static struct bio *dio_await_one(struct dio *dio)
440 __set_current_state(TASK_UNINTERRUPTIBLE); 445 __set_current_state(TASK_UNINTERRUPTIBLE);
441 dio->waiter = current; 446 dio->waiter = current;
442 spin_unlock_irqrestore(&dio->bio_lock, flags); 447 spin_unlock_irqrestore(&dio->bio_lock, flags);
443 io_schedule(); 448 if (!blk_poll(bdev_get_queue(dio->bio_bdev), dio->bio_cookie))
449 io_schedule();
444 /* wake up sets us TASK_RUNNING */ 450 /* wake up sets us TASK_RUNNING */
445 spin_lock_irqsave(&dio->bio_lock, flags); 451 spin_lock_irqsave(&dio->bio_lock, flags);
446 dio->waiter = NULL; 452 dio->waiter = NULL;