x86: Fix sibling map with NumaChip
PATCH v3 1/1 x86: Fix sibling map with NumaChip
On NumaChip systems, the physical processor ID assignment wasn't accounting for the number of nodes in AMD multi-module processors, giving an incorrect sibling map:
$ cd /sys/devices/system/cpu/cpu29/topology $ grep . * core_id:5 core_siblings:00000000,ff000000 core_siblings_list:24-31 physical_package_id:3 thread_siblings:00000000,30000000 thread_siblings_list:28-29
After fixing:
core_id:5
core_siblings:00000000,ffff0000
core_siblings_list:16-31
physical_package_id:1
thread_siblings:00000000,30000000
thread_siblings_list:28-29
v2: Fix to check for MSR availability before use, as per Boris's feedback
v3: Test against boot cpu features to correct behaviour on larger systems
with global IO
Candidate for stable.
--- arch/x86/kernel/apic/apic_numachip.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
arch/x86/kernel/apic/apic_numachip.c +16 -6
@@ -37,10 +37,12 @@ static const struct apic apic_numachip;static unsigned int get_apic_id (unsigned long x) {unsigned long value; -unsigned int id; +unsigned int id = (x >>24 ) &0xff ; -rdmsrl (MSR_FAM10H_NODE_ID , value); - id = ((x >>24 ) &0xffU ) | ((value <<2 ) &0xff00U ); +if (boot_cpu_has (X86_FEATURE_NODEID_MSR )) { +rdmsrl (MSR_FAM10H_NODE_ID , value); + id |= (value <<2 ) &0xff00 ; + }return id; }
@@ -155,10 +157,18 @@ static int __init numachip_probe(void)static void fixup_cpu_id (struct cpuinfo_x86 *c,int node) { -if (c->phys_proc_id != node) { - c->phys_proc_id = node; -per_cpu (cpu_llc_id,smp_processor_id ()) = node; +u64 val; +u32 nodes =1 ; + +this_cpu_write (cpu_llc_id, node); + +/* Account for nodes per socket in multi-core-module processors */ +if (cpu_has (c,X86_FEATURE_NODEID_MSR )) { +rdmsrl (MSR_FAM10H_NODE_ID , val); + nodes = ((val >>3 ) &7 ) +1 ; } + + c->phys_proc_id = node / nodes; }static int __init numachip_system_init (void )
Signature · 1 line
1.9.1
arch/x86/kernel/apic/apic_numachip.c static const struct apic apic_numachip; · line 42
Quoted 4 lines · Daniel J Blueman
v3: Test against boot cpu features to correct behaviour on larger systems
with global IOarch/x86/kernel/apic/apic_numachip.c +1
-0+if (boot_cpu_has (X86_FEATURE_NODEID_MSR )) {
Hm, so why doesn't this_cpu_has() work? Supposedly such flags ought to be symmetric on all CPUs in the system?
Thanks,
Ingo
Borislav Petkov
maintainerQuoted 2 lines · Ingo Molnar
Hm, so why doesn't
this_cpu_has()work? Supposedly such flags ought to be symmetric on all CPUs in the system?
Actually, static_cpu_has_safe() should be the fastest and the safest to use in all cases.
Signature · 5 lines
Regards/Gruss,
Boris.
ECO tip #101: Trim your mails when you reply.
--