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

Re: [PATCH for-4.22 v2 4/5] tests/numa: add unit tests for NUMA setup logic


  • To: Roger Pau Monne <roger.pau@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Fri, 5 Jun 2026 16:41:58 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=s6HtdCKQcnFEB1ytwfrWFEV5UAXDGaQYhQvEEm4Wz18=; b=eyvWXHEvcybey+JWjs1T3TaOMjwoAzAdlKUxkt6GF5yLo/vTnOlW/aLIa8QXXzSKyYQJYcgzEnuYTq8q2PlGPyL5E+mXD1s92H5o5S30wGgCYbZZ64s4YaIr2K2QwlLokIDpCyPA1fyMsVkF6ockdMpThi99aoQ2t6wS9X/uCq1kIA5rglIx/HtiwLX9jdTsNirhPGcnnq4ptAH2enkzTZw0VUK0i3sZBmHxDrDGHvUzk10cZDlCpDlR9Bd1brxsmNkrYRnpIVOi4j3bfvoH1Q5Tcag53VFVSQRmpnyolgPDsVd54bk2uS8XyIleaOb4sELZxNWJSm9KX6ZBAOdcqg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nqlypOX4BXBkFsqGZTQk5b3BGxhXfn/LaMdXAfjOiE0r6fGLvAWkcYFBtg6mZQC6V2yn1ypafkq2XmvyiYdJwHmAlmH9z/S6W/hCPzt1IgcSuNsRWxQPd5e5qyZbeT2nFNnTjg05ghI6f4Q0VctahykDE8etziQUvk0JGqpECSxGDarAX8AVNVstToQKWtQ5/YQi/DajkyXOPY7VOHUIDAABa/EkWE/XQCZF93LJRUPWep95gmA0/j1tGtmYxiHhHWKFc7aoHo0m5VWf8LFjG0CIbofhPlnzG3SWnBfcwRa7oJp3wHfT9DIiaoY8NpAz6oHF6+4NG5gYe0mWRi2h9A==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Autocrypt: addr=andrew.cooper3@xxxxxxxxxx; keydata= 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 6+ahAA==
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>
  • Delivery-date: Fri, 05 Jun 2026 15:42:11 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 03/06/2026 8:18 pm, Roger Pau Monne wrote:
> diff --git a/tools/tests/numa/harness.h b/tools/tests/numa/harness.h
> new file mode 100644
> index 000000000000..9eec77f31402
> --- /dev/null
> +++ b/tools/tests/numa/harness.h
> @@ -0,0 +1,184 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Unit tests for NUMA setup.
> + *
> + * Copyright (C) 2026 Cloud Software Group
> + */
> +
> +#ifndef _TEST_HARNESS_
> +#define _TEST_HARNESS_

This is overly generic, and liable to break if anyone copies it.  Maybe
NUMA_HARNESS, or WRAP_XEN_NUMA because ...

Looking below, how about naming it wrapped-xen-numa.h, so ...

> <snip>
>
> +
> +static inline bool arch_numa_unavailable(void)
> +{
> +    return false;
> +}
> +
> +#include "numa.h"

I presume this is the real xen/numa.h ?

> +
> +#endif
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff --git a/tools/tests/numa/test-numa.c b/tools/tests/numa/test-numa.c
> new file mode 100644
> index 000000000000..bced68d4d7f1
> --- /dev/null
> +++ b/tools/tests/numa/test-numa.c
> @@ -0,0 +1,222 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Unit tests for NUMA setup.
> + *
> + * Copyright (C) 2026 Cloud Software Group
> + */
> +
> +#include "harness.h"
> +
> +static paddr_t mem_hotplug;
> +unsigned int __read_mostly nr_cpu_ids = NR_CPUS;
> +
> +#include "../../xen/common/numa.c"

... this has 

#include "wrapped-xen-numa.h"
#include "../../xen/common/numa.c"

which I think is clearer to follow.

