x86/NUMA: correct off-by-1 in node map population

As it turns out populate_memnodemap() so far "relied" on
extract_lsb_from_nodes() setting memnodemapsize one too high in edge
cases. Correct the issue there as well, by changing "epdx" to be an
inclusive PDX and adjusting the respective relational operators.

While there also limit the scope of both related variables.

Fixes: b1f4b45d02 ("x86/NUMA: correct off-by-1 in node map size calculation")
Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Release-acked-by: Henry Wang <Henry.Wang@arm.com>
This commit is contained in:
Jan Beulich committed 2022-10-05 10:55:27 +02:00
1 parent 3161231abc
commit 66a5633aa0
1 file changed
+5 -5
+5 -5
View File
@@ -65,15 +65,15 @@ int srat_disabled(void)
static int __init populate_memnodemap(const struct node *nodes,
int numnodes, int shift, nodeid_t *nodeids)
{
unsigned long spdx, epdx;
int i, res = -1;
memset(memnodemap, NUMA_NO_NODE, memnodemapsize * sizeof(*memnodemap));
for ( i = 0; i < numnodes; i++ )
{
spdx = paddr_to_pdx(nodes[i].start);
epdx = paddr_to_pdx(nodes[i].end - 1) + 1;
if ( spdx >= epdx )
unsigned long spdx = paddr_to_pdx(nodes[i].start);
unsigned long epdx = paddr_to_pdx(nodes[i].end - 1);
if ( spdx > epdx )
continue;
if ( (epdx >> shift) >= memnodemapsize )
return 0;
@@ -88,7 +88,7 @@ static int __init populate_memnodemap(const struct node *nodes,
memnodemap[spdx >> shift] = nodeids[i];
spdx += (1UL << shift);
} while ( spdx < epdx );
} while ( spdx <= epdx );
res = 1;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.