|
@@ -303,22 +303,19 @@ static void queue_stop_cpus_work(const struct cpumask *cpumask,
|
|
|
struct cpu_stop_work *work;
|
|
|
unsigned int cpu;
|
|
|
|
|
|
- /* initialize works and done */
|
|
|
- for_each_cpu(cpu, cpumask) {
|
|
|
- work = &per_cpu(cpu_stopper.stop_work, cpu);
|
|
|
- work->fn = fn;
|
|
|
- work->arg = arg;
|
|
|
- work->done = done;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Disable preemption while queueing to avoid getting
|
|
|
* preempted by a stopper which might wait for other stoppers
|
|
|
* to enter @fn which can lead to deadlock.
|
|
|
*/
|
|
|
lg_global_lock(&stop_cpus_lock);
|
|
|
- for_each_cpu(cpu, cpumask)
|
|
|
- cpu_stop_queue_work(cpu, &per_cpu(cpu_stopper.stop_work, cpu));
|
|
|
+ for_each_cpu(cpu, cpumask) {
|
|
|
+ work = &per_cpu(cpu_stopper.stop_work, cpu);
|
|
|
+ work->fn = fn;
|
|
|
+ work->arg = arg;
|
|
|
+ work->done = done;
|
|
|
+ cpu_stop_queue_work(cpu, work);
|
|
|
+ }
|
|
|
lg_global_unlock(&stop_cpus_lock);
|
|
|
}
|
|
|
|