Hello Jens, This patchset cleans up elevator change code, and unifying it via single helper, meantime moves kobject_add/del & debugfs register/unregister out of queue freezing & elevator_lock. This way fixes many lockdep warnings reported recently, especially since fs_reclaim is connected with freeze lock manually by commit ffa1e7ada456 ("block: Make request_queue lockdep splats show up earlier"). Thanks, Ming V3: - replace srcu with rw_sem for avoiding race between add/del disk & elevator switch and updating nr_hw_queues (Nilay Shoff) - add elv_update_nr_hw_queues() for elevator reattachment in case of updating nr_hw_queues, meantime keep elv_change_ctx as local structure (Christoph) - replace ->elevator_lock with disk->rqos_state_mutex for covering wbt state change - add new patch "block: use q->elevator with ->elevator_lock held in elv_iosched_show()" - small cleanup & commit log improvement V2: - retry add/del disk when blk_mq_update_nr_hw_queues() is in-progress - swap blk_mq_add_queue_tag_set() with blk_mq_map_swqueue() in blk_mq_init_allocated_queue() (Nilay Shroff) - move ELEVATOR_FLAG_DISABLE_WBT to request queue's flags (Nilay Shoff) - fix race because of delaying elevator unregister - define flags of `elv_change_ctx` as `bool` (Christoph) - improve comment and commit log (Christoph) Ming Lei (20): block: move blk_mq_add_queue_tag_set() after blk_mq_map_swqueue() block: move ELEVATOR_FLAG_DISABLE_WBT a request queue flag block: don't call freeze queue in elevator_switch() and elevator_disable() block: use q->elevator with ->elevator_lock held in elv_iosched_show() block: add two helpers for registering/un-registering sched debugfs block: move sched debugfs register into elvevator_register_queue block: prevent adding/deleting disk during updating nr_hw_queues block: don't allow to switch elevator if updating nr_hw_queues is in-progress block: simplify elevator reattachment for updating nr_hw_queues block: move blk_unregister_queue() & device_del() after freeze wait block: move queue freezing & elevator_lock into elevator_change() block: add `struct elv_change_ctx` for unifying elevator change block: unifying elevator change block: pass elevator_queue to elv_register_queue & unregister_queue block: fail to show/store elevator sysfs attribute if elevator is dying block: move elv_register[unregister]_queue out of elevator_lock block: move debugfs/sysfs register out of freezing queue block: remove several ->elevator_lock block: move hctx cpuhp add/del out of queue freezing block: move wbt_enable_default() out of queue freezing from sched ->exit() block/bfq-iosched.c | 6 +- block/blk-mq-debugfs.c | 12 +- block/blk-mq-sched.c | 41 +++--- block/blk-mq.c | 132 +++--------------- block/blk-sysfs.c | 24 ++-- block/blk-wbt.c | 13 +- block/blk.h | 8 +- block/elevator.c | 302 ++++++++++++++++++++++++++++------------- block/elevator.h | 6 +- block/genhd.c | 129 +++++++++++------- include/linux/blk-mq.h | 3 + include/linux/blkdev.h | 5 + 12 files changed, 365 insertions(+), 316 deletions(-) -- 2.47.0