On Mon, May 12, 2025 at 04:23:55PM +0800, Yu Kuai wrote:
>>> +   INIT_WORK_ONSTACK(&unplug_work.work, llbitmap_unplug_fn);
>>> +   queue_work(md_llbitmap_unplug_wq, &unplug_work.work);
>>> +   wait_for_completion(&done);
>>> +   destroy_work_on_stack(&unplug_work.work);
>>
>> Why is this deferring the work to a workqueue, but then synchronously
>> waits on it?
>
> This is the same as old bitmap, by the fact that issue new IO and wait
> for such IO to be done from submit_bio() context will deadlock.
>
> 1) bitmap bio must be done before this bio can be issued;
> 2) bitmap bio will be added to current->bio_list, and wait for this bio
> to be issued;
>
> Do you have a better sulution to this problem?

A bew block layer API that bypasses bio_list maybe?  I.e. export
__submit_bio with a better name and a kerneldoc detailing the narrow
use case.


Reply via email to