blk-mq: fix lockdep warning in __blk_mq_update_nr_hw_queues
authorMing Lei <ming.lei@redhat.com>
Fri, 15 Aug 2025 13:17:37 +0000 (21:17 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 Aug 2025 11:34:19 +0000 (05:34 -0600)
commit2d82f3bd8910eb65e30bb2a3c9b945bfb3b6d661
treedd1836965ef0c7194a3a62ab7506aac0fa0fff59
parentd0a2b527d8c32e46ccb8a34053468d4ff0c27e5c
blk-mq: fix lockdep warning in __blk_mq_update_nr_hw_queues

Commit 5989bfe6ac6b ("block: restore two stage elevator switch while
running nr_hw_queue update") reintroduced a lockdep warning by calling
blk_mq_freeze_queue_nomemsave() before switching the I/O scheduler.

The function blk_mq_elv_switch_none() calls elevator_change_done().
Running this while the queue is frozen causes a lockdep warning.

Fix this by reordering the operations: first, switch the I/O scheduler
to 'none', and then freeze the queue. This ensures that elevator_change_done()
is not called on an already frozen queue. And this way is safe because
elevator_set_none() does freeze queue before switching to none.

Also we still have to rely on blk_mq_elv_switch_back() for switching
back, and it has to cover unfrozen queue case.

Cc: Nilay Shroff <nilay@linux.ibm.com>
Cc: Yu Kuai <yukuai3@huawei.com>
Fixes: 5989bfe6ac6b ("block: restore two stage elevator switch while running nr_hw_queue update")
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Link: https://lore.kernel.org/r/20250815131737.331692-1-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c