> <snip>
>
> +int main(int argc, char **argv)
> +{
> +    static const struct {
> +        struct mem_affinity affinity[MAX_RANGES];
> +        struct mem_range ram[MAX_RANGES];
> +    } tests[] = {
> +        /* AMD Turin system. */

I'd suggest /* From an arbitrary AMD Turin system */

Just "AMD Turin system" feels a little as if all systems are like this,
which is absolutely not the case.

> +        {
> +            .affinity = {
> +                { .nid = 0, .start = 0x00000000000ULL, .end = 
> 0x0000009ffffULL },
> +                { .nid = 0, .start = 0x000000c0000ULL, .end = 
> 0x000afffffffULL },
> +                { .nid = 0, .start = 0x00100000000ULL, .end = 
> 0x0c04fffffffULL },
> +                { .nid = 1, .start = 0x0c050000000ULL, .end = 
> 0x0fc4fffffffULL },
> +                { .nid = 1, .start = 0x10000000000ULL, .end = 
> 0x183ffffffffULL },
> +            },
> +            .ram = {
> +                { .start = 0x00000000000ULL, .end = 0x0000009ffffULL },
> +                { .start = 0x00000100000ULL, .end = 0x0007590ffffULL },
> +                { .start = 0x000759d1000ULL, .end = 0x00075a0ffffULL },
> +                { .start = 0x00076000000ULL, .end = 0x00094c73fffULL },
> +                { .start = 0x0009b5ff000ULL, .end = 0x0009fff9fffULL },
> +                { .start = 0x0009ffff000ULL, .end = 0x0009fffffffULL },
> +                { .start = 0x00100010000ULL, .end = 0x0fc4fffffffULL },
> +                { .start = 0x10000000000ULL, .end = 0x183f7ffffffULL },
> +                { .start = 0x183f8800000ULL, .end = 0x183faabffffULL },
> +            },
> +        },
> +    };
> +    int ret_code = EXIT_SUCCESS;
> +
> +    /* Dummy firmware interface provider name, use TST for TEST. */
> +    numa_fw_nid_name = "TST";
> +
> +    for ( unsigned int i = 0 ; i < ARRAY_SIZE(tests); i++ )
> +    {
> +        paddr_t min = ~(paddr_t)0, max = 0;
> +        unsigned int j;
> +
> +        numa_reset_state();
> +
> +        ram = tests[i].ram;
> +
> +        for ( j = 0;
> +              j < ARRAY_SIZE(tests[i].affinity) && tests[i].affinity[j].end;
> +              j++ )
> +        {
> +            const struct mem_affinity *affinity = &tests[i].affinity[j];
> +            paddr_t length = affinity->end - affinity->start + 1;
> +
> +            if ( !numa_update_node_memblks(affinity->nid, affinity->nid,
> +                                           affinity->start, length, false) )
> +            {
> +                printf("Fail to add NID %u [%" PRIpaddr ", %" PRIpaddr "]\n",
> +                        affinity->nid, affinity->start, affinity->end);
> +                ret_code = EXIT_FAILURE;
> +                continue;
> +            }
> +
> +            min = min(min, affinity->start);
> +            max = max(max, affinity->end);
> +        }
> +
> +        if ( !numa_process_nodes(min, max + 1) )
> +        {
> +                printf("Unable to process nodes\n");
> +                print_ranges(tests[i].affinity);
> +                ret_code = EXIT_FAILURE;
> +                continue;

This is mis-indented.  Best double check the whole file.

> +        }
> +
> +        for ( j = 0;
> +              j < ARRAY_SIZE(tests[i].ram) && tests[i].ram[j].end;
> +              j++ )
> +            if ( !test_paddr(tests[i].ram[j].start) ||
> +                 !test_paddr(tests[i].ram[j].end) )
> +                ret_code = EXIT_FAILURE;
> +    }
> +
> +    return ret_code;

This is fine for now, but we're going to have to consolidate the
patterns eventually.

Do you have a Gitlab CI run with this passing?

~Andrew



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.