Commit d20dc4d5 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-fixes-for-linus' of...

Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, numa: Fix cpu nodemasks for NUMA emulation and CONFIG_DEBUG_PER_CPU_MAPS
  Revert "x86, NUMA: Fix fakenuma boot failure"
parents d76c8420 7a6c6547
...@@ -51,7 +51,7 @@ static inline void numa_remove_cpu(int cpu) { } ...@@ -51,7 +51,7 @@ static inline void numa_remove_cpu(int cpu) { }
#endif /* CONFIG_NUMA */ #endif /* CONFIG_NUMA */
#ifdef CONFIG_DEBUG_PER_CPU_MAPS #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
#endif /* _ASM_X86_NUMA_H */ #endif /* _ASM_X86_NUMA_H */
...@@ -312,26 +312,6 @@ void __cpuinit smp_store_cpu_info(int id) ...@@ -312,26 +312,6 @@ void __cpuinit smp_store_cpu_info(int id)
identify_secondary_cpu(c); identify_secondary_cpu(c);
} }
static void __cpuinit check_cpu_siblings_on_same_node(int cpu1, int cpu2)
{
int node1 = early_cpu_to_node(cpu1);
int node2 = early_cpu_to_node(cpu2);
/*
* Our CPU scheduler assumes all logical cpus in the same physical cpu
* share the same node. But, buggy ACPI or NUMA emulation might assign
* them to different node. Fix it.
*/
if (node1 != node2) {
pr_warning("CPU %d in node %d and CPU %d in node %d are in the same physical CPU. forcing same node %d\n",
cpu1, node1, cpu2, node2, node2);
numa_remove_cpu(cpu1);
numa_set_node(cpu1, node2);
numa_add_cpu(cpu1);
}
}
static void __cpuinit link_thread_siblings(int cpu1, int cpu2) static void __cpuinit link_thread_siblings(int cpu1, int cpu2)
{ {
cpumask_set_cpu(cpu1, cpu_sibling_mask(cpu2)); cpumask_set_cpu(cpu1, cpu_sibling_mask(cpu2));
...@@ -340,7 +320,6 @@ static void __cpuinit link_thread_siblings(int cpu1, int cpu2) ...@@ -340,7 +320,6 @@ static void __cpuinit link_thread_siblings(int cpu1, int cpu2)
cpumask_set_cpu(cpu2, cpu_core_mask(cpu1)); cpumask_set_cpu(cpu2, cpu_core_mask(cpu1));
cpumask_set_cpu(cpu1, cpu_llc_shared_mask(cpu2)); cpumask_set_cpu(cpu1, cpu_llc_shared_mask(cpu2));
cpumask_set_cpu(cpu2, cpu_llc_shared_mask(cpu1)); cpumask_set_cpu(cpu2, cpu_llc_shared_mask(cpu1));
check_cpu_siblings_on_same_node(cpu1, cpu2);
} }
...@@ -382,12 +361,10 @@ void __cpuinit set_cpu_sibling_map(int cpu) ...@@ -382,12 +361,10 @@ void __cpuinit set_cpu_sibling_map(int cpu)
per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) { per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) {
cpumask_set_cpu(i, cpu_llc_shared_mask(cpu)); cpumask_set_cpu(i, cpu_llc_shared_mask(cpu));
cpumask_set_cpu(cpu, cpu_llc_shared_mask(i)); cpumask_set_cpu(cpu, cpu_llc_shared_mask(i));
check_cpu_siblings_on_same_node(cpu, i);
} }
if (c->phys_proc_id == cpu_data(i).phys_proc_id) { if (c->phys_proc_id == cpu_data(i).phys_proc_id) {
cpumask_set_cpu(i, cpu_core_mask(cpu)); cpumask_set_cpu(i, cpu_core_mask(cpu));
cpumask_set_cpu(cpu, cpu_core_mask(i)); cpumask_set_cpu(cpu, cpu_core_mask(i));
check_cpu_siblings_on_same_node(cpu, i);
/* /*
* Does this new cpu bringup a new core? * Does this new cpu bringup a new core?
*/ */
......
...@@ -213,53 +213,48 @@ int early_cpu_to_node(int cpu) ...@@ -213,53 +213,48 @@ int early_cpu_to_node(int cpu)
return per_cpu(x86_cpu_to_node_map, 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; struct cpumask *mask;
char buf[64]; char buf[64];
if (node == NUMA_NO_NODE) { if (node == NUMA_NO_NODE) {
/* early_cpu_to_node() already emits a warning and trace */ /* early_cpu_to_node() already emits a warning and trace */
return NULL; return;
} }
mask = node_to_cpumask_map[node]; mask = node_to_cpumask_map[node];
if (!mask) { if (!mask) {
pr_err("node_to_cpumask_map[%i] NULL\n", node); pr_err("node_to_cpumask_map[%i] NULL\n", node);
dump_stack(); dump_stack();
return NULL; return;
} }
if (enable)
cpumask_set_cpu(cpu, mask);
else
cpumask_clear_cpu(cpu, mask);
cpulist_scnprintf(buf, sizeof(buf), mask); cpulist_scnprintf(buf, sizeof(buf), mask);
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n", printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
enable ? "numa_add_cpu" : "numa_remove_cpu", enable ? "numa_add_cpu" : "numa_remove_cpu",
cpu, node, buf); cpu, node, buf);
return mask; return;
} }
# ifndef CONFIG_NUMA_EMU # 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; debug_cpumask_set_cpu(cpu, early_cpu_to_node(cpu), enable);
mask = debug_cpumask_set_cpu(cpu, enable);
if (!mask)
return;
if (enable)
cpumask_set_cpu(cpu, mask);
else
cpumask_clear_cpu(cpu, mask);
} }
void __cpuinit numa_add_cpu(int cpu) void __cpuinit numa_add_cpu(int cpu)
{ {
numa_set_cpumask(cpu, 1); numa_set_cpumask(cpu, true);
} }
void __cpuinit numa_remove_cpu(int cpu) void __cpuinit numa_remove_cpu(int cpu)
{ {
numa_set_cpumask(cpu, 0); numa_set_cpumask(cpu, false);
} }
# endif /* !CONFIG_NUMA_EMU */ # endif /* !CONFIG_NUMA_EMU */
......
...@@ -454,10 +454,9 @@ void __cpuinit numa_remove_cpu(int cpu) ...@@ -454,10 +454,9 @@ void __cpuinit numa_remove_cpu(int cpu)
cpumask_clear_cpu(cpu, node_to_cpumask_map[i]); cpumask_clear_cpu(cpu, node_to_cpumask_map[i]);
} }
#else /* !CONFIG_DEBUG_PER_CPU_MAPS */ #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;
int nid, physnid, i;
nid = early_cpu_to_node(cpu); nid = early_cpu_to_node(cpu);
if (nid == NUMA_NO_NODE) { if (nid == NUMA_NO_NODE) {
...@@ -467,28 +466,21 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable) ...@@ -467,28 +466,21 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)
physnid = emu_nid_to_phys[nid]; physnid = emu_nid_to_phys[nid];
for_each_online_node(i) { for_each_online_node(nid) {
if (emu_nid_to_phys[nid] != physnid) if (emu_nid_to_phys[nid] != physnid)
continue; continue;
mask = debug_cpumask_set_cpu(cpu, enable); debug_cpumask_set_cpu(cpu, nid, enable);
if (!mask)
return;
if (enable)
cpumask_set_cpu(cpu, mask);
else
cpumask_clear_cpu(cpu, mask);
} }
} }
void __cpuinit numa_add_cpu(int cpu) void __cpuinit numa_add_cpu(int cpu)
{ {
numa_set_cpumask(cpu, 1); numa_set_cpumask(cpu, true);
} }
void __cpuinit numa_remove_cpu(int cpu) void __cpuinit numa_remove_cpu(int cpu)
{ {
numa_set_cpumask(cpu, 0); numa_set_cpumask(cpu, false);
} }
#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
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