|
@@ -131,6 +131,7 @@ int padata_do_parallel(struct padata_instance *pinst,
|
|
|
padata->cb_cpu = cb_cpu;
|
|
|
|
|
|
target_cpu = padata_cpu_hash(pd);
|
|
|
+ padata->cpu = target_cpu;
|
|
|
queue = per_cpu_ptr(pd->pqueue, target_cpu);
|
|
|
|
|
|
spin_lock(&queue->parallel.lock);
|
|
@@ -363,10 +364,21 @@ void padata_do_serial(struct padata_priv *padata)
|
|
|
int cpu;
|
|
|
struct padata_parallel_queue *pqueue;
|
|
|
struct parallel_data *pd;
|
|
|
+ int reorder_via_wq = 0;
|
|
|
|
|
|
pd = padata->pd;
|
|
|
|
|
|
cpu = get_cpu();
|
|
|
+
|
|
|
+ /* We need to run on the same CPU padata_do_parallel(.., padata, ..)
|
|
|
+ * was called on -- or, at least, enqueue the padata object into the
|
|
|
+ * correct per-cpu queue.
|
|
|
+ */
|
|
|
+ if (cpu != padata->cpu) {
|
|
|
+ reorder_via_wq = 1;
|
|
|
+ cpu = padata->cpu;
|
|
|
+ }
|
|
|
+
|
|
|
pqueue = per_cpu_ptr(pd->pqueue, cpu);
|
|
|
|
|
|
spin_lock(&pqueue->reorder.lock);
|
|
@@ -376,7 +388,13 @@ void padata_do_serial(struct padata_priv *padata)
|
|
|
|
|
|
put_cpu();
|
|
|
|
|
|
- padata_reorder(pd);
|
|
|
+ /* If we're running on the wrong CPU, call padata_reorder() via a
|
|
|
+ * kernel worker.
|
|
|
+ */
|
|
|
+ if (reorder_via_wq)
|
|
|
+ queue_work_on(cpu, pd->pinst->wq, &pqueue->reorder_work);
|
|
|
+ else
|
|
|
+ padata_reorder(pd);
|
|
|
}
|
|
|
EXPORT_SYMBOL(padata_do_serial);
|
|
|
|