x86/numa: Hard partition cpu topology masks on node boundaries
Commit-ID: 0acbb440f06302058e1515861dd534594521e892 Gitweb: http://git.kernel.org/tip/0acbb440f06302058e1515861dd534594521e892 Author: Peter Zijlstra <[email protected]> AuthorDate: Wed, 18 Apr 2012 19:04:09 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 May 2012 13:28:59 +0200
x86/numa: Hard partition cpu topology masks on node boundaries
When using numa=fake= you can get weird topologies where LLCs can span nodes and other such nonsense. Cure this by hard partitioning these masks on node boundaries.
Signed-off-by Peter Zijlstra <[email protected]>
Cc Tejun Heo <[email protected]>
Cc Yinghai Lu <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>
--- arch/x86/kernel/smpboot.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
arch/x86/kernel/smpboot.c +11 -0
@@ -337,6 +337,11 @@ void __cpuinit set_cpu_sibling_map(int cpu)for_each_cpu (i, cpu_sibling_setup_mask) {struct cpuinfo_x86 *o = &cpu_data (i); +#ifdef CONFIG_NUMA_EMU +if (cpu_to_node (cpu) !=cpu_to_node (i)) +continue ; +#endif +if (cpu_has (c,X86_FEATURE_TOPOEXT )) { if (c->phys_proc_id == o->phys_proc_id && per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i) &&
@@ -360,11 +365,17 @@ void __cpuinit set_cpu_sibling_map(int cpu) }for_each_cpu (i, cpu_sibling_setup_mask) { +#ifdef CONFIG_NUMA_EMU +if (cpu_to_node (cpu) !=cpu_to_node (i)) +continue ; +#endif +if (per_cpu (cpu_llc_id, cpu) !=BAD_APICID &&per_cpu (cpu_llc_id, cpu) ==per_cpu (cpu_llc_id, i)) {cpumask_set_cpu (i,cpu_llc_shared_mask (cpu));cpumask_set_cpu (cpu,cpu_llc_shared_mask (i)); } +if (c->phys_proc_id ==cpu_data (i).phys_proc_id) {cpumask_set_cpu (i,cpu_core_mask (cpu));cpumask_set_cpu (cpu,cpu_core_mask (i));