[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 Monné <roger.pau@xxxxxxxxxx>
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Fri, 5 Jun 2026 16:53:48 +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=QcfU634S+PKybxdDqSJuwCFzJjKF6da2VNhhC5xtBj8=; b=BD/lQ/CCzyUM3jt2c++zEn2wDEFHUT38zFzzVffVog+Nxr4TDq+VIg1FFPC63o56hnp06fQe+TBgWLFAbZkoFtonxtBkzChJZJEvFfOffnyppP64zy1wRjpMO0M6V1wnRHfxsAVBHYnAAXXSmzNrRTgwLaz0LhAJRjzw2rhmTKrJZeP2qmCgCKRVZivBOmLC4yRSBIGeE/qb8RdPTE38ktrNmxzWPhM/E2ni59O54Q1mO2zd4hYyx6kg8oNK8VlLpnLDZJwzGY5bbxIIDLH9ukffrnMQw2gr/nPBj2dH+O30I9nJbOT44ocnZjBv0mxAWfpvojMX6QuY1zucaj0pMA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NQ1/56cVOsZoUaF04XUzBTHuHnPZuTPQGOyg19KN6o9UKecbPYpS/VOQiMZUkxPj4hXakVqt1D2Z+1r6GemHz8B5q8zxgTU4ijw2vFzREGck6aH4m1gV22pns0DBhWH0wEBbC2CDIH0fikOXnE+Dl74rZ9Ic9aXhlvcngCjhYeLA0rkPOL1EzYgs/htPqtbEVKkMjW+x9dVKmUqTliLqYhz8cf1jn86vQlxLyOhV/qkDZZtNXQAFj3spSCg+uGr+rSO9CsKBhHoIBn+hXsuniGjB8awGFfNevMTd7OfXoC+ntK2X3PwQN5tE5aCsKB7XUy0gZA7/mc2kXg4qfLJLsQ==
  • 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>, xen-devel@xxxxxxxxxxxxxxxxxxxx, Anthony PERARD <anthony.perard@xxxxxxxxxx>
  • Delivery-date: Fri, 05 Jun 2026 15:54:01 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 05/06/2026 4:49 pm, Roger Pau Monné wrote:
> On Fri, Jun 05, 2026 at 04:41:58PM +0100, Andrew Cooper wrote:
>> 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?
> Yes, this for example:
>
> https://gitlab.com/xen-project/hardware/xen-staging/-/jobs/14693648817

Ok.  Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> preferably with
the suggested adjustments.



 


Rackspace

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