From: Jens Axboe Date: Thu, 19 Jan 2017 14:58:59 +0000 (-0700) Subject: blk-mq: stop hardware queue in blk_mq_delay_queue() X-Git-Tag: v4.11-rc1~142^2~1^2~59 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7e79dadce222e06e0c30a77280f3426014bee185;p=platform%2Fkernel%2Flinux-exynos.git blk-mq: stop hardware queue in blk_mq_delay_queue() The run handler we register for the delayed work requires that the queue be stopped, yet we leave that up to the caller. Let's move it into blk_mq_delay_queue() itself, so that the API is sane. This fixes a stall with SCSI, where it calls blk_mq_delay_queue() without having stopped the queue. Hence the queue is never run. Reported-by: Hannes Reinecke Fixes: 70f4db639c5b ("blk-mq: add blk_mq_delay_queue") Signed-off-by: Jens Axboe --- diff --git a/block/blk-mq.c b/block/blk-mq.c index fa1f861..b365cde 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1170,6 +1170,7 @@ void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs) if (unlikely(!blk_mq_hw_queue_mapped(hctx))) return; + blk_mq_stop_hw_queue(hctx); kblockd_schedule_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->delay_work, msecs_to_jiffies(msecs)); }