Skip to content

Commit

Permalink
block: don't try to poll multi-bio I/Os in __blkdev_direct_IO
Browse files Browse the repository at this point in the history
If an iocb is split into multiple bios we can't poll for both.  So don't
even bother to try to poll in that case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20211012111226.760968-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Christoph Hellwig authored and Jens Axboe committed Oct 18, 2021
1 parent 94c2ed5 commit 71fc3f5
Showing 1 changed file with 7 additions and 14 deletions.
21 changes: 7 additions & 14 deletions block/fops.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
struct blk_plug plug;
struct blkdev_dio *dio;
struct bio *bio;
bool is_poll = (iocb->ki_flags & IOCB_HIPRI) != 0;
bool do_poll = (iocb->ki_flags & IOCB_HIPRI);
bool is_read = (iov_iter_rw(iter) == READ), is_sync;
loff_t pos = iocb->ki_pos;
blk_qc_t qc = BLK_QC_T_NONE;
Expand Down Expand Up @@ -226,7 +226,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
* Don't plug for HIPRI/polled IO, as those should go straight
* to issue
*/
if (!is_poll)
if (!(iocb->ki_flags & IOCB_HIPRI))
blk_start_plug(&plug);

for (;;) {
Expand Down Expand Up @@ -260,20 +260,13 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,

nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS);
if (!nr_pages) {
bool polled = false;

if (iocb->ki_flags & IOCB_HIPRI) {
if (do_poll)
bio_set_polled(bio, iocb);
polled = true;
}

qc = submit_bio(bio);

if (polled)
if (do_poll)
WRITE_ONCE(iocb->ki_cookie, qc);
break;
}

if (!dio->multi_bio) {
/*
* AIO needs an extra reference to ensure the dio
Expand All @@ -284,6 +277,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
bio_get(bio);
dio->multi_bio = true;
atomic_set(&dio->ref, 2);
do_poll = false;
} else {
atomic_inc(&dio->ref);
}
Expand All @@ -292,7 +286,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
bio = bio_alloc(GFP_KERNEL, nr_pages);
}

if (!is_poll)
if (!(iocb->ki_flags & IOCB_HIPRI))
blk_finish_plug(&plug);

if (!is_sync)
Expand All @@ -303,8 +297,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
if (!READ_ONCE(dio->waiter))
break;

if (!(iocb->ki_flags & IOCB_HIPRI) ||
!blk_poll(bdev_get_queue(bdev), qc, true))
if (!do_poll || !blk_poll(bdev_get_queue(bdev), qc, true))
blk_io_schedule();
}
__set_current_state(TASK_RUNNING);
Expand Down

0 comments on commit 71fc3f5

Please sign in to comment.