[linux-yocto] [4.12] [PATCH 1/2] debugobjects: Make kmemleak ignore debug objects

Bruce Ashfield bruce.ashfield at windriver.com
Tue May 29 07:34:04 PDT 2018


merged.

Bruce

On 05/29/2018 01:07 AM, quanyang.wang at windriver.com wrote:
> From: Waiman Long <longman at redhat.com>
> 
> commit caba4cbbd27d755572730801ac34fe063fc40a32 upstream
> 
> The allocated debug objects are either on the free list or in the
> hashed bucket lists. So they won't get lost. However if both debug
> objects and kmemleak are enabled and kmemleak scanning is done
> while some of the debug objects are transitioning from one list to
> the others, false negative reporting of memory leaks may happen for
> those objects. For example,
> 
> [38687.275678] kmemleak: 12 new suspected memory leaks (see
> /sys/kernel/debug/kmemleak)
> unreferenced object 0xffff92e98aabeb68 (size 40):
>    comm "ksmtuned", pid 4344, jiffies 4298403600 (age 906.430s)
>    hex dump (first 32 bytes):
>      00 00 00 00 00 00 00 00 d0 bc db 92 e9 92 ff ff  ................
>      01 00 00 00 00 00 00 00 38 36 8a 61 e9 92 ff ff  ........86.a....
>    backtrace:
>      [<ffffffff8fa5378a>] kmemleak_alloc+0x4a/0xa0
>      [<ffffffff8f47c019>] kmem_cache_alloc+0xe9/0x320
>      [<ffffffff8f62ed96>] __debug_object_init+0x3e6/0x400
>      [<ffffffff8f62ef01>] debug_object_activate+0x131/0x210
>      [<ffffffff8f330d9f>] __call_rcu+0x3f/0x400
>      [<ffffffff8f33117d>] call_rcu_sched+0x1d/0x20
>      [<ffffffff8f4a183c>] put_object+0x2c/0x40
>      [<ffffffff8f4a188c>] __delete_object+0x3c/0x50
>      [<ffffffff8f4a18bd>] delete_object_full+0x1d/0x20
>      [<ffffffff8fa535c2>] kmemleak_free+0x32/0x80
>      [<ffffffff8f47af07>] kmem_cache_free+0x77/0x350
>      [<ffffffff8f453912>] unlink_anon_vmas+0x82/0x1e0
>      [<ffffffff8f440341>] free_pgtables+0xa1/0x110
>      [<ffffffff8f44af91>] exit_mmap+0xc1/0x170
>      [<ffffffff8f29db60>] mmput+0x80/0x150
>      [<ffffffff8f2a7609>] do_exit+0x2a9/0xd20
> 
> The references in the debug objects may also hide a real memory leak.
> 
> As there is no point in having kmemleak to track debug object
> allocations, kmemleak checking is now disabled for debug objects.
> 
> Signed-off-by: Waiman Long <longman at redhat.com>
> Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
> Cc: Andrew Morton <akpm at linux-foundation.org>
> Link: http://lkml.kernel.org/r/1502718733-8527-1-git-send-email-longman@redhat.com
> ---
>   init/main.c        | 2 +-
>   lib/debugobjects.c | 3 +++
>   2 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/init/main.c b/init/main.c
> index 25c10c6..298e49f 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -634,8 +634,8 @@ asmlinkage __visible void __init start_kernel(void)
>   	}
>   #endif
>   	page_ext_init();
> -	debug_objects_mem_init();
>   	kmemleak_init();
> +	debug_objects_mem_init();
>   	setup_per_cpu_pageset();
>   	numa_policy_init();
>   	if (late_time_init)
> diff --git a/lib/debugobjects.c b/lib/debugobjects.c
> index 17afb04..2f5349c 100644
> --- a/lib/debugobjects.c
> +++ b/lib/debugobjects.c
> @@ -18,6 +18,7 @@
>   #include <linux/debugfs.h>
>   #include <linux/slab.h>
>   #include <linux/hash.h>
> +#include <linux/kmemleak.h>
>   
>   #define ODEBUG_HASH_BITS	14
>   #define ODEBUG_HASH_SIZE	(1 << ODEBUG_HASH_BITS)
> @@ -110,6 +111,7 @@ static void fill_pool(void)
>   		if (!new)
>   			return;
>   
> +		kmemleak_ignore(new);
>   		raw_spin_lock_irqsave(&pool_lock, flags);
>   		hlist_add_head(&new->node, &obj_pool);
>   		debug_objects_allocated++;
> @@ -1080,6 +1082,7 @@ static int __init debug_objects_replace_static_objects(void)
>   		obj = kmem_cache_zalloc(obj_cache, GFP_KERNEL);
>   		if (!obj)
>   			goto free;
> +		kmemleak_ignore(obj);
>   		hlist_add_head(&obj->node, &objects);
>   	}
>   
> 



More information about the linux-yocto mailing list