Re: linux-next: Tree for June 5

Mike Travis
2008-06-06T15:53:00Z

Ingo Molnar wrote:
> * Vegard Nossum <vegard.nossum@gmail.com> wrote:
>
>>>> AFAICS this is not yet required for v2.6.26, as the requirement to
>>>> never iterate to MAX_NUMNODES and call nr_cpus_node() with the
>>>> index only got introduced by Mike's patch.
>>> the one below is needed as well i think.
>> Yeah. I think you had better take Mike's patches, I don't trust even
>> that my patch and your fixlet does everything correctly.
>
> yep, just discovered that we had them already ;-)
>
> Thomas has just scripted up a new "detect if a commit is not in
> linux-next yet" script that should avoid such problems in the future.
>
> your second patch is still wanted, it would have detected the problem
> earlier.
>
> Ingo

Thanks, yes, I agree. However I would like to modify it slightly:
---
Subject: [PATCH 1/1] x86: Add check for node passed to node_to_cpumask

* When CONFIG_DEBUG_PER_CPU_MAPS is set, the node passed to
node_to_cpumask and node_to_cpumask_ptr should be validated.

Signed-off-by: Mike Travis <travis@sgi.com>
---
arch/x86/kernel/setup.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)

--- linux-2.6.tip.orig/arch/x86/kernel/setup.c
+++ linux-2.6.tip/arch/x86/kernel/setup.c
@@ -399,6 +399,10 @@ int early_cpu_to_node(int cpu)
return per_cpu(x86_cpu_to_node_map, cpu);
}

+
+/* empty cpumask */
+static cpumask_t cpu_mask_none;
+
/*
* Returns a pointer to the bitmask of CPUs on Node 'node'.
*/
@@ -411,6 +415,13 @@ cpumask_t *_node_to_cpumask_ptr(int node
dump_stack();
return &cpu_online_map;
}
+ if (node >= nr_node_ids) {
+ printk(KERN_WARNING
+ "_node_to_cpumask_ptr(%d): node > nr_node_ids(%d)\n",
+ node, nr_node_ids);
+ dump_stack();
+ return &cpu_mask_none;
+ }
return &node_to_cpumask_map[node];
}
EXPORT_SYMBOL(_node_to_cpumask_ptr);
@@ -426,6 +437,13 @@ cpumask_t node_to_cpumask(int node)
dump_stack();
return cpu_online_map;
}
+ if (node >= nr_node_ids) {
+ printk(KERN_WARNING
+ "node_to_cpumask(%d): node > nr_node_ids(%d)\n",
+ node, nr_node_ids);
+ dump_stack();
+ return cpu_mask_none;
+ }
return node_to_cpumask_map[node];
}
EXPORT_SYMBOL(node_to_cpumask);