summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-06-17 12:16:28 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-06-17 12:16:28 -0700
commit21bd909c78241a61c991e1fb332cea04c340e5f0 (patch)
treee6e529ca05c673e05ac8446584155a4ab26ec069 /mm
parent0839c8963b7b28d25350bd5ea69bacde794124ab (diff)
parent00e06cb773fd81d4f2806a6ee69d1aef8f6dd5ca (diff)
downloadlinux-next-21bd909c78241a61c991e1fb332cea04c340e5f0.tar.gz
linux-next-21bd909c78241a61c991e1fb332cea04c340e5f0.zip
Merge tag 'memblock-v7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock
Pull memblock updates from Mike Rapoport: "Small fixes and a cleanup: - numa emulation: fix detection of under-allocated emulated nodes - memblock tests: fix NUMA tests to properly differentiate reserved areas with differnet flags - mm_init: use div64_ul() instead of do_div() to better express the intent of the division" * tag 'memblock-v7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock: mm: mm_init: use div64_ul() instead of do_div() tools/testing/memblock: fix stale NUMA reservation tests mm/fake-numa: fix under-allocation detection in uniform split
Diffstat (limited to 'mm')
-rw-r--r--mm/mm_init.c2
-rw-r--r--mm/numa_emulation.c17
2 files changed, 14 insertions, 5 deletions
diff --git a/mm/mm_init.c b/mm/mm_init.c
index 46cf001238c5..dc5d93125cdd 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -2412,7 +2412,7 @@ void *__init alloc_large_system_hash(const char *tablename,
/* limit allocation size to 1/16 total memory by default */
if (max == 0) {
max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4;
- do_div(max, bucketsize);
+ max = div64_ul(max, bucketsize);
}
max = min(max, 0x80000000ULL);
diff --git a/mm/numa_emulation.c b/mm/numa_emulation.c
index 703c8fa05048..55f26b22bb0b 100644
--- a/mm/numa_emulation.c
+++ b/mm/numa_emulation.c
@@ -214,7 +214,7 @@ static u64 uniform_size(u64 max_addr, u64 base, u64 hole, int nr_nodes)
* Sets up fake nodes of `size' interleaved over physical nodes ranging from
* `addr' to `max_addr'.
*
- * Returns zero on success or negative on error.
+ * Returns node ID of the next node on success or negative error code.
*/
static int __init split_nodes_size_interleave_uniform(struct numa_meminfo *ei,
struct numa_meminfo *pi,
@@ -398,7 +398,7 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
*/
if (strchr(emu_cmdline, 'U')) {
unsigned long n;
- int nid = 0;
+ int nid = 0, nr_created;
n = simple_strtoul(emu_cmdline, &emu_cmdline, 0);
ret = -1;
@@ -416,9 +416,18 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
n, &pi.blk[0], nid);
if (ret < 0)
break;
- if (ret < n) {
+
+ /*
+ * If no memory was found for this physical node,
+ * skip the under-allocation check.
+ */
+ if (ret == nid)
+ continue;
+
+ nr_created = ret - nid;
+ if (nr_created < n) {
pr_info("%s: phys: %d only got %d of %ld nodes, failing\n",
- __func__, i, ret, n);
+ __func__, i, nr_created, n);
ret = -1;
break;
}