cpumask: smp_call_function_many()
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 29 Dec 2008 22:35:16 +0000 (09:05 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 29 Dec 2008 22:35:16 +0000 (09:05 +1030)
commit54b11e6d57a10aa9d0009efd93873e17bffd5d30
treeac09296e7b0726aa6143913526f8983fae1cb497
parent3fa41520696fec2815e2d88fbcccdda77ba4d693
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
include/linux/smp.h
kernel/smp.c