aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-05-06 12:49:20 -0400
committerTejun Heo <tj@kernel.org>2010-05-06 12:49:20 -0400
commit3fc1f1e27a5b807791d72e5d992aa33b668a6626 (patch)
tree396c2f49909c506c3ad53fd6a9bdddf6c24f7860 /include/linux
parent1142d810298e694754498dbb4983fcb6cb7fd884 (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 'include/linux')
-rw-r--r--include/linux/stop_machine.h20
1 files changed, 0 insertions, 20 deletions
diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h
index efcbd6c37947..0e552e72a4c4 100644
--- a/include/linux/stop_machine.h
+++ b/include/linux/stop_machine.h
@@ -67,23 +67,6 @@ int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus);
67 */ 67 */
68int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); 68int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus);
69 69
70/**
71 * stop_machine_create: create all stop_machine threads
72 *
73 * Description: This causes all stop_machine threads to be created before
74 * stop_machine actually gets called. This can be used by subsystems that
75 * need a non failing stop_machine infrastructure.
76 */
77int stop_machine_create(void);
78
79/**
80 * stop_machine_destroy: destroy all stop_machine threads
81 *
82 * Description: This causes all stop_machine threads which were created with
83 * stop_machine_create to be destroyed again.
84 */
85void stop_machine_destroy(void);
86
87#else 70#else
88 71
89static inline int stop_machine(int (*fn)(void *), void *data, 72static inline int stop_machine(int (*fn)(void *), void *data,
@@ -96,8 +79,5 @@ static inline int stop_machine(int (*fn)(void *), void *data,
96 return ret; 79 return ret;
97} 80}
98 81
99static inline int stop_machine_create(void) { return 0; }
100static inline void stop_machine_destroy(void) { }
101
102#endif /* CONFIG_SMP */ 82#endif /* CONFIG_SMP */
103#endif /* _LINUX_STOP_MACHINE */ 83#endif /* _LINUX_STOP_MACHINE */