[PATCH] x86-64: Don't assign CPU numbers in SRAT parsing
authorAndi Kleen <ak@suse.de>
Mon, 12 Sep 2005 16:49:24 +0000 (18:49 +0200)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 12 Sep 2005 17:49:55 +0000 (10:49 -0700)
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>
arch/x86_64/kernel/setup.c
arch/x86_64/mm/numa.c
arch/x86_64/mm/srat.c
include/asm-x86_64/numa.h

index 9aec524..976ebcf 100644 (file)
@@ -765,6 +765,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
        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 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
 
 #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",
index 04f7a33..5b15186 100644 (file)
@@ -29,6 +29,9 @@ int memnode_shift;
 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;
index 8e3d097..92f6ec7 100644 (file)
@@ -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 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
                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 */
index 5c363a1..3aaf700 100644 (file)
@@ -16,6 +16,8 @@ extern void numa_add_cpu(int cpu);
 extern void numa_init_array(void);
 extern int numa_off;
 
+extern unsigned char apicid_to_node[256];
+
 #define NUMA_NO_NODE 0xff
 
 #endif