Commit d906f0eb authored by David Rientjes's avatar David Rientjes Committed by Ingo Molnar

x86, numa: Fix CONFIG_DEBUG_PER_CPU_MAPS without NUMA emulation

"x86, numa: Fake node-to-cpumask for NUMA emulation" broke the
build when CONFIG_DEBUG_PER_CPU_MAPS is set and CONFIG_NUMA_EMU
is not.  This is because it is possible to map a cpu to multiple
nodes when NUMA emulation is used; the patch required a physical
node address table to find those nodes that was only available
when CONFIG_NUMA_EMU was enabled.

This extracts the common debug functionality to its own function
for CONFIG_DEBUG_PER_CPU_MAPS and uses it regardless of whether
CONFIG_NUMA_EMU is set or not.

NUMA emulation will now iterate over the set of possible nodes
for each cpu and call the new debug function whereas only the
cpu's node will be used without NUMA emulation enabled.
Reported-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
LKML-Reference: <alpine.DEB.2.00.1012301053590.12995@chino.kir.corp.google.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent d50e8fc7
...@@ -833,15 +833,48 @@ void __cpuinit numa_remove_cpu(int cpu) ...@@ -833,15 +833,48 @@ void __cpuinit numa_remove_cpu(int cpu)
#endif /* !CONFIG_NUMA_EMU */ #endif /* !CONFIG_NUMA_EMU */
#else /* CONFIG_DEBUG_PER_CPU_MAPS */ #else /* CONFIG_DEBUG_PER_CPU_MAPS */
static struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable)
{
int node = early_cpu_to_node(cpu);
struct cpumask *mask;
char buf[64];
mask = node_to_cpumask_map[node];
if (!mask) {
pr_err("node_to_cpumask_map[%i] NULL\n", node);
dump_stack();
return NULL;
}
cpulist_scnprintf(buf, sizeof(buf), mask);
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
enable ? "numa_add_cpu" : "numa_remove_cpu",
cpu, node, buf);
return mask;
}
/* /*
* --------- debug versions of the numa functions --------- * --------- debug versions of the numa functions ---------
*/ */
#ifndef CONFIG_NUMA_EMU
static void __cpuinit numa_set_cpumask(int cpu, int enable)
{
struct cpumask *mask;
mask = debug_cpumask_set_cpu(cpu, enable);
if (!mask)
return;
if (enable)
cpumask_set_cpu(cpu, mask);
else
cpumask_clear_cpu(cpu, mask);
}
#else
static void __cpuinit numa_set_cpumask(int cpu, int enable) static void __cpuinit numa_set_cpumask(int cpu, int enable)
{ {
int node = early_cpu_to_node(cpu); int node = early_cpu_to_node(cpu);
struct cpumask *mask; struct cpumask *mask;
char buf[64];
int i; int i;
for_each_online_node(i) { for_each_online_node(i) {
...@@ -851,24 +884,17 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable) ...@@ -851,24 +884,17 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)
if (addr < physnodes[node].start || if (addr < physnodes[node].start ||
addr >= physnodes[node].end) addr >= physnodes[node].end)
continue; continue;
mask = node_to_cpumask_map[node]; mask = debug_cpumask_set_cpu(cpu, enable);
if (mask == NULL) { if (!mask)
pr_err("node_to_cpumask_map[%i] NULL\n", i);
dump_stack();
return; return;
}
if (enable) if (enable)
cpumask_set_cpu(cpu, mask); cpumask_set_cpu(cpu, mask);
else else
cpumask_clear_cpu(cpu, mask); cpumask_clear_cpu(cpu, mask);
cpulist_scnprintf(buf, sizeof(buf), mask);
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
enable ? "numa_add_cpu" : "numa_remove_cpu",
cpu, node, buf);
} }
} }
#endif /* CONFIG_NUMA_EMU */
void __cpuinit numa_add_cpu(int cpu) void __cpuinit numa_add_cpu(int cpu)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment