stop_machine: reimplement using cpu_stop
authorTejun Heo <tj@kernel.org>
Thu, 6 May 2010 16:49:20 +0000 (18:49 +0200)
committerTejun Heo <tj@kernel.org>
Thu, 6 May 2010 16:49:20 +0000 (18:49 +0200)
commit3fc1f1e27a5b807791d72e5d992aa33b668a6626
tree396c2f49909c506c3ad53fd6a9bdddf6c24f7860
parent1142d810298e694754498dbb4983fcb6cb7fd884
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>
arch/s390/kernel/time.c
drivers/xen/manage.c
include/linux/stop_machine.h
kernel/cpu.c
kernel/module.c
kernel/stop_machine.c