Skip to content

Commit 5c0338c

Browse files
committed
workqueue: restore WQ_UNBOUND/max_active==1 to be ordered
The combination of WQ_UNBOUND and max_active == 1 used to imply ordered execution. After NUMA affinity 4c16bd3 ("workqueue: implement NUMA affinity for unbound workqueues"), this is no longer true due to per-node worker pools. While the right way to create an ordered workqueue is alloc_ordered_workqueue(), the documentation has been misleading for a long time and people do use WQ_UNBOUND and max_active == 1 for ordered workqueues which can lead to subtle bugs which are very difficult to trigger. It's unlikely that we'd see noticeable performance impact by enforcing ordering on WQ_UNBOUND / max_active == 1 workqueues. Let's automatically set __WQ_ORDERED for those workqueues. Signed-off-by: Tejun Heo <[email protected]> Reported-by: Christoph Hellwig <[email protected]> Reported-by: Alexei Potashnik <[email protected]> Fixes: 4c16bd3 ("workqueue: implement NUMA affinity for unbound workqueues") Cc: [email protected] # v3.10+
1 parent 74cbd96 commit 5c0338c

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

kernel/workqueue.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3929,6 +3929,16 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt,
39293929
struct workqueue_struct *wq;
39303930
struct pool_workqueue *pwq;
39313931

3932+
/*
3933+
* Unbound && max_active == 1 used to imply ordered, which is no
3934+
* longer the case on NUMA machines due to per-node pools. While
3935+
* alloc_ordered_workqueue() is the right way to create an ordered
3936+
* workqueue, keep the previous behavior to avoid subtle breakages
3937+
* on NUMA.
3938+
*/
3939+
if ((flags & WQ_UNBOUND) && max_active == 1)
3940+
flags |= __WQ_ORDERED;
3941+
39323942
/* see the comment above the definition of WQ_POWER_EFFICIENT */
39333943
if ((flags & WQ_POWER_EFFICIENT) && wq_power_efficient)
39343944
flags |= WQ_UNBOUND;

0 commit comments

Comments
 (0)