Re: [PATCH 1/2] PM: runtime: Fix I/O hang due to race between resume and runtime disable

From: Bart Van Assche

Date: Mon Dec 01 2025 - 11:41:29 EST


On 11/27/25 3:29 AM, YangYang wrote:
diff --git a/block/blk-core.c b/block/blk-core.c
index 66fb2071d..041d29ba4 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -323,12 +323,15 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
                 * reordered.
                 */
                smp_rmb();
-               wait_event(q->mq_freeze_wq,
-                          (!q->mq_freeze_depth &&
-                           blk_pm_resume_queue(pm, q)) ||
-                          blk_queue_dying(q));
+check:
+               wait_event(q->mq_freeze_wq, !q->mq_freeze_depth);
+
                if (blk_queue_dying(q))
                        return -ENODEV;

This can't work. blk_mq_destroy_queue() freezes a request queue without
unfreezing it so the above code will introduce a deadlock and/or a use-
after-free if it executes concurrently with blk_mq_destroy_queue().

Bart.