workqueue: Add new WQ_PERCPU flag

Currently if a user enqueue a work item using schedule_delayed_work() the
used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use
WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to
schedule_work() that is using system_wq and queue_work(), that makes use
again of WORK_CPU_UNBOUND.
This lack of consistentcy cannot be addressed without refactoring the API.

This patch adds a new WQ_PERCPU flag to explicitly request the use of
the per-CPU behavior. Both flags coexist for one release cycle to allow
callers to transition their calls.

Once migration is complete, WQ_UNBOUND can be removed and unbound will
become the implicit default.

tj: Merged doc patch.

Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Marco Crivellari <marco.crivellari@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
Marco Crivellari 2025-06-14 15:35:30 +02:00 committed by Tejun Heo
parent 128ea9f6cc
commit 930c2ea566
2 changed files with 7 additions and 0 deletions

View File

@ -183,6 +183,12 @@ resources, scheduled and executed.
BH work items cannot sleep. All other features such as delayed queueing, BH work items cannot sleep. All other features such as delayed queueing,
flushing and canceling are supported. flushing and canceling are supported.
``WQ_PERCPU``
Work items queued to a per-cpu wq are bound to a specific CPU.
This flag is the right choice when cpu locality is important.
This flag is the complement of ``WQ_UNBOUND``.
``WQ_UNBOUND`` ``WQ_UNBOUND``
Work items queued to an unbound wq are served by the special Work items queued to an unbound wq are served by the special
worker-pools which host workers which are not bound to any worker-pools which host workers which are not bound to any

View File

@ -401,6 +401,7 @@ enum wq_flags {
* http://thread.gmane.org/gmane.linux.kernel/1480396 * http://thread.gmane.org/gmane.linux.kernel/1480396
*/ */
WQ_POWER_EFFICIENT = 1 << 7, WQ_POWER_EFFICIENT = 1 << 7,
WQ_PERCPU = 1 << 8, /* bound to a specific cpu */
__WQ_DESTROYING = 1 << 15, /* internal: workqueue is destroying */ __WQ_DESTROYING = 1 << 15, /* internal: workqueue is destroying */
__WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */ __WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */