[PATCH 0/4] blk-mq/nvme: fix debugfs creation with frozen queue
Yu Kuai
yukuai at fnnas.com
Mon Feb 9 00:29:49 PST 2026
blk_mq_update_nr_hw_queues() freezes and unfreezes queues internally.
When callers pre-freeze the queue before calling this function, the
freeze depth becomes 2. The internal unfreeze only decrements it to 1,
leaving the queue still frozen when debugfs_create_files() is called.
This triggers WARN_ON_ONCE(q->mq_freeze_depth != 0) in
debugfs_create_files() and risks deadlock.
Patch 1-3 fix nvme drivers by moving nvme_unfreeze() before
blk_mq_update_nr_hw_queues() so the queue is unfrozen before the call.
Patch 4 fixes the block layer debugfs_create_files() itself. I checked
all callers of debugfs_create_files():
- blk_mq_debugfs_register() from blk_register_queue(): queue not frozen
- blk_mq_debugfs_register_hctx() from blk_mq_debugfs_register_hctxs():
called after blk_mq_elv_switch_back() which unfreezes the queue
- blk_mq_debugfs_register_sched() from elv_register_queue():
called after blk_mq_unfreeze_queue()
- blk_mq_debugfs_register_rqos() from wbt paths:
called after blk_mq_unfreeze_queue()
All callers have the queue unfrozen. However, the queue can be frozen
from another context at any time, so the WARN_ON_ONCE check is racy.
Replace it with blk_queue_enter()/blk_queue_exit() which properly waits
for the queue to be unfrozen and prevents new freezes while creating
debugfs files.
Yu Kuai (4):
nvme-rdma: move blk_mq_update_nr_hw_queues after nvme_unfreeze
nvme-tcp: move blk_mq_update_nr_hw_queues after nvme_unfreeze
nvme-apple: move blk_mq_update_nr_hw_queues after nvme_unfreeze
blk-mq: use blk_queue_enter/exit to protect debugfs file creation
block/blk-mq-debugfs.c | 15 ++++++++++-----
drivers/nvme/host/apple.c | 2 +-
drivers/nvme/host/rdma.c | 2 +-
drivers/nvme/host/tcp.c | 2 +-
4 files changed, 13 insertions(+), 8 deletions(-)
--
2.51.0
More information about the linux-arm-kernel
mailing list