mm: kmemleak: remove kmemleak_not_leak_phys() and the min_count argument to kmemleak_...
authorPatrick Wang <patrick.wang.shcn@gmail.com>
Sat, 11 Jun 2022 03:55:48 +0000 (11:55 +0800)
committerakpm <akpm@linux-foundation.org>
Fri, 17 Jun 2022 02:48:30 +0000 (19:48 -0700)
Patch series "mm: kmemleak: store objects allocated with physical address
separately and check when scan", v4.

The kmemleak_*_phys() interface uses "min_low_pfn" and "max_low_pfn" to
check address.  But on some architectures, kmemleak_*_phys() is called
before those two variables initialized.  The following steps will be
taken:

1) Add OBJECT_PHYS flag and rbtree for the objects allocated
   with physical address
2) Store physical address in objects if allocated with OBJECT_PHYS
3) Check the boundary when scan instead of in kmemleak_*_phys()

This patch set will solve:
https://lore.kernel.org/r/20220527032504.30341-1-yee.lee@mediatek.com
https://lore.kernel.org/r/9dd08bb5-f39e-53d8-f88d-bec598a08c93@gmail.com

v3: https://lore.kernel.org/r/20220609124950.1694394-1-patrick.wang.shcn@gmail.com
v2: https://lore.kernel.org/r/20220603035415.1243913-1-patrick.wang.shcn@gmail.com
v1: https://lore.kernel.org/r/20220531150823.1004101-1-patrick.wang.shcn@gmail.com

This patch (of 4):

Remove the unused kmemleak_not_leak_phys() function.  And remove the
min_count argument to kmemleak_alloc_phys() function, assume it's 0.

Link: https://lkml.kernel.org/r/20220611035551.1823303-1-patrick.wang.shcn@gmail.com
Link: https://lkml.kernel.org/r/20220611035551.1823303-2-patrick.wang.shcn@gmail.com
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>
Documentation/dev-tools/kmemleak.rst
drivers/of/fdt.c
include/linux/kmemleak.h
mm/kmemleak.c
mm/memblock.c
tools/testing/memblock/linux/kmemleak.h

index 1c935f41cd3a25b4a5c6270cc6b2c40dd1ade231..5483fd39ef2956d51750e6ef2bce37b96f7defc1 100644 (file)
@@ -174,7 +174,6 @@ mapping:
 
 - ``kmemleak_alloc_phys``
 - ``kmemleak_free_part_phys``
-- ``kmemleak_not_leak_phys``
 - ``kmemleak_ignore_phys``
 
 Dealing with false positives/negatives
index a8f5b653216577471fbc2bb4640e48adcaf76a9d..2c677e84c3f5dd6b16e6f44fafc4453a7c31c4fc 100644 (file)
@@ -529,7 +529,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
                        pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n",
                                uname, &base, (unsigned long)(size / SZ_1M));
                        if (!nomap)
-                               kmemleak_alloc_phys(base, size, 0, 0);
+                               kmemleak_alloc_phys(base, size, 0);
                }
                else
                        pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n",
index 34684b2026abfa3e2badd265fe19a2dc4eac59b4..6a3cd1bf4680b3bf4c27c846198a4b9378e51ad3 100644 (file)
@@ -29,10 +29,9 @@ extern void kmemleak_not_leak(const void *ptr) __ref;
 extern void kmemleak_ignore(const void *ptr) __ref;
 extern void kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp) __ref;
 extern void kmemleak_no_scan(const void *ptr) __ref;
