]> xenbits.xensource.com Git - people/julieng/xen-unstable.git/commitdiff
x86/NUMA: fix SRAT table processor entry parsing and consumption
authorJan Beulich <jbeulich@suse.com>
Wed, 14 Oct 2015 10:46:27 +0000 (12:46 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 14 Oct 2015 10:46:27 +0000 (12:46 +0200)
- don't overrun apicid_to_node[] (possible in the x2APIC case)
- don't limit number of processor related SRAT entries we can consume
- make acpi_numa_{processor,x2apic}_affinity_init() as similar to one
  another as possible
- print APIC IDs in hex (to ease matching with other log messages), at
  once making legacy and x2APIC ones distinguishable (by width)

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/numa.c
xen/arch/x86/setup.c
xen/arch/x86/smpboot.c
xen/arch/x86/srat.c
xen/drivers/acpi/numa.c

index 0e82dd4ed6c39d0cd6fbb40667f43d941af4e988..7e492d4f5ebab2e43c6dc1235ee2f21b14ff9313 100644 (file)
@@ -349,7 +349,7 @@ void __init init_cpu_to_node(void)
         u32 apicid = x86_cpu_to_apicid[i];
         if ( apicid == BAD_APICID )
             continue;
-        node = apicid_to_node[apicid];
+        node = apicid < MAX_LOCAL_APIC ? apicid_to_node[apicid] : NUMA_NO_NODE;
         if ( node == NUMA_NO_NODE || !node_online(node) )
             node = 0;
         numa_set_node(i, node);
index 3f4868e1f984f0797444bd880bdcbd244e2cfb1f..972fbef36fd7060f747b18af5d9c502c9dcccf44 100644 (file)
@@ -200,7 +200,7 @@ void __devinit srat_detect_node(int cpu)
     nodeid_t node;
     u32 apicid = x86_cpu_to_apicid[cpu];
 
-    node = apicid_to_node[apicid];
+    node = apicid < MAX_LOCAL_APIC ? apicid_to_node[apicid] : NUMA_NO_NODE;
     if ( node == NUMA_NO_NODE )
         node = 0;
 
index 0d55d7f2465e141b9db791c92add308d8628f533..094699286f4f6962942024ec8b2b24c7b7996cc0 100644 (file)
@@ -993,7 +993,8 @@ int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm)
             cpu = node;
             goto out;
         }
-        apicid_to_node[apic_id] = node;
+        if ( apic_id < MAX_LOCAL_APIC )
+             apicid_to_node[apic_id] = node;
     }
 
     /* Physically added CPUs do not have synchronised TSC. */
index 4242d10a3b85ba4c2d69d3a96e8d45093a5b58c8..909c6f70ff78b605584fbb26b5b381565bef8f52 100644 (file)
@@ -209,7 +209,6 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
 {
        unsigned pxm;
        nodeid_t node;
-       u32 apic_id;
 
        if (srat_disabled())
                return;
@@ -217,8 +216,13 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
                bad_srat();
                return;
        }
-       if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0)
+       if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
+               return;
+       if (pa->apic_id >= MAX_LOCAL_APIC) {
+               printk(KERN_INFO "SRAT: APIC %08x ignored\n", pa->apic_id);
                return;
+       }
+
        pxm = pa->proximity_domain;
        node = setup_node(pxm);
        if (node == NUMA_NO_NODE) {
@@ -226,11 +230,11 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
                return;
        }
 
-       apic_id = pa->apic_id;
-       apicid_to_node[apic_id] = node;
+       apicid_to_node[pa->apic_id] = node;
+       node_set(node, processor_nodes_parsed);
        acpi_numa = 1;
-       printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
-              pxm, apic_id, node);
+       printk(KERN_INFO "SRAT: PXM %u -> APIC %08x -> Node %u\n",
+              pxm, pa->apic_id, node);
 }
 
 /* Callback for Proximity Domain -> LAPIC mapping */
@@ -262,7 +266,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
        apicid_to_node[pa->apic_id] = node;
        node_set(node, processor_nodes_parsed);
        acpi_numa = 1;
-       printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
+       printk(KERN_INFO "SRAT: PXM %u -> APIC %02x -> Node %u\n",
               pxm, pa->apic_id, node);
 }
 
index 434194ed0462dd6be5184d97c28c32eb9b5417c6..c1fd753fdbd4825678b506b43415bab594f020a1 100644 (file)
@@ -198,9 +198,9 @@ int __init acpi_numa_init(void)
        /* SRAT: Static Resource Affinity Table */
        if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
                acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY,
-                                     acpi_parse_x2apic_affinity, NR_CPUS);
+                                     acpi_parse_x2apic_affinity, 0);
                acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
-                                     acpi_parse_processor_affinity, NR_CPUS);
+                                     acpi_parse_processor_affinity, 0);
                acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
                                      acpi_parse_memory_affinity,
                                      NR_NODE_MEMBLKS);