diff options
author | Tejun Heo <tj@kernel.org> | 2010-05-06 12:49:20 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-05-06 12:49:20 -0400 |
commit | 3fc1f1e27a5b807791d72e5d992aa33b668a6626 (patch) | |
tree | 396c2f49909c506c3ad53fd6a9bdddf6c24f7860 /kernel/cpu.c | |
parent | 1142d810298e694754498dbb4983fcb6cb7fd884 (diff) |
stop_machine: reimplement using cpu_stop
Reimplement stop_machine using cpu_stop. As cpu stoppers are
guaranteed to be available for all online cpus,
stop_machine_create/destroy() are no longer necessary and removed.
With resource management and synchronization handled by cpu_stop, the
new implementation is much simpler. Asking the cpu_stop to execute
the stop_cpu() state machine on all online cpus with cpu hotplug
disabled is enough.
stop_machine itself doesn't need to manage any global resources
anymore, so all per-instance information is rolled into struct
stop_machine_data and the mutex and all static data variables are
removed.
The previous implementation created and destroyed RT workqueues as
necessary which made stop_machine() calls highly expensive on very
large machines. According to Dimitri Sivanich, preventing the dynamic
creation/destruction makes booting faster more than twice on very
large machines. cpu_stop resources are preallocated for all online
cpus and should have the same effect.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Dimitri Sivanich <sivanich@sgi.com>
Diffstat (limited to 'kernel/cpu.c')
-rw-r--r-- | kernel/cpu.c | 8 |
1 files changed, 0 insertions, 8 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 914aedcde849..545777574779 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -266,9 +266,6 @@ int __ref cpu_down(unsigned int cpu) | |||
266 | { | 266 | { |
267 | int err; | 267 | int err; |
268 | 268 | ||
269 | err = stop_machine_create(); | ||
270 | if (err) | ||
271 | return err; | ||
272 | cpu_maps_update_begin(); | 269 | cpu_maps_update_begin(); |
273 | 270 | ||
274 | if (cpu_hotplug_disabled) { | 271 | if (cpu_hotplug_disabled) { |
@@ -280,7 +277,6 @@ int __ref cpu_down(unsigned int cpu) | |||
280 | 277 | ||
281 | out: | 278 | out: |
282 | cpu_maps_update_done(); | 279 | cpu_maps_update_done(); |
283 | stop_machine_destroy(); | ||
284 | return err; | 280 | return err; |
285 | } | 281 | } |
286 | EXPORT_SYMBOL(cpu_down); | 282 | EXPORT_SYMBOL(cpu_down); |
@@ -361,9 +357,6 @@ int disable_nonboot_cpus(void) | |||
361 | { | 357 | { |
362 | int cpu, first_cpu, error; | 358 | int cpu, first_cpu, error; |
363 | 359 | ||
364 | error = stop_machine_create(); | ||
365 | if (error) | ||
366 | return error; | ||
367 | cpu_maps_update_begin(); | 360 | cpu_maps_update_begin(); |
368 | first_cpu = cpumask_first(cpu_online_mask); | 361 | first_cpu = cpumask_first(cpu_online_mask); |
369 | /* | 362 | /* |
@@ -394,7 +387,6 @@ int disable_nonboot_cpus(void) | |||
394 | printk(KERN_ERR "Non-boot CPUs are not disabled\n"); | 387 | printk(KERN_ERR "Non-boot CPUs are not disabled\n"); |
395 | } | 388 | } |
396 | cpu_maps_update_done(); | 389 | cpu_maps_update_done(); |
397 | stop_machine_destroy(); | ||
398 | return error; | 390 | return error; |
399 | } | 391 | } |
400 | 392 | ||