-extern void kmemleak_alloc_phys(phys_addr_t phys, size_t size, int min_count,
+extern void kmemleak_alloc_phys(phys_addr_t phys, size_t size,
                                gfp_t gfp) __ref;
 extern void kmemleak_free_part_phys(phys_addr_t phys, size_t size) __ref;
-extern void kmemleak_not_leak_phys(phys_addr_t phys) __ref;
 extern void kmemleak_ignore_phys(phys_addr_t phys) __ref;
 
 static inline void kmemleak_alloc_recursive(const void *ptr, size_t size,
@@ -107,15 +106,12 @@ static inline void kmemleak_no_scan(const void *ptr)
 {
 }
 static inline void kmemleak_alloc_phys(phys_addr_t phys, size_t size,
-                                      int min_count, gfp_t gfp)
+                                      gfp_t gfp)
 {
 }
 static inline void kmemleak_free_part_phys(phys_addr_t phys, size_t size)
 {
 }
-static inline void kmemleak_not_leak_phys(phys_addr_t phys)
-{
-}
 static inline void kmemleak_ignore_phys(phys_addr_t phys)
 {
 }
index a182f5ddaf68b3bcae74287c1ad33b2a31ccd60d..156eafafa182c3680d51240e912c0b3d82979247 100644 (file)
@@ -1125,15 +1125,13 @@ EXPORT_SYMBOL(kmemleak_no_scan);
  *                      address argument
  * @phys:      physical address of the object
  * @size:      size of the object
- * @min_count: minimum number of references to this object.
- *              See kmemleak_alloc()
  * @gfp:       kmalloc() flags used for kmemleak internal memory allocations
  */
-void __ref kmemleak_alloc_phys(phys_addr_t phys, size_t size, int min_count,
-                              gfp_t gfp)
+void __ref kmemleak_alloc_phys(phys_addr_t phys, size_t size, gfp_t gfp)
 {
        if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn)
-               kmemleak_alloc(__va(phys), size, min_count, gfp);
+               /* assume min_count 0 */
+               kmemleak_alloc(__va(phys), size, 0, gfp);
 }
 EXPORT_SYMBOL(kmemleak_alloc_phys);
 
@@ -1151,18 +1149,6 @@ void __ref kmemleak_free_part_phys(phys_addr_t phys, size_t size)
 }
 EXPORT_SYMBOL(kmemleak_free_part_phys);
 
-/**
- * kmemleak_not_leak_phys - similar to kmemleak_not_leak but taking a physical
- *                         address argument
- * @phys:      physical address of the object
- */
-void __ref kmemleak_not_leak_phys(phys_addr_t phys)
-{
-       if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn)
-               kmemleak_not_leak(__va(phys));
-}
-EXPORT_SYMBOL(kmemleak_not_leak_phys);
-
 /**
  * kmemleak_ignore_phys - similar to kmemleak_ignore but taking a physical
  *                       address argument
index e4f03a6e8e56e751a807df41bff38e9aabc83ce2..749abd2685c4e5fa11baca530963f27a4b7cf5d9 100644 (file)
@@ -1345,8 +1345,8 @@ __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
  * from the regions with mirroring enabled and then retried from any
  * memory region.
  *
- * In addition, function sets the min_count to 0 using kmemleak_alloc_phys for
- * allocated boot memory block, so that it is never reported as leaks.
+ * In addition, function using kmemleak_alloc_phys for allocated boot
+ * memory block, it is never reported as leaks.
  *
  * Return:
  * Physical address of allocated memory block on success, %0 on failure.
@@ -1398,12 +1398,12 @@ done:
         */
        if (end != MEMBLOCK_ALLOC_NOLEAKTRACE)
                /*
-                * The min_count is set to 0 so that memblock allocated
-                * blocks are never reported as leaks. This is because many
-                * of these blocks are only referred via the physical
-                * address which is not looked up by kmemleak.
+                * Memblock allocated blocks are never reported as
+                * leaks. This is because many of these blocks are
+                * only referred via the physical address which is
+                * not looked up by kmemleak.
                 */
-               kmemleak_alloc_phys(found, size, 0, 0);
+               kmemleak_alloc_phys(found, size, 0);
 
        return found;
 }
index 462f8c5e8aa098a2479e103db947cd31f7c3531b..5fed13bb9ec401c3e34ac2c2225efc13c1d92360 100644 (file)
@@ -7,7 +7,7 @@ static inline void kmemleak_free_part_phys(phys_addr_t phys, size_t size)
 }
 
 static inline void kmemleak_alloc_phys(phys_addr_t phys, size_t size,
-                                      int min_count, gfp_t gfp)
+                                      gfp_t gfp)
 {
 }