aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRavikiran G Thirumalai <kiran@scalemp.com>2006-03-25 10:30:04 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-25 12:10:54 -0500
commit60c1bc82d9d42486e2b96de668b0b49fadaffd12 (patch)
tree4dc840d3ecf007f24012defe1f42911534f568be /arch
parente57113bc1ff591005ec0b0fb4885d97c01de73d8 (diff)
[PATCH] x86_64: to use lapic ids instead of initial apic ids
phys_proc_id[] on AMD boxes is right now populated with the initial apic id, obtained by the cpuid instruction. But, the initial apic id need not be the local apic id on clustered APIC systems (see comment at x86_64/kernel/genapic_cluster.c, line 110). On vSMPowered with AMD CPUs the cpu_to_node will turn out to be incorrect (as apicid_to_node[] is indexed by the initial apic id rather than the local apic id). On vSMPowered boxes with Intel CPUs this is working correctly as phys_proc_id[] is initialized correctly in detect_ht(). This fixes AMD boot path according to specification, to use the correct routines for local apic id and socket ids. We use hard_smp_processor_id() to read the local apic id, and phys_pkg_id() to determine socket id for phys_proc_id[] Patch tested on Tyan multicore boxes as well as vSMPowered boxes. Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org> Signed-off-by: Shai Fultheim <shai@scalex86.org> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/kernel/setup.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index ad3b7fc24a05..49f285871df5 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -846,7 +846,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
846 unsigned bits; 846 unsigned bits;
847#ifdef CONFIG_NUMA 847#ifdef CONFIG_NUMA
848 int node = 0; 848 int node = 0;
849 unsigned apicid = phys_proc_id[cpu]; 849 unsigned apicid = hard_smp_processor_id();
850#endif 850#endif
851 851
852 bits = 0; 852 bits = 0;
@@ -856,7 +856,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
856 /* Low order bits define the core id (index of core in socket) */ 856 /* Low order bits define the core id (index of core in socket) */
857 cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1); 857 cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1);
858 /* Convert the APIC ID into the socket ID */ 858 /* Convert the APIC ID into the socket ID */
859 phys_proc_id[cpu] >>= bits; 859 phys_proc_id[cpu] = phys_pkg_id(bits);
860 860
861#ifdef CONFIG_NUMA 861#ifdef CONFIG_NUMA
862 node = phys_proc_id[cpu]; 862 node = phys_proc_id[cpu];