summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorMing Lei <ming.lei@redhat.com>2023-06-21 21:22:08 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-07-19 16:35:14 +0200
commiteb287ef3842621290f6bb1a4487a2c3090499269 (patch)
tree557a4fc01b66aed8d4ad0dcaa8599c3f81037333 /block
parentad87179a2088c77e078922ebe285f63872efcb1e (diff)
downloadlinux-stable-eb287ef3842621290f6bb1a4487a2c3090499269.tar.gz
linux-stable-eb287ef3842621290f6bb1a4487a2c3090499269.tar.bz2
linux-stable-eb287ef3842621290f6bb1a4487a2c3090499269.zip
blk-mq: don't insert passthrough request into sw queue
[ Upstream commit 2293cae703cda162684ae966db6b1b4a11b5e88f ] In case of real io scheduler, q->elevator is set, so blk_mq_run_hw_queue() may just check if scheduler queue has request to dispatch, see __blk_mq_sched_dispatch_requests(). Then IO hang may be caused because all passthorugh requests may stay in sw queue. And any passthrough request should have been inserted to hctx->dispatch always. Reported-by: Guangwu Zhang <guazhang@redhat.com> Fixes: d97217e7f024 ("blk-mq: don't queue plugged passthrough requests into scheduler") Signed-off-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20230621132208.1142318-1-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'block')
-rw-r--r--block/blk-mq.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index c763f0bc6637..b9f454613989 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2735,7 +2735,12 @@ static void blk_mq_dispatch_plug_list(struct blk_plug *plug, bool from_sched)
percpu_ref_get(&this_hctx->queue->q_usage_counter);
/* passthrough requests should never be issued to the I/O scheduler */
- if (this_hctx->queue->elevator && !is_passthrough) {
+ if (is_passthrough) {
+ spin_lock(&this_hctx->lock);
+ list_splice_tail_init(&list, &this_hctx->dispatch);
+ spin_unlock(&this_hctx->lock);
+ blk_mq_run_hw_queue(this_hctx, from_sched);
+ } else if (this_hctx->queue->elevator) {
this_hctx->queue->elevator->type->ops.insert_requests(this_hctx,
&list, 0);
blk_mq_run_hw_queue(this_hctx, from_sched);