Commit 38a8c4d1 authored by Keith Busch's avatar Keith Busch Committed by Jens Axboe

blk-mq: directly poll requests

Polling needs a bio with a valid bi_bdev, but neither of those are
guaranteed for polled driver requests. Make request based polling
directly use blk-mq's polling function instead.

When executing a request from a polled hctx, we know the request's
cookie, and that it's from a live blk-mq queue that supports polling, so
we can safely skip everything that bio_poll provides.

Cc: stable@kernel.org
Reported-by: default avatarMartin Belanger <Martin.Belanger@dell.com>
Reported-by: default avatarDaniel Wagner <dwagner@suse.de>
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
Tested-by: default avatarDaniel Wagner <dwagner@suse.de>
Revieded-by: default avatarDaniel Wagner <dwagner@suse.de>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Tested-by: default avatarShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Link: https://lore.kernel.org/r/20230331180056.1155862-1-kbusch@meta.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 24ab70d8
...@@ -1359,8 +1359,6 @@ bool blk_rq_is_poll(struct request *rq) ...@@ -1359,8 +1359,6 @@ bool blk_rq_is_poll(struct request *rq)
return false; return false;
if (rq->mq_hctx->type != HCTX_TYPE_POLL) if (rq->mq_hctx->type != HCTX_TYPE_POLL)
return false; return false;
if (WARN_ON_ONCE(!rq->bio))
return false;
return true; return true;
} }
EXPORT_SYMBOL_GPL(blk_rq_is_poll); EXPORT_SYMBOL_GPL(blk_rq_is_poll);
...@@ -1368,7 +1366,7 @@ EXPORT_SYMBOL_GPL(blk_rq_is_poll); ...@@ -1368,7 +1366,7 @@ EXPORT_SYMBOL_GPL(blk_rq_is_poll);
static void blk_rq_poll_completion(struct request *rq, struct completion *wait) static void blk_rq_poll_completion(struct request *rq, struct completion *wait)
{ {
do { do {
bio_poll(rq->bio, NULL, 0); blk_mq_poll(rq->q, blk_rq_to_qc(rq), NULL, 0);
cond_resched(); cond_resched();
} while (!completion_done(wait)); } while (!completion_done(wait));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment