diff options
| -rw-r--r-- | kernel/workqueue.c | 18 | 
1 files changed, 16 insertions, 2 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 248d18aa2a5..3e18c7b865e 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -138,6 +138,7 @@ enum {  struct worker_pool {  	spinlock_t		lock;		/* the pool lock */  	int			cpu;		/* I: the associated cpu */ +	int			node;		/* I: the associated node ID */  	int			id;		/* I: pool ID */  	unsigned int		flags;		/* X: flags */ @@ -1645,7 +1646,6 @@ static struct worker *alloc_worker(void)  static struct worker *create_worker(struct worker_pool *pool)  {  	struct worker *worker = NULL; -	int node = pool->cpu >= 0 ? cpu_to_node(pool->cpu) : NUMA_NO_NODE;  	int id = -1;  	char id_buf[16]; @@ -1678,7 +1678,7 @@ static struct worker *create_worker(struct worker_pool *pool)  	else  		snprintf(id_buf, sizeof(id_buf), "u%d:%d", pool->id, id); -	worker->task = kthread_create_on_node(worker_thread, worker, node, +	worker->task = kthread_create_on_node(worker_thread, worker, pool->node,  					      "kworker/%s", id_buf);  	if (IS_ERR(worker->task))  		goto fail; @@ -3360,6 +3360,7 @@ static int init_worker_pool(struct worker_pool *pool)  	spin_lock_init(&pool->lock);  	pool->id = -1;  	pool->cpu = -1; +	pool->node = NUMA_NO_NODE;  	pool->flags |= POOL_DISASSOCIATED;  	INIT_LIST_HEAD(&pool->worklist);  	INIT_LIST_HEAD(&pool->idle_list); @@ -3465,6 +3466,7 @@ static struct worker_pool *get_unbound_pool(const struct workqueue_attrs *attrs)  {  	u32 hash = wqattrs_hash(attrs);  	struct worker_pool *pool; +	int node;  	lockdep_assert_held(&wq_pool_mutex); @@ -3487,6 +3489,17 @@ static struct worker_pool *get_unbound_pool(const struct workqueue_attrs *attrs)  	lockdep_set_subclass(&pool->lock, 1);	/* see put_pwq() */  	copy_workqueue_attrs(pool->attrs, attrs); +	/* if cpumask is contained inside a NUMA node, we belong to that node */ +	if (wq_numa_enabled) { +		for_each_node(node) { +			if (cpumask_subset(pool->attrs->cpumask, +					   wq_numa_possible_cpumask[node])) { +				pool->node = node; +				break; +			} +		} +	} +  	if (worker_pool_assign_id(pool) < 0)  		goto fail; @@ -4480,6 +4493,7 @@ static int __init init_workqueues(void)  			pool->cpu = cpu;  			cpumask_copy(pool->attrs->cpumask, cpumask_of(cpu));  			pool->attrs->nice = std_nice[i++]; +			pool->node = cpu_to_node(cpu);  			/* alloc pool ID */  			mutex_lock(&wq_pool_mutex);  |