Skip to content

Commit 5291984

Browse files
Ming LeiMike Snitzer
authored andcommitted
dm: fix bio polling to handle possibile BLK_STS_AGAIN
Expanded testing of DM's bio polling support (using more fio threads to dm-linear ontop of null_blk) exposed the possibility for polled bios to hang (repeatedly polling in io_uring) when null_blk responds with BLK_STS_AGAIN (due to lack of resources): 1) io_complete_rw_iopoll() is called from blkdev_bio_end_io_async() to notify kiocb is done, that is the completion interface between block layer and io_uring 2) io_complete_rw_iopoll() is called from io_do_iopoll() 3) dm returns BLK_STS_AGAIN for one bio (on behalf of underlying driver), then io_complete_rw_iopoll is called, but io_do_iopoll() doesn't handle -EAGAIN at all (due to logic in io_rw_should_reissue) 4) reason for dm's BLK_STS_AGAIN is underlying null_blk driver ran out of requests (easier to reproduce by setting low hw_queue_depth). 5) dm should handle BLK_STS_AGAIN for POLLED underlying IO, and may retry in dm layer. This fix adds REQ_POLLED specific BLK_STS_AGAIN handling to dm_io_complete() that clears REQ_POLLED and requeues the bio to DM using queue_io(). Fixes: b99fdcd ("dm: support bio polling") Signed-off-by: Ming Lei <ming.lei@redhat.com> [snitzer: revised header, reused dm_io_complete's REQ_POLLED case] Signed-off-by: Mike Snitzer <snitzer@kernel.org>
1 parent aad5b23 commit 5291984

1 file changed

Lines changed: 13 additions & 7 deletions

File tree

drivers/md/dm.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -892,13 +892,19 @@ static void dm_io_complete(struct dm_io *io)
892892
if (unlikely(wq_has_sleeper(&md->wait)))
893893
wake_up(&md->wait);
894894

895-
if (io_error == BLK_STS_DM_REQUEUE) {
896-
/*
897-
* Upper layer won't help us poll split bio, io->orig_bio
898-
* may only reflect a subset of the pre-split original,
899-
* so clear REQ_POLLED in case of requeue
900-
*/
901-
bio->bi_opf &= ~REQ_POLLED;
895+
if (io_error == BLK_STS_DM_REQUEUE || io_error == BLK_STS_AGAIN) {
896+
if (bio->bi_opf & REQ_POLLED) {
897+
/*
898+
* Upper layer won't help us poll split bio (io->orig_bio
899+
* may only reflect a subset of the pre-split original)
900+
* so clear REQ_POLLED in case of requeue.
901+
*/
902+
bio->bi_opf &= ~REQ_POLLED;
903+
if (io_error == BLK_STS_AGAIN) {
904+
/* io_uring doesn't handle BLK_STS_AGAIN (yet) */
905+
queue_io(md, bio);
906+
}
907+
}
902908
return;
903909
}
904910

0 commit comments

Comments
 (0)