Skip to content

Commit 2293cae

Browse files
Ming Leiaxboe
authored andcommitted
blk-mq: don't insert passthrough request into sw queue
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: d97217e ("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>
1 parent 72ef02b commit 2293cae

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

block/blk-mq.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2728,7 +2728,12 @@ static void blk_mq_dispatch_plug_list(struct blk_plug *plug, bool from_sched)
27282728

27292729
percpu_ref_get(&this_hctx->queue->q_usage_counter);
27302730
/* passthrough requests should never be issued to the I/O scheduler */
2731-
if (this_hctx->queue->elevator && !is_passthrough) {
2731+
if (is_passthrough) {
2732+
spin_lock(&this_hctx->lock);
2733+
list_splice_tail_init(&list, &this_hctx->dispatch);
2734+
spin_unlock(&this_hctx->lock);
2735+
blk_mq_run_hw_queue(this_hctx, from_sched);
2736+
} else if (this_hctx->queue->elevator) {
27322737
this_hctx->queue->elevator->type->ops.insert_requests(this_hctx,
27332738
&list, 0);
27342739
blk_mq_run_hw_queue(this_hctx, from_sched);

0 commit comments

Comments
 (0)