diff options
author | Jens Axboe <axboe@kernel.dk> | 2018-11-16 05:56:53 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-11-16 18:35:10 +0300 |
commit | cb700eb3faa488fbb4b60689adec84032d7cf24a (patch) | |
tree | a5d3d021f215df62e0626689dcffa9c31b98d17f /fs/block_dev.c | |
parent | d34513d384487e8022f143a3a6b791e6d7f0dad6 (diff) | |
download | linux-cb700eb3faa488fbb4b60689adec84032d7cf24a.tar.xz |
block: don't plug for aio/O_DIRECT HIPRI IO
Those will go straight to issue inside blk-mq, so don't bother
setting up a block plug for them.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index e72b119ede84..4d79bc80fb41 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -330,6 +330,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages) struct blk_plug plug; struct blkdev_dio *dio; struct bio *bio; + bool is_poll = (iocb->ki_flags & IOCB_HIPRI) != 0; bool is_read = (iov_iter_rw(iter) == READ), is_sync; loff_t pos = iocb->ki_pos; blk_qc_t qc = BLK_QC_T_NONE; @@ -353,7 +354,13 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages) dio->multi_bio = false; dio->should_dirty = is_read && iter_is_iovec(iter); - blk_start_plug(&plug); + /* + * Don't plug for HIPRI/polled IO, as those should go straight + * to issue + */ + if (!is_poll) + blk_start_plug(&plug); + for (;;) { bio_set_dev(bio, bdev); bio->bi_iter.bi_sector = pos >> 9; @@ -400,7 +407,9 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages) submit_bio(bio); bio = bio_alloc(GFP_KERNEL, nr_pages); } - blk_finish_plug(&plug); + + if (!is_poll) + blk_finish_plug(&plug); if (!is_sync) return -EIOCBQUEUED; |