|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 1/8] numa: __node_distance() should return u8
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 <boris.ostrovsky@xxxxxxxxxx>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@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
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |