]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - arch/x86_64/kernel/setup.c
[PATCH] x86-64: Don't assign CPU numbers in SRAT parsing
[linux-2.6.git] / arch / x86_64 / kernel / setup.c
index 116a491e2961bbca273d7319559e285be6e2aed0..976ebcf96f3e956d525f385c9eb50c5ebc5cdeba 100644 (file)
  * Machine setup..
  */
 
-struct cpuinfo_x86 boot_cpu_data;
+struct cpuinfo_x86 boot_cpu_data __read_mostly;
 
 unsigned long mmu_cr4_features;
 
 int acpi_disabled;
 EXPORT_SYMBOL(acpi_disabled);
-#ifdef CONFIG_ACPI_BOOT
+#ifdef CONFIG_ACPI
 extern int __initdata acpi_ht;
 extern acpi_interrupt_flags    acpi_sci_flags;
 int __initdata acpi_force = 0;
@@ -294,7 +294,7 @@ static __init void parse_cmdline_early (char ** cmdline_p)
                        maxcpus = simple_strtoul(from + 8, NULL, 0);
                }
 #endif
-#ifdef CONFIG_ACPI_BOOT
+#ifdef CONFIG_ACPI
                /* "acpi=off" disables both ACPI table parsing and interpreter init */
                if (!memcmp(from, "acpi=off", 8))
                        disable_acpi();
@@ -566,7 +566,7 @@ void __init setup_arch(char **cmdline_p)
 
        init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
 
-#ifdef CONFIG_ACPI_BOOT
+#ifdef CONFIG_ACPI
        /*
         * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
         * Call this early for SRAT node setup.
@@ -658,7 +658,7 @@ void __init setup_arch(char **cmdline_p)
 
        check_ioapic();
 
-#ifdef CONFIG_ACPI_BOOT
+#ifdef CONFIG_ACPI
        /*
         * Read APIC and some other early information from ACPI tables.
         */
@@ -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",
@@ -929,7 +934,7 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
        c->x86_num_cores = intel_num_cpu_cores(c);
 }
 
-void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
+static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
 {
        char *v = c->x86_vendor_id;