Messages in this thread Patch in this message | | | Date | Fri, 30 Sep 2011 10:00:06 -0700 | From | Jeremy Fitzhardinge <> | Subject | Re: [PATCH RFC] stop_machine: make stop_machine safe and efficient to call early |
| |
On 09/30/2011 09:34 AM, Steven Rostedt wrote: > Doesn't interrupts need to be disabled here too? As stop machine > functions also guarantee that they will not be interrupted by > interrupts. -- Steve
Good point.
J
Make stop_machine() safe to call early in boot, before SMP has been set up, by simply calling the callback function directly if there's only one CPU online.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: Tejun Heo <tj@kernel.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: H. Peter Anvin <hpa@linux.intel.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Steven Rostedt <rostedt@goodmis.org>
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index ba5070c..a45b36d 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c @@ -485,6 +485,17 @@ int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus) .num_threads = num_online_cpus(), .active_cpus = cpus }; + if (smdata.num_threads == 1) { + unsigned long flags; + int ret; + + local_save_flags(flags); + ret = (*fn)(data); + local_irq_restore(flags); + + return ret; + } + /* Set the initial state and stop all online cpus. */ set_state(&smdata, STOPMACHINE_PREPARE); return stop_cpus(cpu_online_mask, stop_machine_cpu_stop, &smdata);
| |