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 /include/linux | |
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 'include/linux')
-rw-r--r-- | include/linux/stop_machine.h | 20 |
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 | */ |
68 | int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); | 68 | int __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 | */ | ||
77 | int 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 | */ | ||
85 | void stop_machine_destroy(void); | ||
86 | |||
87 | #else | 70 | #else |
88 | 71 | ||
89 | static inline int stop_machine(int (*fn)(void *), void *data, | 72 | static 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 | ||
99 | static inline int stop_machine_create(void) { return 0; } | ||
100 | static 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 */ |