]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
memblock: make free_reserved_area() update memblock if ARCH_KEEP_MEMBLOCK=y
authorMike Rapoport (Microsoft) <rppt@kernel.org>
Mon, 23 Mar 2026 07:48:34 +0000 (09:48 +0200)
committerMike Rapoport (Microsoft) <rppt@kernel.org>
Wed, 1 Apr 2026 08:20:15 +0000 (11:20 +0300)
On architectures that keep memblock after boot, freeing of reserved memory
with free_reserved_area() is paired with an update of memblock arrays,
usually by a call to memblock_free().

Make free_reserved_area() directly update memblock.reserved when
ARCH_KEEP_MEMBLOCK is enabled.

Remove the now-redundant explicit memblock_free() call from
arm64::free_initmem() and the #ifdef CONFIG_ARCH_KEEP_MEMBLOCK block
from the generic free_initrd_mem().

Link: https://patch.msgid.link/20260323074836.3653702-8-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
arch/arm64/mm/init.c
init/initramfs.c
mm/memblock.c

index 96711b8578fd066f3aab457e102dea199cfb45ad..07b17c7087029e4aef064338c79d4773f3cf63d3 100644 (file)
@@ -385,9 +385,6 @@ void free_initmem(void)
        WARN_ON(!IS_ALIGNED((unsigned long)lm_init_begin, PAGE_SIZE));
        WARN_ON(!IS_ALIGNED((unsigned long)lm_init_end, PAGE_SIZE));
 
-       /* Delete __init region from memblock.reserved. */
-       memblock_free(lm_init_begin, lm_init_end - lm_init_begin);
-
        free_reserved_area(lm_init_begin, lm_init_end,
                           POISON_FREE_INITMEM, "unused kernel");
        /*
index 139baed06589a3dd7853d7c4013db806daa9dd52..bca0922b285089dbb5513533f0cd286a1818c50e 100644 (file)
@@ -652,13 +652,6 @@ disable:
 
 void __weak __init free_initrd_mem(unsigned long start, unsigned long end)
 {
-#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
-       unsigned long aligned_start = ALIGN_DOWN(start, PAGE_SIZE);
-       unsigned long aligned_end = ALIGN(end, PAGE_SIZE);
-
-       memblock_free((void *)aligned_start, aligned_end - aligned_start);
-#endif
-
        free_reserved_area((void *)start, (void *)end, POISON_FREE_INITMEM,
                        "initrd");
 }
index 68a72bd4c8bd61a35b8f76c334b5685eb44ece63..dee18c40d9289c5aebce8803e9b3217ad5147d2c 100644 (file)
@@ -943,6 +943,12 @@ unsigned long free_reserved_area(void *start, void *end, int poison, const char
                end_pa = __pa(end - 1) + 1;
        }
 
+       if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
+               if (start_pa < end_pa)
+                       memblock_remove_range(&memblock.reserved,
+                                             start_pa, end_pa - start_pa);
+       }
+
        pages = __free_reserved_area(start_pa, end_pa, poison);
        if (pages && s)
                pr_info("Freeing %s memory: %ldK\n", s, K(pages));