[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 1/8] numa: __node_distance() should return u8
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@xxxxxxxxxx> --- Changes in v5: * XEN_SYSCTL_numainfo knows about NUMA_NO_DISTANCE * Cleaner changes in __node_distance() xen/arch/x86/srat.c | 13 ++++++++++--- xen/common/page_alloc.c | 4 ++-- xen/common/sysctl.c | 6 +++++- xen/include/asm-x86/numa.h | 2 +- xen/include/xen/numa.h | 3 ++- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c index dfabba3..92c89a5 100644 --- a/xen/arch/x86/srat.c +++ b/xen/arch/x86/srat.c @@ -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); diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index d999296..bfb356e 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -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; diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 0cb6ee1..6fdd029 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -304,7 +304,11 @@ 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) ) diff --git a/xen/include/asm-x86/numa.h b/xen/include/asm-x86/numa.h index cc5b5d1..7a489d3 100644 --- a/xen/include/asm-x86/numa.h +++ b/xen/include/asm-x86/numa.h @@ -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 diff --git a/xen/include/xen/numa.h b/xen/include/xen/numa.h index ac4b391..7aef1a8 100644 --- a/xen/include/xen/numa.h +++ b/xen/include/xen/numa.h @@ -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) -- 1.7.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |