aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel/smpboot.c
diff options
context:
space:
mode:
authorkeith mannthey <kmannth@us.ibm.com>2006-09-29 04:58:46 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-29 12:18:03 -0400
commit3b08606dc2991bcdab14139efd9ed9d492f5f901 (patch)
treec225c9fc5a7b3cdfe516c4279f77e40068396162 /arch/i386/kernel/smpboot.c
parent3528a95322b5c1ce882ab723f175a1845430cd89 (diff)
[PATCH] convert i386 Summit subarch to use SRAT info for apicid_to_node calls
Convert the i386 summit subarch apicid_to_node to use node information provided by the SRAT. It was discussed a little on LKML a few weeks ago and was seen as an acceptable fix. The current way of obtaining the nodeid static inline int apicid_to_node(int logical_apicid) { return logical_apicid >> 5; } is just not correct for all summit systems/bios. Assuming the apicid matches the Linux node number require a leap of faith that the bios mapped out the apicids a set way. Modern summit HW (IBM x460) does not layout its bios in the manner for various reasons and is unable to boot i386 numa. The best way to get the correct apicid to node information is from the SRAT table during boot. It lays out what apicid belongs to what node. I use this information to create a table for use at run time. Signed-off-by: Keith Mannthey <kmannth@us.ibm.com> Cc: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel/smpboot.c')
-rw-r--r--arch/i386/kernel/smpboot.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
index 020d873b7d21..82b26d5ce476 100644
--- a/arch/i386/kernel/smpboot.c
+++ b/arch/i386/kernel/smpboot.c
@@ -102,6 +102,8 @@ u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
102 { [0 ... NR_CPUS-1] = 0xff }; 102 { [0 ... NR_CPUS-1] = 0xff };
103EXPORT_SYMBOL(x86_cpu_to_apicid); 103EXPORT_SYMBOL(x86_cpu_to_apicid);
104 104
105u8 apicid_2_node[MAX_APICID];
106
105/* 107/*
106 * Trampoline 80x86 program as an array. 108 * Trampoline 80x86 program as an array.
107 */ 109 */
@@ -645,7 +647,7 @@ static void map_cpu_to_logical_apicid(void)
645{ 647{
646 int cpu = smp_processor_id(); 648 int cpu = smp_processor_id();
647 int apicid = logical_smp_processor_id(); 649 int apicid = logical_smp_processor_id();
648 int node = apicid_to_node(apicid); 650 int node = apicid_to_node(hard_smp_processor_id());
649 651
650 if (!node_online(node)) 652 if (!node_online(node))
651 node = first_online_node; 653 node = first_online_node;
@@ -954,6 +956,7 @@ static int __devinit do_boot_cpu(int apicid, int cpu)
954 956
955 irq_ctx_init(cpu); 957 irq_ctx_init(cpu);
956 958
959 x86_cpu_to_apicid[cpu] = apicid;
957 /* 960 /*
958 * This grunge runs the startup process for 961 * This grunge runs the startup process for
959 * the targeted processor. 962 * the targeted processor.