[PATCH] mm: kmemleak: Fix upper boundary check for physical address objects
From: Catalin Marinas
Date: Mon Jan 27 2025 - 13:42:42 EST
Memblock allocations are registered by kmemleak separately, based on
their physical address. During the scanning stage, it checks whether an
object is within the min_low_pfn and max_low_pfn boundaries and ignores
it otherwise.
With the recent addition of __percpu pointer leak detection (commit
6c99d4eb7c5e ("kmemleak: enable tracking for percpu pointers")),
kmemleak started reporting leaks in setup_zone_pageset() and
setup_per_cpu_pageset(). These were caused by the node_data[0] object
(initialised in alloc_node_data()) ending on the PFN_PHYS(max_low_pfn)
boundary. The non-strict upper boundary check introduced by commit
84c326299191 ("mm: kmemleak: check physical address when scan") causes
the pg_data_t object to be ignored (not scanned) and the __percpu
pointers it contains to be reported as leaks.
Make the max_low_pfn upper boundary check strict when deciding whether
to ignore a physical address object and not scan it.
Signed-off-by: Catalin Marinas <catalin.marinas@xxxxxxx>
Fixes: 84c326299191 ("mm: kmemleak: check physical address when scan")
Reported-by: Jakub Kicinski <kuba@xxxxxxxxxx>
Tested-by: Matthieu Baerts (NGI0) <matttbe@xxxxxxxxxx>
Cc: Patrick Wang <patrick.wang.shcn@xxxxxxxxx>
Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Cc: <stable@xxxxxxxxxxxxxxx> # 6.0.x
---
mm/kmemleak.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index 820ba3b5cbfc..bb7d61fc4da3 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -1689,7 +1689,7 @@ static void kmemleak_scan(void)
unsigned long phys = object->pointer;
if (PHYS_PFN(phys) < min_low_pfn ||
- PHYS_PFN(phys + object->size) >= max_low_pfn)
+ PHYS_PFN(phys + object->size) > max_low_pfn)
__paint_it(object, KMEMLEAK_BLACK);
}