numa: __node_distance() should return u8
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>
Fri, 20 Mar 2015 16:32:25 +0000 (17:32 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 20 Mar 2015 16:32:25 +0000 (17:32 +0100)
SLIT values are byte-sized and some of them (0-9 and 255) have
special meaning. Adjust __node_distance() to reflect this and
modify scrub_heap_pages() and do_sysctl() to deal with
__node_distance() returning an invalid SLIT entry.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
xen/arch/x86/srat.c
xen/common/page_alloc.c
xen/common/sysctl.c
xen/include/asm-x86/numa.h
xen/include/xen/numa.h

index dfabba39b2026fc0e4bad3e1813f6020338f3357..92c89a5c29b95717463fdbbe867804555b63ca9f 100644 (file)
@@ -496,14 +496,21 @@ static unsigned node_to_pxm(nodeid_t n)
        return 0;
 }
 
-int __node_distance(nodeid_t a, nodeid_t b)
+u8 __node_distance(nodeid_t a, nodeid_t b)
 {
-       int index;
+       unsigned index;
+       u8 slit_val;
 
        if (!acpi_slit)
                return a == b ? 10 : 20;
        index = acpi_slit->locality_count * node_to_pxm(a);
-       return acpi_slit->entry[index + node_to_pxm(b)];
+       slit_val = acpi_slit->entry[index + node_to_pxm(b)];
+
+       /* ACPI defines 0xff as an unreachable node and 0-9 are undefined */
+       if ((slit_val == 0xff) || (slit_val <= 9))
+               return NUMA_NO_DISTANCE;
+       else
+               return slit_val;
 }
 
 EXPORT_SYMBOL(__node_distance);
index d999296dd439d9054a2cb113868d08a24485e2e9..bfb356e6d016c47cfae1096fa009e9f8b7239c0e 100644 (file)
@@ -1434,13 +1434,13 @@ void __init scrub_heap_pages(void)
         /* Figure out which NODE CPUs are close. */
         for_each_online_node ( j )
         {
-            int distance;
+            u8 distance;
 
             if ( cpumask_empty(&node_to_cpumask(j)) )
                 continue;
 
             distance = __node_distance(i, j);
-            if ( distance < last_distance )
+            if ( (distance < last_distance) && (distance != NUMA_NO_DISTANCE) )
             {
                 last_distance = distance;
                 best_node = j;
index 0cb6ee15fb59c21596d1ade90f35d72ef09e9107..79a60205f8d46a26ebe35b147d9da81e38d598e8 100644 (file)
@@ -304,7 +304,12 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
                 {
                     uint32_t distance = ~0u;
                     if ( node_online(i) && node_online(j) )
-                        distance = __node_distance(i, j);
+                    {
+                        u8 d = __node_distance(i, j);
+
+                        if ( d != NUMA_NO_DISTANCE )
+                            distance = d;
+                    }
                     if ( copy_to_guest_offset(
                         ni->node_to_node_distance,
                         i*(max_node_index+1) + j, &distance, 1) )
index cc5b5d19e345f97ec2ecc992ca0fa4377c8fa2ad..7a489d31780b5741b9e5bd2dbda6d2f37319fc87 100644 (file)
@@ -85,6 +85,6 @@ extern int valid_numa_range(u64 start, u64 end, nodeid_t node);
 #endif
 
 void srat_parse_regions(u64 addr);
-extern int __node_distance(nodeid_t a, nodeid_t b);
+extern u8 __node_distance(nodeid_t a, nodeid_t b);
 
 #endif
index ac4b391d3ab27f2be9c6570a125f8546b7e479b7..7aef1a88dc99b2bd980c709f08df9370fed59a3d 100644 (file)
@@ -7,7 +7,8 @@
 #define NODES_SHIFT     0
 #endif
 
-#define NUMA_NO_NODE    0xFF
+#define NUMA_NO_NODE     0xFF
+#define NUMA_NO_DISTANCE 0xFF
 
 #define MAX_NUMNODES    (1 << NODES_SHIFT)