Re: [PATCH 1/9] workqueue: devres: Add device-managed allocate workqueue
From: Krzysztof Kozlowski
Date: Mon Feb 23 2026 - 06:52:25 EST
On 23/02/2026 09:56, Andy Shevchenko wrote:
> On Mon, Feb 23, 2026 at 08:27:29AM +0100, Krzysztof Kozlowski wrote:
>> Add a Resource-managed version of alloc_workqueue() to fix common
>> problem of drivers mixing devm() calls with destroy_workqueue. Such
>> naive and discouraged driver approach leads to difficult to debug bugs
>> when the driver:
>>
>> 1. Allocates workqueue in standard way and destroys it in driver
>> remove() callback,
>> 2. Sets work struct with devm_work_autocancel(),
>> 3. Registers interrupt handler with devm_request_threaded_irq().
>>
>> Which leads to following unbind/removal path:
>>
>> 1. destroy_workqueue() via driver remove(),
>> Any interrupt coming now would still execute the interrupt handler,
>> which queues work on destroyed workqueue.
>> 2. devm_irq_release(),
>> 3. devm_work_drop() -> cancel_work_sync() on destroyed workqueue.
>>
>> devm_alloc_workqueue() has two benefits:
>> 1. Solves above problem of mix-and-match devres and non-devres code in
>> driver,
>> 2. Simplify any sane drivers which were correctly using
>> alloc_workqueue() + devm_add_action_or_reset().
>
>> include/linux/workqueue.h | 32 ++++++++++++++++++++++++
>> kernel/workqueue.c | 32 ++++++++++++++++++++++++
>
> Hmm... We have devm-helpers.h. Why the new one is in workqueue.h?
> Can we have some consistency here?
>
Answering with update:
I don't think this should go to devm-helpers.h. The definition is in
workqueue.c, thus the declaration should be in corresponding header.
It's logical and consistent.
Otherwise, I could move it entirely - definition and declaration - to
devm-helpers.h, but then the release (devm_destroy_workqueue()) will be
essentially exported to everyone through the header.
So kind of conflicting choices.
Best regards,
Krzysztof