diff mbox series

blk-mq: don't insert passthrough request into sw queue

Message ID 20230621132208.1142318-1-ming.lei@redhat.com (mailing list archive)
State New, archived
Headers show
Series blk-mq: don't insert passthrough request into sw queue | expand

Commit Message

Ming Lei June 21, 2023, 1:22 p.m. UTC
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>
---
 block/blk-mq.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Jens Axboe June 21, 2023, 1:48 p.m. UTC | #1
On Wed, 21 Jun 2023 21:22:08 +0800, Ming Lei wrote:
> 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.
> 
> [...]

Applied, thanks!

[1/1] blk-mq: don't insert passthrough request into sw queue
      commit: 2293cae703cda162684ae966db6b1b4a11b5e88f

Best regards,
Bart Van Assche June 21, 2023, 3:50 p.m. UTC | #2
On 6/21/23 06:22, Ming Lei wrote:
>   	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);

The code change in this patch looks fine to me. However, with this patch 
applied the code and the source code comment just above the modified are 
now out of sync :-(

Bart.
diff mbox series

Patch

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 4c02c28b4835..1628873d7587 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2750,7 +2750,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);