Re: [PATCH] blk-mq: put the reference of the io scheduler module after switching back

From: Jinlong Chen
Date: Thu Oct 13 2022 - 09:48:14 EST


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