[PATCH] x86-64: Don't assign CPU numbers in SRAT parsing

Do that later when the CPU boots. SRAT just stores the APIC<->Node
mapping node. This fixes problems on systems where the order
of SRAT entries does not match the MADT.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index 9aec524..976ebcf 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -765,6 +765,7 @@
 	int cpu = smp_processor_id();
 	int node = 0;
 	unsigned bits;
+	unsigned apicid = phys_proc_id[cpu];
 
 	bits = 0;
 	while ((1 << bits) < c->x86_num_cores)
@@ -777,15 +778,19 @@
 
 #ifdef CONFIG_NUMA
 	/* When an ACPI SRAT table is available use the mappings from SRAT
- 	   instead. */
-	if (acpi_numa <= 0) {
-		node = phys_proc_id[cpu];
-		if (!node_online(node))
-			node = first_node(node_online_map);
-		cpu_to_node[cpu] = node;
-	} else {
-		node = cpu_to_node[cpu];
+	   instead. */
+	node = phys_proc_id[cpu];
+	if (acpi_numa > 0) {
+		if (apicid_to_node[apicid] != NUMA_NO_NODE)
+			node = apicid_to_node[apicid];
+		else
+			printk(KERN_ERR
+			       "SRAT: Didn't specify node for CPU %d(%d)\n",
+			       cpu, apicid);
 	}
+	if (!node_online(node))
+		node = first_node(node_online_map);
+	cpu_to_node[cpu] = node;
 #endif
 
 	printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",
diff --git a/arch/x86_64/mm/numa.c b/arch/x86_64/mm/numa.c
index 04f7a33..5b15186 100644
--- a/arch/x86_64/mm/numa.c
+++ b/arch/x86_64/mm/numa.c
@@ -29,6 +29,9 @@
 u8  memnodemap[NODEMAPSIZE];
 
 unsigned char cpu_to_node[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = NUMA_NO_NODE };
+unsigned char apicid_to_node[256] __cpuinitdata = {
+ 	[0 ... NR_CPUS-1] = NUMA_NO_NODE
+};
 cpumask_t     node_to_cpumask[MAX_NUMNODES] __read_mostly;
 
 int numa_off __initdata;
diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c
index 8e3d097..92f6ec7 100644
--- a/arch/x86_64/mm/srat.c
+++ b/arch/x86_64/mm/srat.c
@@ -20,9 +20,6 @@
 
 static struct acpi_table_slit *acpi_slit;
 
-/* Internal processor count */
-static unsigned int __initdata num_processors = 0;
-
 static nodemask_t nodes_parsed __initdata;
 static nodemask_t nodes_found __initdata;
 static struct node nodes[MAX_NUMNODES] __initdata;
@@ -104,18 +101,10 @@
 		bad_srat();
 		return;
 	}
-	if (num_processors >= NR_CPUS) {
-		printk(KERN_ERR "SRAT: Processor #%d (lapic %u) INVALID. (Max ID: %d).\n",
-			num_processors, pa->apic_id, NR_CPUS);
-		bad_srat();
-		return;
-	}
-	cpu_to_node[num_processors] = node;
+	apicid_to_node[pa->apic_id] = node;
 	acpi_numa = 1;
-	printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> CPU %u -> Node %u\n",
-	       pxm, pa->apic_id, num_processors, node);
-
-	num_processors++;
+	printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
+	       pxm, pa->apic_id, node);
 }
 
 /* Callback for parsing of the Proximity Domain <-> Memory Area mappings */