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

extract_lsb_from_nodes() accumulates "memtop" from all PDXes one past
the covered ranges. Hence the maximum address which can validly by used
to index the node map is one below this value, and we may currently set
up a node map with an unused (and never initialized) trailing entry. In
boundary cases this may also mean we dynamically allocate a page when
the static (64-entry) map would suffice.

While there also correct the comment ahead of the function, for it to
match the actual code: Linux commit 54413927f022 ("x86-64:
x86_64-make-the-numa-hash-function-nodemap-allocation fix fix") removed
the ORing in of the end address before we actually cloned their code.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Wei Chen <Wei.Chen@arm.com>
This commit is contained in:
Jan Beulich committed 2022-09-30 09:55:34 +02:00
1 parent defa4e51d2
commit b1f4b45d02
1 file changed
+2 -2
+2 -2
View File
@@ -111,7 +111,7 @@ static int __init allocate_cachealigned_memnodemap(void)
}
/*
* The LSB of all start and end addresses in the node map is the value of the
* The LSB of all start addresses in the node map is the value of the
* maximum possible shift.
*/
static int __init extract_lsb_from_nodes(const struct node *nodes,
@@ -137,7 +137,7 @@ static int __init extract_lsb_from_nodes(const struct node *nodes,
i = BITS_PER_LONG - 1;
else
i = find_first_bit(&bitfield, sizeof(unsigned long)*8);
memnodemapsize = (memtop >> i) + 1;
memnodemapsize = ((memtop - 1) >> i) + 1;
return i;
}
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.