mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	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 affinity4c16bd327c("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 <tj@kernel.org> Reported-by: Christoph Hellwig <hch@infradead.org> Reported-by: Alexei Potashnik <alexei@purestorage.com> Fixes:4c16bd327c("workqueue: implement NUMA affinity for unbound workqueues") Cc: stable@vger.kernel.org # v3.10+
This commit is contained in:
		
							parent
							
								
									74cbd96bc2
								
							
						
					
					
						commit
						5c0338c687
					
				
					 1 changed files with 10 additions and 0 deletions
				
			
		|  | @ -3929,6 +3929,16 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, | |||
| 	struct workqueue_struct *wq; | ||||
| 	struct pool_workqueue *pwq; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Unbound && max_active == 1 used to imply ordered, which is no | ||||
| 	 * longer the case on NUMA machines due to per-node pools.  While | ||||
| 	 * alloc_ordered_workqueue() is the right way to create an ordered | ||||
| 	 * workqueue, keep the previous behavior to avoid subtle breakages | ||||
| 	 * on NUMA. | ||||
| 	 */ | ||||
| 	if ((flags & WQ_UNBOUND) && max_active == 1) | ||||
| 		flags |= __WQ_ORDERED; | ||||
| 
 | ||||
| 	/* see the comment above the definition of WQ_POWER_EFFICIENT */ | ||||
| 	if ((flags & WQ_POWER_EFFICIENT) && wq_power_efficient) | ||||
| 		flags |= WQ_UNBOUND; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tejun Heo
						Tejun Heo