mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
3161231abc
commit
66a5633aa0
1 file changed
+5
-5
+5
-5
@@ -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;
|
||||
}
|
||||
|
||||
|
||||