From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx170.postini.com [74.125.245.170]) by kanga.kvack.org (Postfix) with SMTP id DF0986B004D for ; Mon, 7 May 2012 21:31:13 -0400 (EDT) Received: by pbbrp2 with SMTP id rp2so9387823pbb.14 for ; Mon, 07 May 2012 18:31:13 -0700 (PDT) Date: Tue, 8 May 2012 09:31:57 +0800 From: "majianpeng" Subject: [PATCH] slub: Using judgement !!c to judge per cpu has obj in fucntion has_cpu_slab(). Message-ID: <201205080931539844949@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: owner-linux-mm@kvack.org List-ID: To: cl , gilad Cc: linux-mm At present, I found some kernel message like: LUB raid5-md127: kmem_cache_destroy called for cache that still has objects. Pid: 6143, comm: mdadm Tainted: G O 3.4.0-rc6+ #75 Call Trace: [] kmem_cache_destroy+0x328/0x400 [] free_conf+0x2d/0xf0 [raid456] [] stop+0x41/0x60 [raid456] [] md_stop+0x1a/0x60 [md_mod] [] do_md_stop+0x74/0x470 [md_mod] [] md_ioctl+0xff/0x11f0 [md_mod] [] blkdev_ioctl+0xd8/0x7a0 [] block_ioctl+0x3b/0x40 [] do_vfs_ioctl+0x96/0x560 [] sys_ioctl+0x91/0xa0 [] system_call_fastpath+0x16/0x1b Then using kmemleak can found those messages: unreferenced object 0xffff8800b6db7380 (size 112): comm "mdadm", pid 5783, jiffies 4294810749 (age 90.589s) hex dump (first 32 bytes): 01 01 db b6 ad 4e ad de ff ff ff ff ff ff ff ff .....N.......... ff ff ff ff ff ff ff ff 98 40 4a 82 ff ff ff ff .........@J..... backtrace: [] kmemleak_alloc+0x21/0x50 [] kmem_cache_alloc+0xeb/0x1b0 [] kmem_cache_open+0x2f1/0x430 [] kmem_cache_create+0x158/0x320 [] setup_conf+0x649/0x770 [raid456] [] run+0x68b/0x840 [raid456] [] md_run+0x529/0x940 [md_mod] [] do_md_run+0x18/0xc0 [md_mod] [] md_ioctl+0xba8/0x11f0 [md_mod] [] blkdev_ioctl+0xd8/0x7a0 [] block_ioctl+0x3b/0x40 [] do_vfs_ioctl+0x96/0x560 [] sys_ioctl+0x91/0xa0 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff Because kmemleak don't detect page leak, so the pages of slabs did not print. Commit a8364d5555b2030d093cde0f0795 modify the code of flush_all. Signed-off-by: majianpeng --- mm/slub.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index ffe13fd..6fce08f 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2040,7 +2040,7 @@ static bool has_cpu_slab(int cpu, void *info) struct kmem_cache *s = info; struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu); - return !!(c->page); + return !!c; } static void flush_all(struct kmem_cache *s) -- 1.7.5.4 root@majianpeng:/mnt/kernel/linux# vim mm/slub.c root@majianpeng:/mnt/kernel/linux# cat 0001-slub-Using-judgement-c-to-judge-per-cpu-has-obj-in-f.patch