Thread (25 messages) 25 messages, 9 authors, 2018-06-07

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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help