Hi, Yu Kuai!
I'm confused here, cause I do think this patch make sense.
blk_mq_update_nr_hw_queues
// for each queue using the tagset
blk_mq_freeze_queue
// if current elevator is not none, swith to none
blk_mq_elv_switch_none
// elevator need to be switched back, got a reference to
// prevent module to be removed.
__module_get
elevator_switch(q, NULL);
// switch back from none elevator
blk_mq_elv_switch_back
-> should release the module reference here
blk_mq_unfreeze_queue
We need to release the reference only if blk_mq_elv_switch_back got its own
reference. However, blk_mq_elv_switch_back (precisely elevator_switch_mq)
does not increase the reference of the module it is switching to.
Hence, the reference got in blk_mq_elv_switch_none does not need to be released,
or we'll have to re-increase the reference count manually.'
By the way, I do not test yet, but I think problem can be reporduced:
1. modprobe bfq
2. switch elevator to bfq
3. trigger blk_mq_update_nr_hw_queues
4. switch elevator to none
5. rmmod bfq will fail
I tried to reproduce the problem but failed, so I found my mistake.
Sincerely,
Jinlong Chen
.