Re: INFO: task hung in blk_queue_enter
From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date: 2018-05-21 21:53:59
Also in:
linux-ext4, lkml
Bart Van Assche wrote:
On Wed, 2018-05-16 at 17:16 +0200, Dmitry Vyukov wrote:quoted
On Wed, May 16, 2018 at 4:56 PM, Bart Van Assche [off-list ref] wrote:quoted
On Wed, 2018-05-16 at 22:05 +0900, Tetsuo Handa wrote:quoted
diff --git a/block/blk-core.c b/block/blk-core.c index 85909b4..59e2496 100644 --- a/block/blk-core.c +++ b/block/blk-core.c@@ -951,10 +951,10 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) smp_rmb(); wait_event(q->mq_freeze_wq, - (atomic_read(&q->mq_freeze_depth) == 0 && - (preempt || !blk_queue_preempt_only(q))) || + atomic_read(&q->mq_freeze_depth) || + (preempt || !blk_queue_preempt_only(q)) || blk_queue_dying(q)); - if (blk_queue_dying(q)) + if (atomic_read(&q->mq_freeze_depth) || blk_queue_dying(q)) return -ENODEV; } }That change looks wrong to me.Hi Bart, Why does it look wrong to you?Because that change conflicts with the purpose of queue freezing and also because that change would inject I/O errors in code paths that shouldn't inject I/O errors.
But waiting there until atomic_read(&q->mq_freeze_depth) becomes 0 is causing deadlock. wait_event() never returns is a bug. I think we should not wait for q->mq_freeze_depth.