From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v5 1/8] numa: __node_distance() should return u8 Date: Fri, 20 Mar 2015 10:25:30 -0400 Message-ID: <20150320142530.GI29188@l.oracle.com> References: <1426802044-19444-1-git-send-email-boris.ostrovsky@oracle.com> <1426802044-19444-2-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1426802044-19444-2-git-send-email-boris.ostrovsky@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Boris Ostrovsky Cc: elena.ufimtseva@oracle.com, keir@xen.org, ian.campbell@citrix.com, stefano.stabellini@eu.citrix.com, andrew.cooper3@citrix.com, dario.faggioli@citrix.com, ian.jackson@eu.citrix.com, xen-devel@lists.xen.org, jbeulich@suse.com, wei.liu2@citrix.com List-Id: xen-devel@lists.xenproject.org On Thu, Mar 19, 2015 at 05:53:57PM -0400, Boris Ostrovsky wrote: > 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 Reviewed-by: Konrad Rzeszutek Wilk > --- > > 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@lists.xen.org > http://lists.xen.org/xen-devel