diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-29 17:35:16 -0500 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-29 17:35:16 -0500 |
commit | 54b11e6d57a10aa9d0009efd93873e17bffd5d30 (patch) | |
tree | ac09296e7b0726aa6143913526f8983fae1cb497 /include | |
parent | 3fa41520696fec2815e2d88fbcccdda77ba4d693 (diff) |
cpumask: smp_call_function_many()
Impact: Implementation change to remove cpumask_t from stack.
Actually change smp_call_function_mask() to smp_call_function_many().
We avoid cpumasks on the stack in this version.
(S390 has its own version, but that's going away apparently).
We have to do some dancing to figure out if 0 or 1 other cpus are in
the mask supplied and the online mask without allocating a tmp
cpumask. It's still fairly cheap.
We allocate the cpumask at the end of the call_function_data
structure: if allocation fails we fallback to smp_call_function_single
rather than using the baroque quiescing code (which needs a cpumask on
stack).
(Thanks to Hiroshi Shimamoto for spotting several bugs in previous versions!)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Mike Travis <travis@sgi.com>
Cc: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Cc: npiggin@suse.de
Cc: axboe@kernel.dk
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/smp.h | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/include/linux/smp.h b/include/linux/smp.h index 2f85f3b04bc4..b82466968101 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
@@ -67,15 +67,16 @@ extern void smp_cpus_done(unsigned int max_cpus); | |||
67 | * Call a function on all other processors | 67 | * Call a function on all other processors |
68 | */ | 68 | */ |
69 | int smp_call_function(void(*func)(void *info), void *info, int wait); | 69 | int smp_call_function(void(*func)(void *info), void *info, int wait); |
70 | /* Deprecated: use smp_call_function_many() which uses a cpumask ptr. */ | 70 | void smp_call_function_many(const struct cpumask *mask, |
71 | int smp_call_function_mask(cpumask_t mask, void(*func)(void *info), void *info, | 71 | void (*func)(void *info), void *info, bool wait); |
72 | int wait); | ||
73 | 72 | ||
74 | static inline void smp_call_function_many(const struct cpumask *mask, | 73 | /* Deprecated: Use smp_call_function_many which takes a pointer to the mask. */ |
75 | void (*func)(void *info), void *info, | 74 | static inline int |
76 | int wait) | 75 | smp_call_function_mask(cpumask_t mask, void(*func)(void *info), void *info, |
76 | int wait) | ||
77 | { | 77 | { |
78 | smp_call_function_mask(*mask, func, info, wait); | 78 | smp_call_function_many(&mask, func, info, wait); |
79 | return 0; | ||
79 | } | 80 | } |
80 | 81 | ||
81 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, | 82 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, |