aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/stop_machine.h
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2008-07-28 13:16:30 -0400
committerRusty Russell <rusty@rustcorp.com.au>2008-07-27 22:16:30 -0400
commiteeec4fad963490821348a331cca6102ae1c4a7a3 (patch)
tree163a7d9414d719fccac096d1ba822416f705b397 /include/linux/stop_machine.h
parent04321587584272f4e8b9818f319f40caf8eeee13 (diff)
stop_machine(): stop_machine_run() changed to use cpu mask
Instead of a "cpu" arg with magic values NR_CPUS (any cpu) and ~0 (all cpus), pass a cpumask_t. Allow NULL for the common case (where we don't care which CPU the function is run on): temporary cpumask_t's are usually considered bad for stack space. This deprecates stop_machine_run, to be removed soon when all the callers are dead. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'include/linux/stop_machine.h')
-rw-r--r--include/linux/stop_machine.h34
1 files changed, 24 insertions, 10 deletions
diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h
index 36c2c7284eb3..f1cb0ba6d715 100644
--- a/include/linux/stop_machine.h
+++ b/include/linux/stop_machine.h
@@ -5,19 +5,19 @@
5 (and more). So the "read" side to such a lock is anything which 5 (and more). So the "read" side to such a lock is anything which
6 diables preeempt. */ 6 diables preeempt. */
7#include <linux/cpu.h> 7#include <linux/cpu.h>
8#include <linux/cpumask.h>
8#include <asm/system.h> 9#include <asm/system.h>
9 10
10#if defined(CONFIG_STOP_MACHINE) && defined(CONFIG_SMP) 11#if defined(CONFIG_STOP_MACHINE) && defined(CONFIG_SMP)
11 12
13/* Deprecated, but useful for transition. */
12#define ALL_CPUS ~0U 14#define ALL_CPUS ~0U
13 15
14/** 16/**
15 * stop_machine_run: freeze the machine on all CPUs and run this function 17 * stop_machine: freeze the machine on all CPUs and run this function
16 * @fn: the function to run 18 * @fn: the function to run
17 * @data: the data ptr for the @fn() 19 * @data: the data ptr for the @fn()
18 * @cpu: if @cpu == n, run @fn() on cpu n 20 * @cpus: the cpus to run the @fn() on (NULL = any online cpu)
19 * if @cpu == NR_CPUS, run @fn() on any cpu
20 * if @cpu == ALL_CPUS, run @fn() on every online CPU.
21 * 21 *
22 * Description: This causes a thread to be scheduled on every cpu, 22 * Description: This causes a thread to be scheduled on every cpu,
23 * each of which disables interrupts. The result is that noone is 23 * each of which disables interrupts. The result is that noone is
@@ -26,22 +26,22 @@
26 * 26 *
27 * This can be thought of as a very heavy write lock, equivalent to 27 * This can be thought of as a very heavy write lock, equivalent to
28 * grabbing every spinlock in the kernel. */ 28 * grabbing every spinlock in the kernel. */
29int stop_machine_run(int (*fn)(void *), void *data, unsigned int cpu); 29int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus);
30 30
31/** 31/**
32 * __stop_machine_run: freeze the machine on all CPUs and run this function 32 * __stop_machine: freeze the machine on all CPUs and run this function
33 * @fn: the function to run 33 * @fn: the function to run
34 * @data: the data ptr for the @fn 34 * @data: the data ptr for the @fn
35 * @cpu: the cpu to run @fn on (or any, if @cpu == NR_CPUS. 35 * @cpus: the cpus to run the @fn() on (NULL = any online cpu)
36 * 36 *
37 * Description: This is a special version of the above, which assumes cpus 37 * Description: This is a special version of the above, which assumes cpus
38 * won't come or go while it's being called. Used by hotplug cpu. 38 * won't come or go while it's being called. Used by hotplug cpu.
39 */ 39 */
40int __stop_machine_run(int (*fn)(void *), void *data, unsigned int cpu); 40int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus);
41#else 41#else
42 42
43static inline int stop_machine_run(int (*fn)(void *), void *data, 43static inline int stop_machine(int (*fn)(void *), void *data,
44 unsigned int cpu) 44 const cpumask_t *cpus)
45{ 45{
46 int ret; 46 int ret;
47 local_irq_disable(); 47 local_irq_disable();
@@ -50,4 +50,18 @@ static inline int stop_machine_run(int (*fn)(void *), void *data,
50 return ret; 50 return ret;
51} 51}
52#endif /* CONFIG_SMP */ 52#endif /* CONFIG_SMP */
53
54static inline int __deprecated stop_machine_run(int (*fn)(void *), void *data,
55 unsigned int cpu)
56{
57 /* If they don't care which cpu fn runs on, just pick one. */
58 if (cpu == NR_CPUS)
59 return stop_machine(fn, data, NULL);
60 else if (cpu == ~0U)
61 return stop_machine(fn, data, &cpu_possible_map);
62 else {
63 cpumask_t cpus = cpumask_of_cpu(cpu);
64 return stop_machine(fn, data, &cpus);
65 }
66}
53#endif /* _LINUX_STOP_MACHINE */ 67#endif /* _LINUX_STOP_MACHINE */