Skip to content

Commit

Permalink
x86, numa: Fix cpu nodemasks for NUMA emulation and CONFIG_DEBUG_PER_…
Browse files Browse the repository at this point in the history
…CPU_MAPS

The cpu<->node mappings under CONFIG_DEBUG_PER_CPU_MAPS=y
when NUMA emulation is enabled is currently broken because it does
not iterate through every emulated node and bind cpus that have
affinity to it.

NUMA emulation should bind each cpu to every local node to
accurately represent the true NUMA topology of the underlying
machine.

debug_cpumask_set_cpu() needs to be fixed at the same time so
that the debugging information that it emits shows the new
cpumask of the node being assigned when the cpu is being added
or removed.

It can now take responsibility of setting or clearing the cpu
itself to remove the need for duplicate code.

Also change its last parameter, "enable", to have the correct bool
type since it can only be true or false.

 -v2: Fix the return statements, by Kosaki Motohiro

Acked-and-Tested-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: David Rientjes <rientjes@google.com>
Cc: Andreas Herrmann <herrmann.der.user@googlemail.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/alpine.DEB.2.00.1104201918470.12634@chino.kir.corp.google.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
David Rientjes authored and Ingo Molnar committed Apr 21, 2011
1 parent 37f8527 commit 7a6c654
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 33 deletions.
2 changes: 1 addition & 1 deletion arch/x86/include/asm/numa.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ static inline void numa_remove_cpu(int cpu) { }
#endif /* CONFIG_NUMA */

#ifdef CONFIG_DEBUG_PER_CPU_MAPS
struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable);
void debug_cpumask_set_cpu(int cpu, int node, bool enable);
#endif

#endif /* _ASM_X86_NUMA_H */
31 changes: 13 additions & 18 deletions arch/x86/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,53 +213,48 @@ int early_cpu_to_node(int cpu)
return per_cpu(x86_cpu_to_node_map, cpu);
}

struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable)
void debug_cpumask_set_cpu(int cpu, int node, bool enable)
{
int node = early_cpu_to_node(cpu);
struct cpumask *mask;
char buf[64];

if (node == NUMA_NO_NODE) {
/* early_cpu_to_node() already emits a warning and trace */
return NULL;
return;
}
mask = node_to_cpumask_map[node];
if (!mask) {
pr_err("node_to_cpumask_map[%i] NULL\n", node);
dump_stack();
return NULL;
return;
}

if (enable)
cpumask_set_cpu(cpu, mask);
else
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);
return mask;
return;
}

# ifndef CONFIG_NUMA_EMU
static void __cpuinit numa_set_cpumask(int cpu, int enable)
static void __cpuinit numa_set_cpumask(int cpu, bool 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);
debug_cpumask_set_cpu(cpu, early_cpu_to_node(cpu), enable);
}

void __cpuinit numa_add_cpu(int cpu)
{
numa_set_cpumask(cpu, 1);
numa_set_cpumask(cpu, true);
}

void __cpuinit numa_remove_cpu(int cpu)
{
numa_set_cpumask(cpu, 0);
numa_set_cpumask(cpu, false);
}
# endif /* !CONFIG_NUMA_EMU */

Expand Down
20 changes: 6 additions & 14 deletions arch/x86/mm/numa_emulation.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,10 +454,9 @@ void __cpuinit numa_remove_cpu(int cpu)
cpumask_clear_cpu(cpu, node_to_cpumask_map[i]);
}
#else /* !CONFIG_DEBUG_PER_CPU_MAPS */
static void __cpuinit numa_set_cpumask(int cpu, int enable)
static void __cpuinit numa_set_cpumask(int cpu, bool enable)
{
struct cpumask *mask;
int nid, physnid, i;
int nid, physnid;

nid = early_cpu_to_node(cpu);
if (nid == NUMA_NO_NODE) {
Expand All @@ -467,28 +466,21 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)

physnid = emu_nid_to_phys[nid];

for_each_online_node(i) {
for_each_online_node(nid) {
if (emu_nid_to_phys[nid] != physnid)
continue;

mask = debug_cpumask_set_cpu(cpu, enable);
if (!mask)
return;

if (enable)
cpumask_set_cpu(cpu, mask);
else
cpumask_clear_cpu(cpu, mask);
debug_cpumask_set_cpu(cpu, nid, enable);
}
}

void __cpuinit numa_add_cpu(int cpu)
{
numa_set_cpumask(cpu, 1);
numa_set_cpumask(cpu, true);
}

void __cpuinit numa_remove_cpu(int cpu)
{
numa_set_cpumask(cpu, 0);
numa_set_cpumask(cpu, false);
}
#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */

0 comments on commit 7a6c654

Please sign in to comment.