diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2013-11-12 18:07:45 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-12 22:09:07 -0500 |
commit | 7f88f88f83ed609650a01b18572e605ea50cd163 (patch) | |
tree | 7a515679de2418dbf006bdc40c23b8c6f6b73fce /mm/kmemleak.c | |
parent | 81556b02525181e19ef073a798ba9d48db96f708 (diff) |
mm: kmemleak: avoid false negatives on vmalloc'ed objects
Commit 248ac0e1943a ("mm/vmalloc: remove guard page from between vmap
blocks") had the side effect of making vmap_area.va_end member point to
the next vmap_area.va_start. This was creating an artificial reference
to vmalloc'ed objects and kmemleak was rarely reporting vmalloc() leaks.
This patch marks the vmap_area containing pointers explicitly and
reduces the min ref_count to 2 as vm_struct still contains a reference
to the vmalloc'ed object. The kmemleak add_scan_area() function has
been improved to allow a SIZE_MAX argument covering the rest of the
object (for simpler calling sites).
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/kmemleak.c')
-rw-r--r-- | mm/kmemleak.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index e126b0ef9ad2..31f01c5011e5 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c | |||
@@ -753,7 +753,9 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp) | |||
753 | } | 753 | } |
754 | 754 | ||
755 | spin_lock_irqsave(&object->lock, flags); | 755 | spin_lock_irqsave(&object->lock, flags); |
756 | if (ptr + size > object->pointer + object->size) { | 756 | if (size == SIZE_MAX) { |
757 | size = object->pointer + object->size - ptr; | ||
758 | } else if (ptr + size > object->pointer + object->size) { | ||
757 | kmemleak_warn("Scan area larger than object 0x%08lx\n", ptr); | 759 | kmemleak_warn("Scan area larger than object 0x%08lx\n", ptr); |
758 | dump_object_info(object); | 760 | dump_object_info(object); |
759 | kmem_cache_free(scan_area_cache, area); | 761 | kmem_cache_free(scan_area_cache, area); |