On 23/02/2026 09:56, Andy Shevchenko wrote:
On Mon, Feb 23, 2026 at 08:27:29AM +0100, Krzysztof Kozlowski wrote:
quoted
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().
quoted
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