]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: don't plug for aio/O_DIRECT HIPRI IO
authorJens Axboe <axboe@kernel.dk>
Fri, 16 Nov 2018 02:56:53 +0000 (19:56 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 16 Nov 2018 15:35:10 +0000 (08:35 -0700)
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>
fs/block_dev.c

index e72b119ede84f718c4aaedbeb4ca6587edadfdde..4d79bc80fb41edacffcfddae8a2e07202f821d2c 100644 (file)
@@ -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;