diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2026-05-30 15:37:05 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2026-05-30 15:37:05 -0700 |
| commit | a29c0b0cafc78a45f44ac4a98efee0c11dd7996d (patch) | |
| tree | 23c4227493d89a0276b0331e96285982a51bae8d /mm | |
| parent | 670b77dfebe7257adc0defbc48a4c43cfdf6c8f6 (diff) | |
| parent | 7c2eee9c136734825ff524dd8b2146438a4f8250 (diff) | |
| download | linux-next-a29c0b0cafc78a45f44ac4a98efee0c11dd7996d.tar.gz linux-next-a29c0b0cafc78a45f44ac4a98efee0c11dd7996d.zip | |
Merge tag 'fixes-2026-05-30' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock
Pull memblock fix from Mike Rapoport:
"Fix regression from memblock_free_late() refactoring
After refactoring of memblock_free_late() and free_init_pages() it
became possible to call memblock_free() after memblock init data was
discarded.
Make sure memblock_free() does not touch memblock.reserved unless it
is called early enough or when ARCH_KEEP_MEMBLOCK is enabled"
* tag 'fixes-2026-05-30' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock:
memblock: don't touch memblock arrays when memblock_free() is called late
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/memblock.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/mm/memblock.c b/mm/memblock.c index a6a1c91e276d..ccd43f3abb82 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -989,13 +989,15 @@ void __init_memblock memblock_free(void *ptr, size_t size) int __init_memblock memblock_phys_free(phys_addr_t base, phys_addr_t size) { phys_addr_t end = base + size - 1; - int ret; + int ret = 0; memblock_dbg("%s: [%pa-%pa] %pS\n", __func__, &base, &end, (void *)_RET_IP_); kmemleak_free_part_phys(base, size); - ret = memblock_remove_range(&memblock.reserved, base, size); + + if (!slab_is_available() || IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) + ret = memblock_remove_range(&memblock.reserved, base, size); if (slab_is_available()) __free_reserved_area(base, base + size, -1); |
