Skip to content

Commit 27a781e

Browse files
author
Ming Lei
committed
block: move hctx debugfs/sysfs registering out of freezing queue
JIRA: https://issues.redhat.com/browse/RHEL-112997 commit 9dc7a88 Author: Ming Lei <[email protected]> Date: Mon May 5 22:18:00 2025 +0800 block: move hctx debugfs/sysfs registering out of freezing queue Move hctx debugfs/sysfs register out of freezing queue in __blk_mq_update_nr_hw_queues(), so that the following lockdep dependency can be killed: #2 (&q->q_usage_counter(io)#16){++++}-{0:0}: #1 (fs_reclaim){+.+.}-{0:0}: #0 (&sb->s_type->i_mutex_key#3){+.+.}-{4:4}: //debugfs And registering/un-registering hctx debugfs/sysfs does not require queue to be frozen: - hctx sysfs attributes show() are drained when removing kobject, and there isn't store() implementation for hctx sysfs attributes - debugfs entry read() is drained too when removing debugfs directory, and there isn't write() implementation for hctx debugfs too - so it is safe to register/unregister hctx sysfs/debugfs without freezing queue because the cod paths changes nothing, and we just need to keep hctx live Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-by: Nilay Shroff <[email protected]> Signed-off-by: Ming Lei <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]> Signed-off-by: Ming Lei <[email protected]>
1 parent b8599de commit 27a781e

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

block/blk-mq.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5007,14 +5007,14 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
50075007
return;
50085008

50095009
memflags = memalloc_noio_save();
5010-
list_for_each_entry(q, &set->tag_list, tag_set_list)
5011-
blk_mq_freeze_queue_nomemsave(q);
5012-
50135010
list_for_each_entry(q, &set->tag_list, tag_set_list) {
50145011
blk_mq_debugfs_unregister_hctxs(q);
50155012
blk_mq_sysfs_unregister_hctxs(q);
50165013
}
50175014

5015+
list_for_each_entry(q, &set->tag_list, tag_set_list)
5016+
blk_mq_freeze_queue_nomemsave(q);
5017+
50185018
if (blk_mq_realloc_tag_set_tags(set, nr_hw_queues) < 0)
50195019
goto reregister;
50205020

@@ -5037,16 +5037,15 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
50375037
blk_mq_map_swqueue(q);
50385038
}
50395039

5040+
/* elv_update_nr_hw_queues() unfreeze queue for us */
5041+
list_for_each_entry(q, &set->tag_list, tag_set_list)
5042+
elv_update_nr_hw_queues(q);
5043+
50405044
reregister:
50415045
list_for_each_entry(q, &set->tag_list, tag_set_list) {
50425046
blk_mq_sysfs_register_hctxs(q);
50435047
blk_mq_debugfs_register_hctxs(q);
50445048
}
5045-
5046-
/* elv_update_nr_hw_queues() unfreeze queue for us */
5047-
list_for_each_entry(q, &set->tag_list, tag_set_list)
5048-
elv_update_nr_hw_queues(q);
5049-
50505049
memalloc_noio_restore(memflags);
50515050

50525051
/* Free the excess tags when nr_hw_queues shrink. */

0 commit comments

Comments
 (0)