[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen stable-4.4] x86/NUMA: fix SRAT table processor entry parsing and consumption



commit dff1010b09627784c959a5ae97e10472dbe7d097
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Tue Dec 15 15:48:44 2015 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Dec 15 15:48:44 2015 +0100

    x86/NUMA: fix SRAT table processor entry parsing and consumption
    
    - 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@xxxxxxxx>
    Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    master commit: 83281fc9b31396e94c0bfb6550b75c165037a0ad
    master date: 2015-10-14 12:46:27 +0200
---
 xen/arch/x86/numa.c     |    3 ++-
 xen/arch/x86/setup.c    |    2 +-
 xen/arch/x86/smpboot.c  |    3 ++-
 xen/arch/x86/srat.c     |   18 +++++++++++-------
 xen/drivers/acpi/numa.c |    4 ++--
 5 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/xen/arch/x86/numa.c b/xen/arch/x86/numa.c
index b141877..a0a4796 100644
--- a/xen/arch/x86/numa.c
+++ b/xen/arch/x86/numa.c
@@ -331,7 +331,8 @@ 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);
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 4f75af2..3727a8a 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -193,7 +193,7 @@ void __devinit srat_detect_node(int cpu)
     unsigned 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;
 
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index 7a1eac6..772f1aa 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -903,7 +903,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. */
diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c
index d4e479c..b101135 100644
--- a/xen/arch/x86/srat.c
+++ b/xen/arch/x86/srat.c
@@ -170,7 +170,6 @@ void __init
 acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
 {
        int pxm, node;
-       int apic_id;
 
        if (srat_disabled())
                return;
@@ -178,8 +177,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 < 0) {
@@ -187,11 +191,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 */
@@ -221,7 +225,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);
 }
 
diff --git a/xen/drivers/acpi/numa.c b/xen/drivers/acpi/numa.c
index 775537b..9b4543a 100644
--- a/xen/drivers/acpi/numa.c
+++ b/xen/drivers/acpi/numa.c
@@ -199,9 +199,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);
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.4

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.