|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/NUMA: correct memnode_shift calculation for single node system
On 27.09.2022 17:53, Roger Pau Monné wrote:
> On Tue, Sep 27, 2022 at 04:15:19PM +0200, Jan Beulich wrote:
>> SRAT may describe even a single node system (including such with
>> multiple nodes, but only one having any memory) using multiple ranges.
>> Hence simply counting the number of ranges (note that function
>> parameters are mis-named) is not an indication of the number of nodes in
>> use. Since we only care about knowing whether we're on a single node
>> system, accounting for this is easy: Increment the local variable only
>> when adjacent ranges are for different nodes. That way the count may
>> still end up larger than the number of nodes in use, but it won't be
>> larger than 1 when only a single node has any memory.
>>
>> To compensate populate_memnodemap() now needs to be prepared to find
>> the correct node ID already in place for a range. (This could of course
>> also happen when there's more than one node with memory, while at least
>> one node has multiple adjacent ranges, provided extract_lsb_from_nodes()
>> would also know to recognize this case.)
>>
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Thanks.
>> --- a/xen/arch/x86/numa.c
>> +++ b/xen/arch/x86/numa.c
>> @@ -78,7 +78,8 @@ static int __init populate_memnodemap(co
>> if ( (epdx >> shift) >= memnodemapsize )
>> return 0;
>> do {
>> - if ( memnodemap[spdx >> shift] != NUMA_NO_NODE )
>> + if ( memnodemap[spdx >> shift] != NUMA_NO_NODE &&
>> + (!nodeids || memnodemap[spdx >> shift] != nodeids[i]) )
>> return -1;
>>
>> if ( !nodeids )
>> @@ -114,7 +115,7 @@ static int __init allocate_cachealigned_
>> * maximum possible shift.
>> */
>> static int __init extract_lsb_from_nodes(const struct node *nodes,
>> - int numnodes)
>> + int numnodes, const nodeid_t
>> *nodeids)
>> {
>> int i, nodes_used = 0;
>> unsigned long spdx, epdx;
>> @@ -127,7 +128,7 @@ static int __init extract_lsb_from_nodes
>> if ( spdx >= epdx )
>> continue;
>> bitfield |= spdx;
>> - nodes_used++;
>> + nodes_used += i == 0 || !nodeids || nodeids[i - 1] != nodeids[i];
>
> I think I would also prefer the `if ( ... ) nodes_used++;` form, as
> it's clearer.
Okay, will switch then. This isn't for 4.17 anyway (I think), so
there's no rush.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |