Skip to content

Commit

Permalink
mm: kmemleak: check physical address when scan
Browse files Browse the repository at this point in the history
Check the physical address of objects for its boundary when scan instead
of in kmemleak_*_phys().

Link: https://lkml.kernel.org/r/20220611035551.1823303-5-patrick.wang.shcn@gmail.com
Fixes: 23c2d49 ("mm: kmemleak: take a full lowmem check in kmemleak_*_phys()")
Signed-off-by: Patrick Wang <patrick.wang.shcn@gmail.com>
Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Yee Lee <yee.lee@mediatek.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
  • Loading branch information
Patrick Wang authored and akpm00 committed Jun 17, 2022
1 parent 0c24e06 commit 84c3262
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions mm/kmemleak.c
Original file line number Diff line number Diff line change
Expand Up @@ -1184,7 +1184,7 @@ void __ref kmemleak_alloc_phys(phys_addr_t phys, size_t size, gfp_t gfp)
{
pr_debug("%s(0x%pa, %zu)\n", __func__, &phys, size);

if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn)
if (kmemleak_enabled)
/*
* Create object with OBJECT_PHYS flag and
* assume min_count 0.
Expand All @@ -1204,7 +1204,7 @@ void __ref kmemleak_free_part_phys(phys_addr_t phys, size_t size)
{
pr_debug("%s(0x%pa)\n", __func__, &phys);

if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn)
if (kmemleak_enabled)
delete_object_part((unsigned long)phys, size, true);
}
EXPORT_SYMBOL(kmemleak_free_part_phys);
Expand All @@ -1218,7 +1218,7 @@ void __ref kmemleak_ignore_phys(phys_addr_t phys)
{
pr_debug("%s(0x%pa)\n", __func__, &phys);

if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn)
if (kmemleak_enabled)
make_black_object((unsigned long)phys, true);
}
EXPORT_SYMBOL(kmemleak_ignore_phys);
Expand Down Expand Up @@ -1493,6 +1493,17 @@ static void kmemleak_scan(void)
dump_object_info(object);
}
#endif

/* ignore objects outside lowmem (paint them black) */
if ((object->flags & OBJECT_PHYS) &&
!(object->flags & OBJECT_NO_SCAN)) {
unsigned long phys = object->pointer;

if (PHYS_PFN(phys) < min_low_pfn ||
PHYS_PFN(phys + object->size) >= max_low_pfn)
__paint_it(object, KMEMLEAK_BLACK);
}

/* reset the reference count (whiten the object) */
object->count = 0;
if (color_gray(object) && get_object(object))
Expand Down

0 comments on commit 84c3262

Please sign in to comment.