diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-31 18:42:30 -0500 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-31 18:42:30 -0500 |
commit | 2a53008033189ed09bfe241c6b33811ba4ce980d (patch) | |
tree | 86dcdacdd7fbaf671f2487b7a05352aa672fecc1 /lib/cpumask.c | |
parent | 5db0e1e9e0f30f160b832a0b5cd1131954bf4f6e (diff) |
cpumask: zero extra bits in alloc_cpumask_var_node
Impact: extra safety checks during transition
When CONFIG_CPUMASKS_OFFSTACK is set, the new cpumask_ operators only
use bits up to nr_cpu_ids, not NR_CPUS. Using the old cpus_ operators
on these masks can mean accessing undefined bits.
After some discussion, Mike and I decided to err on the side of caution;
we zero the "undefined" bits in alloc_cpumask_var_node() until all the
old cpumask functions are removed.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'lib/cpumask.c')
-rw-r--r-- | lib/cpumask.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/cpumask.c b/lib/cpumask.c index 8e1496cb63f7..3389e2440da0 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c | |||
@@ -107,6 +107,14 @@ bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node) | |||
107 | dump_stack(); | 107 | dump_stack(); |
108 | } | 108 | } |
109 | #endif | 109 | #endif |
110 | /* FIXME: Bandaid to save us from old primitives which go to NR_CPUS. */ | ||
111 | if (*mask) { | ||
112 | unsigned int tail; | ||
113 | tail = BITS_TO_LONGS(NR_CPUS - nr_cpumask_bits) * sizeof(long); | ||
114 | memset(cpumask_bits(*mask) + cpumask_size() - tail, | ||
115 | 0, tail); | ||
116 | } | ||
117 | |||
110 | return *mask != NULL; | 118 | return *mask != NULL; |
111 | } | 119 | } |
112 | EXPORT_SYMBOL(alloc_cpumask_var_node); | 120 | EXPORT_SYMBOL(alloc_cpumask_var_node); |