• Qian Cai's avatar
    mm/slab.c: fix an infinite loop in leaks_show() · 16496529
    Qian Cai authored
    [ Upstream commit 745e10146c31b1c6ed3326286704ae251b17f663 ]
    
    "cat /proc/slab_allocators" could hang forever on SMP machines with
    kmemleak or object debugging enabled due to other CPUs running do_drain()
    will keep making kmemleak_object or debug_objects_cache dirty and unable
    to escape the first loop in leaks_show(),
    
    do {
    	set_store_user_clean(cachep);
    	drain_cpu_caches(cachep);
    	...
    
    } while (!is_store_user_clean(cachep));
    
    For example,
    
    do_drain
      slabs_destroy
        slab_destroy
          kmem_cache_free
            __cache_free
              ___cache_free
                kmemleak_free_recursive
                  delete_object_full
                    __delete_object
                      put_object
                        free_object_rcu
                          kmem_cache_free
                            cache_free_debugcheck --> dirty kmemleak_object
    
    One approach is to check cachep->name and skip both kmemleak_object and
    debug_objects_cache in leaks_show().  The other is to set store_user_clean
    after drain_cpu_caches() which leaves a small window between
    drain_cpu_caches() and set_store_user_clean() where per-CPU caches could
    be dirty again lead to slightly wrong information has been stored but
    could also speed up things significantly which sounds like a good
    compromise.  For example,
    
     # cat /proc/slab_allocators
     0m42.778s # 1st approach
     0m0.737s  # 2nd approach
    
    [akpm@linux-foundation.org: tweak comment]
    Link: http://lkml.kernel.org/r/20190411032635.10325-1-cai@lca.pw
    Fixes: d31676df ("mm/slab: alternative implementation for DEBUG_SLAB_LEAK")
    Signed-off-by: 's avatarQian Cai <cai@lca.pw>
    Reviewed-by: 's avatarAndrew Morton <akpm@linux-foundation.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Signed-off-by: 's avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: 's avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: 's avatarSasha Levin <sashal@kernel.org>
    16496529