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

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



commit 83bd6ba0b5dffa4e54a5b57ff0d62bf7c5d646b9
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Oct 21 17:42:51 2015 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Oct 21 17:42:51 2015 +0200

    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     |    2 +-
 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, 17 insertions(+), 12 deletions(-)

diff --git a/xen/arch/x86/numa.c b/xen/arch/x86/numa.c
index 132d694..87fb704 100644
--- a/xen/arch/x86/numa.c
+++ b/xen/arch/x86/numa.c
@@ -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);
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 3946e4c..54995ed 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -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;
 
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index 0d55d7f..0946992 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -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. */
diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c
index 4242d10..909c6f7 100644
--- a/xen/arch/x86/srat.c
+++ b/xen/arch/x86/srat.c
@@ -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);
 }
 
diff --git a/xen/drivers/acpi/numa.c b/xen/drivers/acpi/numa.c
index 434194e..c1fd753 100644
--- a/xen/drivers/acpi/numa.c
+++ b/xen/drivers/acpi/numa.c
@@ -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);
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.6

_______________________________________________
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®.