Hi Yi, can you try the patch below? This changes the teardown code to not re-enable writeback tracking when we're shutting the queue down, which is what I suspect is on the ->callbacks list. diff --git a/block/elevator.c b/block/elevator.c index ff45d8388f487..bb5c6ee4546cd 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -523,8 +523,6 @@ void elv_unregister_queue(struct request_queue *q) kobject_del(&e->kobj); e->registered = 0; - /* Re-enable throttling in case elevator disabled it */ - wbt_enable_default(q); } } @@ -591,8 +589,11 @@ int elevator_switch_mq(struct request_queue *q, lockdep_assert_held(&q->sysfs_lock); if (q->elevator) { - if (q->elevator->registered) + if (q->elevator->registered) { elv_unregister_queue(q); + /* Re-enable throttling in case elevator disabled it */ + wbt_enable_default(q); + } ioc_clear_queue(q); elevator_exit(q, q->elevator);