]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/x86/kernel/acpi/boot.c
Merge branch 'akpm-current/current'
[karo-tx-linux.git] / arch / x86 / kernel / acpi / boot.c
index ded848c20e05a115a3556b95cd4a8d6b30c0bdbe..3625ac798821366bbdd2680f9db172a081550fea 100644 (file)
@@ -705,8 +705,14 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 
        nid = acpi_get_node(handle);
        if (nid != -1) {
+               if (try_online_node(nid)) {
+                       pr_warn("failed to online node%d for CPU%d, use node%d instead.\n",
+                               nid, cpu, first_node(node_online_map));
+                       nid = first_node(node_online_map);
+               }
                set_apicid_to_node(physid, nid);
                numa_set_node(cpu, nid);
+               set_cpu_numa_mem(cpu, local_memory_node(nid));
        }
 #endif
 }
@@ -733,9 +739,10 @@ int acpi_unmap_cpu(int cpu)
 {
 #ifdef CONFIG_ACPI_NUMA
        set_apicid_to_node(per_cpu(x86_cpu_to_apicid, cpu), NUMA_NO_NODE);
+       set_cpu_numa_mem(cpu, NUMA_NO_NODE);
 #endif
 
-       per_cpu(x86_cpu_to_apicid, cpu) = -1;
+       per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID;
        set_cpu_present(cpu, false);
        num_processors--;
 
@@ -976,6 +983,8 @@ static int __init acpi_parse_madt_lapic_entries(void)
 {
        int count;
        int x2count = 0;
+       int ret;
+       struct acpi_subtable_proc madt_proc[2];
 
        if (!cpu_has_apic)
                return -ENODEV;
@@ -999,10 +1008,22 @@ static int __init acpi_parse_madt_lapic_entries(void)
                                      acpi_parse_sapic, MAX_LOCAL_APIC);
 
        if (!count) {
-               x2count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC,
-                                       acpi_parse_x2apic, MAX_LOCAL_APIC);
-               count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC,
-                                       acpi_parse_lapic, MAX_LOCAL_APIC);
+               memset(madt_proc, 0, sizeof(madt_proc));
+               madt_proc[0].id = ACPI_MADT_TYPE_LOCAL_APIC;
+               madt_proc[0].handler = acpi_parse_lapic;
+               madt_proc[1].id = ACPI_MADT_TYPE_LOCAL_X2APIC;
+               madt_proc[1].handler = acpi_parse_x2apic;
+               ret = acpi_table_parse_entries_array(ACPI_SIG_MADT,
+                               sizeof(struct acpi_table_madt),
+                               madt_proc, ARRAY_SIZE(madt_proc), MAX_LOCAL_APIC);
+               if (ret < 0) {
+                       printk(KERN_ERR PREFIX
+                                       "Error parsing LAPIC/X2APIC entries\n");
+                       return ret;
+               }
+
+               x2count = madt_proc[0].count;
+               count = madt_proc[1].count;
        }
        if (!count && !x2count) {
                printk(KERN_ERR PREFIX "No LAPIC entries present\n");