diff options
Diffstat (limited to 'kernel/padata.c')
| -rw-r--r-- | kernel/padata.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/padata.c b/kernel/padata.c index f85f8bd788d0..f4def028c48c 100644 --- a/kernel/padata.c +++ b/kernel/padata.c @@ -291,8 +291,12 @@ static void padata_reorder(struct padata_priv *padata)  		struct padata_serial_queue *squeue;  		int cb_cpu; -		cpu = cpumask_next_wrap(cpu, pd->cpumask.pcpu);  		processed++; +		/* When sequence wraps around, reset to the first CPU. */ +		if (unlikely(processed == 0)) +			cpu = cpumask_first(pd->cpumask.pcpu); +		else +			cpu = cpumask_next_wrap(cpu, pd->cpumask.pcpu);  		cb_cpu = padata->cb_cpu;  		squeue = per_cpu_ptr(pd->squeue, cb_cpu); @@ -486,9 +490,9 @@ void __init padata_do_multithreaded(struct padata_mt_job *job)  			do {  				nid = next_node_in(old_node, node_states[N_CPU]);  			} while (!atomic_try_cmpxchg(&last_used_nid, &old_node, nid)); -			queue_work_node(nid, system_unbound_wq, &pw->pw_work); +			queue_work_node(nid, system_dfl_wq, &pw->pw_work);  		} else { -			queue_work(system_unbound_wq, &pw->pw_work); +			queue_work(system_dfl_wq, &pw->pw_work);  		}  	/* Use the current thread, which saves starting a workqueue worker. */ @@ -963,8 +967,9 @@ struct padata_instance *padata_alloc(const char *name)  	cpus_read_lock(); -	pinst->serial_wq = alloc_workqueue("%s_serial", WQ_MEM_RECLAIM | -					   WQ_CPU_INTENSIVE, 1, name); +	pinst->serial_wq = alloc_workqueue("%s_serial", +					   WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE | WQ_PERCPU, +					   1, name);  	if (!pinst->serial_wq)  		goto err_put_cpus;  | 
