[PATCH] x86/mm: remove freed init memory from kmemleak in free_init_pages()

From: jiang.kun2

Date: Thu Jul 09 2026 - 08:43:00 EST


From: Jiang Kun <jiang.kun2@xxxxxxxxxx>

free_init_pages() already informs kmemleak when init memory is unmapped
under debug_pagealloc_enabled(), but the normal free path only releases
the pages through free_reserved_area() without removing the range from
kmemleak.

This can leave stale kmemleak objects for boot-time init memory such as
initrd/initramfs buffers. Once the freed range is later reused, kmemleak
may detect overlapping objects and report:

kmemleak: Cannot insert ... into the object search tree (overlaps existing)

followed by disabling the leak detector.

Make both paths consistent by calling kmemleak_free_part() before
freeing the range in the normal path as well.

This matches the existing debug_pagealloc behavior and ensures that
freed init memory is removed from kmemleak before being reused.

Signed-off-by: Jiang Kun <jiang.kun2@xxxxxxxxxx>
---
arch/x86/mm/init.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index fb67217fddcd..3bed63ec1568 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -933,6 +933,7 @@ void free_init_pages(const char *what, unsigned long begin, unsigned long end)
set_memory_nx(begin, (end - begin) >> PAGE_SHIFT);
set_memory_rw(begin, (end - begin) >> PAGE_SHIFT);

+ kmemleak_free_part((void *)begin, end - begin);
free_reserved_area((void *)begin, (void *)end,
POISON_FREE_INITMEM, what);
}
--
2.25.1