Commit 4bf5cb5e authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] x86-64: sibling map fix for clustered mode

From: James Cleverdon

The value that cpuinfo returns for command 1 in ebx is the physical APIC ID
latched when the system comes out of reset.

Ordinarily, this is identical to the value in the local APIC's ID register,
because nearly all BIOSes accept the HW assigned value.

Our systems, made up of individual building blocks, can't do that.  Each
node boots as a separate system and is joined together by the BIOS.  Thus,
the BIOS rewrites the local APIC ID register with a new value.

Potomac and Nocona chips have a mechanism by which the BIOS writer can
change bits 7:5 to match the assigned cluster ID.  Bits 2:0 come from the
thread ID.  However, bits 4:3 are still those latched at reset.  Oops!

Summary: Large clustered systems can't use cpuid to derive the sibling
information.

Fix: Use the local APIC ID.  That's the value we use to online the CPUs, so
it had better be OK.  For non-clustered systems, cpuid == local APIC, so
nothing but large boxes should be affected.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f867a594
...@@ -745,7 +745,7 @@ static void __init detect_ht(struct cpuinfo_x86 *c) ...@@ -745,7 +745,7 @@ static void __init detect_ht(struct cpuinfo_x86 *c)
} }
if (index_lsb != index_msb ) if (index_lsb != index_msb )
index_msb++; index_msb++;
initial_apic_id = ebx >> 24 & 0xff; initial_apic_id = hard_smp_processor_id();
phys_proc_id[cpu] = initial_apic_id >> index_msb; phys_proc_id[cpu] = initial_apic_id >> index_msb;
printk(KERN_INFO "CPU: Physical Processor ID: %d\n", printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
......
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