stop_machine: reorganize stop_cpus() implementation
Refactor the queuing part of the stop cpus work from __stop_cpus() into queue_stop_cpus_work(). The reorganization is to help future improvements to stop_machine() and doesn't introduce any behavior difference. Signed-off-by: Tejun Heo <tj@kernel.org> Link: http://lkml.kernel.org/r/20110623182056.897818337@sbsiddha-MOBL3.sc.intel.com Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
6d3321e8e2
commit
fd7355ba1e
1 changed files with 12 additions and 4 deletions
|
@ -136,10 +136,11 @@ DEFINE_MUTEX(stop_cpus_mutex);
|
||||||
/* static data for stop_cpus */
|
/* static data for stop_cpus */
|
||||||
static DEFINE_PER_CPU(struct cpu_stop_work, stop_cpus_work);
|
static DEFINE_PER_CPU(struct cpu_stop_work, stop_cpus_work);
|
||||||
|
|
||||||
int __stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
|
static void queue_stop_cpus_work(const struct cpumask *cpumask,
|
||||||
|
cpu_stop_fn_t fn, void *arg,
|
||||||
|
struct cpu_stop_done *done)
|
||||||
{
|
{
|
||||||
struct cpu_stop_work *work;
|
struct cpu_stop_work *work;
|
||||||
struct cpu_stop_done done;
|
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
/* initialize works and done */
|
/* initialize works and done */
|
||||||
|
@ -147,9 +148,8 @@ int __stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
|
||||||
work = &per_cpu(stop_cpus_work, cpu);
|
work = &per_cpu(stop_cpus_work, cpu);
|
||||||
work->fn = fn;
|
work->fn = fn;
|
||||||
work->arg = arg;
|
work->arg = arg;
|
||||||
work->done = &done;
|
work->done = done;
|
||||||
}
|
}
|
||||||
cpu_stop_init_done(&done, cpumask_weight(cpumask));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable preemption while queueing to avoid getting
|
* Disable preemption while queueing to avoid getting
|
||||||
|
@ -161,7 +161,15 @@ int __stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
|
||||||
cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu),
|
cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu),
|
||||||
&per_cpu(stop_cpus_work, cpu));
|
&per_cpu(stop_cpus_work, cpu));
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __stop_cpus(const struct cpumask *cpumask,
|
||||||
|
cpu_stop_fn_t fn, void *arg)
|
||||||
|
{
|
||||||
|
struct cpu_stop_done done;
|
||||||
|
|
||||||
|
cpu_stop_init_done(&done, cpumask_weight(cpumask));
|
||||||
|
queue_stop_cpus_work(cpumask, fn, arg, &done);
|
||||||
wait_for_completion(&done.completion);
|
wait_for_completion(&done.completion);
|
||||||
return done.executed ? done.ret : -ENOENT;
|
return done.executed ? done.ret : -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue