cpumask: zero extra bits in alloc_cpumask_var_node
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Dec 2008 23:42:30 +0000 (10:12 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Dec 2008 23:42:30 +0000 (10:12 +1030)
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>
lib/cpumask.c

index 8e1496cb63f7a1e84b09a540186192ca6c479d85..3389e2440da0f30a76d49ab63f3419bce857849b 100644 (file)
@@ -107,6 +107,14 @@ bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node)
                dump_stack();
        }
 #endif
+       /* FIXME: Bandaid to save us from old primitives which go to NR_CPUS. */
+       if (*mask) {
+               unsigned int tail;
+               tail = BITS_TO_LONGS(NR_CPUS - nr_cpumask_bits) * sizeof(long);
+               memset(cpumask_bits(*mask) + cpumask_size() - tail,
+                      0, tail);
+       }
+
        return *mask != NULL;
 }
 EXPORT_SYMBOL(alloc_cpumask_var_node);