* V3.10-rc1 memory leak
@ 2013-05-13 17:39 Larry Finger
2013-05-14 19:09 ` Steven Rostedt
0 siblings, 1 reply; 18+ messages in thread
From: Larry Finger @ 2013-05-13 17:39 UTC (permalink / raw)
To: zhangwei(Jovi), Steven Rostedt, Masami Hiramatsu; +Cc: LKML
Using v3.10-rc1-68-g2d3ec09, I am getting many instances of the following from
kmemleak:
unreferenced object 0xffff8800b546dc30 (size 48):
comm "systemd-udevd", pid 2181, jiffies 4294899141 (age 274.096s)
hex dump (first 32 bytes):
00 dc 46 b5 00 88 ff ff d0 ff 5b a0 ff ff ff ff ..F.......[.....
1c 3b 5b a0 ff ff ff ff 12 3a 5b a0 ff ff ff ff .;[......:[.....
backtrace:
[<ffffffff81432e81>] kmemleak_alloc+0x21/0x50
[<ffffffff81143c2b>] kmem_cache_alloc+0x11b/0x270
[<ffffffff810e9ee0>] __trace_define_field+0x40/0xd0
[<ffffffff810e9fc5>] trace_define_field+0x55/0x70
[<ffffffffa05e6ba0>] 0xffffffffa05e6ba0
[<ffffffff810ea735>] event_create_dir+0x2e5/0x480
[<ffffffff810ea920>] __trace_add_new_event+0x50/0x80
[<ffffffff810eacf9>] __add_event_to_tracers+0x69/0xc0
[<ffffffff810eb4e1>] trace_module_notify+0x1e1/0x2f0
[<ffffffff8106e8f5>] notifier_call_chain+0x55/0x110
[<ffffffff8106eb27>] __blocking_notifier_call_chain+0x67/0xc0
[<ffffffff8106eb91>] blocking_notifier_call_chain+0x11/0x20
[<ffffffff810af792>] load_module+0x19e2/0x24b0
[<ffffffff810b0317>] SyS_init_module+0xb7/0xe0
[<ffffffff814499d2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
These appear to be real leaks, but I am not familiar with this section of the
code, and they could be false indications.
This mail is sent to all authors of patches incorporated in
kernel/trace/trace_events.c in 2013. Kernel 3.9 did not show this problem.
Thanks,
Larry
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: V3.10-rc1 memory leak 2013-05-13 17:39 V3.10-rc1 memory leak Larry Finger @ 2013-05-14 19:09 ` Steven Rostedt 2013-05-14 20:30 ` Catalin Marinas 2013-05-14 20:36 ` Larry Finger 0 siblings, 2 replies; 18+ messages in thread From: Steven Rostedt @ 2013-05-14 19:09 UTC (permalink / raw) To: Larry Finger Cc: zhangwei(Jovi), Steven Rostedt, Masami Hiramatsu, LKML, Catalin Marinas On Mon, 2013-05-13 at 15:06 -0400, Larry Finger wrote: > Using v3.10-rc1-68-g2d3ec09, I am getting many instances of the following from > kmemleak: > > unreferenced object 0xffff8800b546dc30 (size 48): > comm "systemd-udevd", pid 2181, jiffies 4294899141 (age 274.096s) > hex dump (first 32 bytes): > 00 dc 46 b5 00 88 ff ff d0 ff 5b a0 ff ff ff ff ..F.......[..... > 1c 3b 5b a0 ff ff ff ff 12 3a 5b a0 ff ff ff ff .;[......:[..... > backtrace: > [<ffffffff81432e81>] kmemleak_alloc+0x21/0x50 > [<ffffffff81143c2b>] kmem_cache_alloc+0x11b/0x270 > [<ffffffff810e9ee0>] __trace_define_field+0x40/0xd0 > [<ffffffff810e9fc5>] trace_define_field+0x55/0x70 > [<ffffffffa05e6ba0>] 0xffffffffa05e6ba0 > [<ffffffff810ea735>] event_create_dir+0x2e5/0x480 > [<ffffffff810ea920>] __trace_add_new_event+0x50/0x80 > [<ffffffff810eacf9>] __add_event_to_tracers+0x69/0xc0 > [<ffffffff810eb4e1>] trace_module_notify+0x1e1/0x2f0 > [<ffffffff8106e8f5>] notifier_call_chain+0x55/0x110 > [<ffffffff8106eb27>] __blocking_notifier_call_chain+0x67/0xc0 > [<ffffffff8106eb91>] blocking_notifier_call_chain+0x11/0x20 > [<ffffffff810af792>] load_module+0x19e2/0x24b0 > [<ffffffff810b0317>] SyS_init_module+0xb7/0xe0 > [<ffffffff814499d2>] system_call_fastpath+0x16/0x1b > [<ffffffffffffffff>] 0xffffffffffffffff > > These appear to be real leaks, but I am not familiar with this section of the > code, and they could be false indications. They are false positives. Yesterday and today I've been looking at these trying to find where the leak is. I actually discovered a leak elsewhere that's been there for a while (and fixed it), but it had nothing to do with these. Finally, as I was suspecting that these were false positives, I broke down and added the following code: +++ b/kernel/trace/trace_events.c @@ -863,15 +863,15 @@ static int f_show(struct seq_file *m, void *v) array_descriptor = NULL; if (!array_descriptor) - seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d; + seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d; field->type, field->name, field->offset, - field->size, !!field->is_signed); + field->size, !!field->is_signed, field); else - seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned + seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned (int)(array_descriptor - field->type), field->type, field->name, array_descriptor, field->offset, - field->size, !!field->is_signed); + field->size, !!field->is_signed, field); Which adds the field pointer to the output of the fields in the format files. And sure enough, it proved to be a false positive: # cat /debug/kmemleak unreferenced object 0xffff8800769f7438 (size 48): comm "modprobe", pid 881, jiffies 4294691017 (age 716.781s) hex dump (first 32 bytes): 90 98 04 a0 ff ff ff ff 08 74 9f 76 00 88 ff ff .........t.v.... b6 52 04 a0 ff ff ff ff ba 52 04 a0 ff ff ff ff .R.......R...... backtrace: [<ffffffff814b52ef>] kmemleak_alloc+0x73/0x98 [<ffffffff8111ffcc>] kmemleak_alloc_recursive.constprop.42+0x16/0x18 [<ffffffff8112092f>] kmem_cache_alloc+0xb9/0x142 [<ffffffff810d0e2e>] __trace_define_field+0x3c/0xbd [<ffffffff810d0f0c>] trace_define_field+0x5d/0x5f [<ffffffffa005a166>] 0xffffffffa005a166 [<ffffffff810d19dc>] event_create_dir+0x31c/0x381 [<ffffffff810d1ae3>] __add_event_to_tracers+0xa2/0xbd [<ffffffff810d1cc6>] trace_module_notify+0x1c8/0x26f [<ffffffff814d219d>] notifier_call_chain+0x37/0x63 [<ffffffff8105c29c>] __blocking_notifier_call_chain+0x4b/0x60 [<ffffffff8105c2c5>] blocking_notifier_call_chain+0x14/0x16 [<ffffffff8108fe59>] load_module+0x1d55/0x20a9 [<ffffffff81090286>] SyS_init_module+0xd9/0xdb [<ffffffff814d5694>] tracesys+0xdd/0xe2 [<ffffffffffffffff>] 0xffffffffffffffff [...] # find /debug/tracing/events/ -name format |xargs grep ffff8800769f7438 /debug/tracing/events/drm/drm_vblank_event_delivered/format: field:pid_t pid; offset:8; size:4; signed:1;ffff8800769f7438 Thus, what it is complaining about being leaked, is currently being used. I guess it's because the fields are stored on the "event class" structure of the module. That is, the struct ftrace_event_class, which is part of the module data section: struct ftrace_event_class { char *system; void *probe; #ifdef CONFIG_PERF_EVENTS void *perf_probe; #endif int (*reg)(struct ftrace_event_call *event, enum trace_reg type, void *data); int (*define_fields)(struct ftrace_event_call *); struct list_head *(*get_fields)(struct ftrace_event_call *); struct list_head fields; int (*raw_init)(struct ftrace_event_call *); }; The list_head fields holds the fields and these are used to print out the formats. For some reason, kmemleak is missing that the fields are being assigned to this list on module load. Catalin, have any idea why kmemleak is not detecting that the field is being referenced? kernel/trace/trace_events.c: __trace_define_field() list_add(&field->link, head); -- Steve > > This mail is sent to all authors of patches incorporated in > kernel/trace/trace_events.c in 2013. Kernel 3.9 did not show this problem. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-14 19:09 ` Steven Rostedt @ 2013-05-14 20:30 ` Catalin Marinas 2013-05-14 21:10 ` Larry Finger 2013-05-14 20:36 ` Larry Finger 1 sibling, 1 reply; 18+ messages in thread From: Catalin Marinas @ 2013-05-14 20:30 UTC (permalink / raw) To: Steven Rostedt Cc: Larry Finger, zhangwei(Jovi), Steven Rostedt, Masami Hiramatsu, LKML Hi Steve, On Tue, May 14, 2013 at 08:09:46PM +0100, Steven Rostedt wrote: > # find /debug/tracing/events/ -name format |xargs grep ffff8800769f7438 > /debug/tracing/events/drm/drm_vblank_event_delivered/format: field:pid_t pid; offset:8; size:4; signed:1;ffff8800769f7438 > > Thus, what it is complaining about being leaked, is currently being > used. > > I guess it's because the fields are stored on the "event class" > structure of the module. That is, the struct ftrace_event_class, which > is part of the module data section: > > struct ftrace_event_class { > char *system; > void *probe; > #ifdef CONFIG_PERF_EVENTS > void *perf_probe; > #endif > int (*reg)(struct ftrace_event_call *event, > enum trace_reg type, void *data); > int (*define_fields)(struct ftrace_event_call *); > struct list_head *(*get_fields)(struct ftrace_event_call *); > struct list_head fields; > int (*raw_init)(struct ftrace_event_call *); > }; > > > The list_head fields holds the fields and these are used to print out > the formats. For some reason, kmemleak is missing that the fields are > being assigned to this list on module load. > > Catalin, have any idea why kmemleak is not detecting that the field is > being referenced? I just got a patch today: https://lkml.org/lkml/2013/5/10/607 which could be related. If Rusty doesn't push it I'll do. But please let me know if it does not solve the problem. Thanks. -- Catalin ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-14 20:30 ` Catalin Marinas @ 2013-05-14 21:10 ` Larry Finger 2013-05-14 21:20 ` Steven Rostedt 0 siblings, 1 reply; 18+ messages in thread From: Larry Finger @ 2013-05-14 21:10 UTC (permalink / raw) To: Catalin Marinas Cc: Steven Rostedt, zhangwei(Jovi), Steven Rostedt, Masami Hiramatsu, LKML On 05/14/2013 03:30 PM, Catalin Marinas wrote: > > I just got a patch today: > > https://lkml.org/lkml/2013/5/10/607 > > which could be related. If Rusty doesn't push it I'll do. But please let > me know if it does not solve the problem. This patch fixes my problem. Now I can see the next new problem reported by kmemleak. :) Thanks to you and Jianpeng Ma, Larry ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-14 21:10 ` Larry Finger @ 2013-05-14 21:20 ` Steven Rostedt 2013-05-15 0:57 ` Steven Rostedt 0 siblings, 1 reply; 18+ messages in thread From: Steven Rostedt @ 2013-05-14 21:20 UTC (permalink / raw) To: Larry Finger; +Cc: Catalin Marinas, zhangwei(Jovi), Masami Hiramatsu, LKML On Tue, 2013-05-14 at 16:10 -0500, Larry Finger wrote: > On 05/14/2013 03:30 PM, Catalin Marinas wrote: > > > > I just got a patch today: > > > > https://lkml.org/lkml/2013/5/10/607 > > > > which could be related. If Rusty doesn't push it I'll do. But please let > > me know if it does not solve the problem. > > This patch fixes my problem. Now I can see the next new problem reported by > kmemleak. :) > > Thanks to you and Jianpeng Ma, > > Larry > It goes away on my testing too. So you can add: Tested-by: Steven Rostedt <rostedt@goodmis.org> -- Steve ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-14 21:20 ` Steven Rostedt @ 2013-05-15 0:57 ` Steven Rostedt 2013-05-15 3:15 ` Larry Finger 2013-05-15 14:37 ` Catalin Marinas 0 siblings, 2 replies; 18+ messages in thread From: Steven Rostedt @ 2013-05-15 0:57 UTC (permalink / raw) To: Larry Finger Cc: Catalin Marinas, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell On Tue, 2013-05-14 at 17:20 -0400, Steven Rostedt wrote: > On Tue, 2013-05-14 at 16:10 -0500, Larry Finger wrote: > > On 05/14/2013 03:30 PM, Catalin Marinas wrote: > > > > > > I just got a patch today: > > > > > > https://lkml.org/lkml/2013/5/10/607 > > > > > > which could be related. If Rusty doesn't push it I'll do. But please let > > > me know if it does not solve the problem. > > > > This patch fixes my problem. Now I can see the next new problem reported by > > kmemleak. :) > > > > Thanks to you and Jianpeng Ma, > > > > Larry > > > > It goes away on my testing too. So you can add: > > Tested-by: Steven Rostedt <rostedt@goodmis.org> > But we are not out of the woods yet. I'm also getting these: unreferenced object 0xffff88007800efc0 (size 32): comm "modprobe", pid 1309, jiffies 4294697214 (age 188.356s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 a8 d0 3e a0 ff ff ff ff ..........>..... 30 d1 3e a0 ff ff ff ff 00 00 00 00 00 00 00 00 0.>............. backtrace: [<ffffffff814b535f>] kmemleak_alloc+0x73/0x98 [<ffffffff8112003c>] kmemleak_alloc_recursive.constprop.42+0x16/0x18 [<ffffffff81120dfe>] kmem_cache_alloc_trace+0xc0/0x10b [<ffffffff810e5478>] jump_label_module_notify+0xce/0x1d5 [<ffffffff814d221d>] notifier_call_chain+0x37/0x63 [<ffffffff8105c29c>] __blocking_notifier_call_chain+0x4b/0x60 [<ffffffff8105c2c5>] blocking_notifier_call_chain+0x14/0x16 [<ffffffff8108fe83>] load_module+0x1d7f/0x20d3 [<ffffffff810902b0>] SyS_init_module+0xd9/0xdb [<ffffffff814d5754>] tracesys+0xdd/0xe2 [<ffffffffffffffff>] 0xffffffffffffffff Where it points to the allocation in jump_label_add_module() where it allocates the jlm. And this does get freed in jump_label_del_module(). I put in printks in add_module(): printk("alloc %p (%s)\n", jlm, mod->name); and in del_module: printk("free %p (%s)\n", jlm, mod->name); And got this: [ 29.917577] alloc ffff88007800efc0 (kvm_intel) And removing kvm_intel, I got: [ 364.965916] free ffff88007800efc0 (kvm_intel) Thus it seems to be yet another false positive :-( -- Steve ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 0:57 ` Steven Rostedt @ 2013-05-15 3:15 ` Larry Finger 2013-05-15 15:02 ` Catalin Marinas 2013-05-15 14:37 ` Catalin Marinas 1 sibling, 1 reply; 18+ messages in thread From: Larry Finger @ 2013-05-15 3:15 UTC (permalink / raw) To: Steven Rostedt Cc: Catalin Marinas, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell On 05/14/2013 07:57 PM, Steven Rostedt wrote: > On Tue, 2013-05-14 at 17:20 -0400, Steven Rostedt wrote: >> On Tue, 2013-05-14 at 16:10 -0500, Larry Finger wrote: >>> On 05/14/2013 03:30 PM, Catalin Marinas wrote: >>>> >>>> I just got a patch today: >>>> >>>> https://lkml.org/lkml/2013/5/10/607 >>>> >>>> which could be related. If Rusty doesn't push it I'll do. But please let >>>> me know if it does not solve the problem. >>> >>> This patch fixes my problem. Now I can see the next new problem reported by >>> kmemleak. :) >>> >>> Thanks to you and Jianpeng Ma, >>> >>> Larry >>> >> >> It goes away on my testing too. So you can add: >> >> Tested-by: Steven Rostedt <rostedt@goodmis.org> >> > > But we are not out of the woods yet. I'm also getting these: > > unreferenced object 0xffff88007800efc0 (size 32): > comm "modprobe", pid 1309, jiffies 4294697214 (age 188.356s) > hex dump (first 32 bytes): > 00 00 00 00 00 00 00 00 a8 d0 3e a0 ff ff ff ff ..........>..... > 30 d1 3e a0 ff ff ff ff 00 00 00 00 00 00 00 00 0.>............. > backtrace: > [<ffffffff814b535f>] kmemleak_alloc+0x73/0x98 > [<ffffffff8112003c>] kmemleak_alloc_recursive.constprop.42+0x16/0x18 > [<ffffffff81120dfe>] kmem_cache_alloc_trace+0xc0/0x10b > [<ffffffff810e5478>] jump_label_module_notify+0xce/0x1d5 > [<ffffffff814d221d>] notifier_call_chain+0x37/0x63 > [<ffffffff8105c29c>] __blocking_notifier_call_chain+0x4b/0x60 > [<ffffffff8105c2c5>] blocking_notifier_call_chain+0x14/0x16 > [<ffffffff8108fe83>] load_module+0x1d7f/0x20d3 > [<ffffffff810902b0>] SyS_init_module+0xd9/0xdb > [<ffffffff814d5754>] tracesys+0xdd/0xe2 > [<ffffffffffffffff>] 0xffffffffffffffff > > Where it points to the allocation in jump_label_add_module() where it > allocates the jlm. And this does get freed in jump_label_del_module(). I > put in printks in add_module(): > > printk("alloc %p (%s)\n", jlm, mod->name); > > and in del_module: > > printk("free %p (%s)\n", jlm, mod->name); > > And got this: > > [ 29.917577] alloc ffff88007800efc0 (kvm_intel) > > > And removing kvm_intel, I got: > > [ 364.965916] free ffff88007800efc0 (kvm_intel) > > > Thus it seems to be yet another false positive :-( I do not see that particular one; however, I see 4 instances of unreferenced object 0xffff8800b7979750 (size 8): comm "swapper/0", pid 1, jiffies 4294892402 (age 21888.316s) hex dump (first 8 bytes): 31 38 00 b7 00 88 ff ff 18...... backtrace: [<ffffffff81432ea1>] kmemleak_alloc+0x21/0x50 [<ffffffff81145d50>] __kmalloc_track_caller+0x140/0x2b0 [<ffffffff81119fb5>] kstrdup+0x35/0x70 [<ffffffff8125febc>] acpi_set_pnp_ids+0xd0/0x304 [<ffffffff81260c47>] acpi_scan_init_hotplug+0x47/0xa1 [<ffffffff81261223>] acpi_bus_check_add+0x66/0xd7 [<ffffffff8127877a>] acpi_ns_walk_namespace+0xb9/0x173 [<ffffffff81278bf3>] acpi_walk_namespace+0x93/0xc6 [<ffffffff812612dc>] acpi_bus_scan+0x48/0x9a [<ffffffff818c983d>] acpi_scan_init+0x57/0x14b [<ffffffff818c966a>] acpi_init+0x244/0x286 [<ffffffff810002fa>] do_one_initcall+0x10a/0x160 [<ffffffff8189cef0>] kernel_init_freeable+0x103/0x192 [<ffffffff814313a9>] kernel_init+0x9/0xf0 [<ffffffff8144992c>] ret_from_fork+0x7c/0xb0 [<ffffffffffffffff>] 0xffffffffffffffff All four were allocated early in the bootup, and are the only leaks reported in my system. I have not yet tested to see if they are false. Larry ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 3:15 ` Larry Finger @ 2013-05-15 15:02 ` Catalin Marinas 2013-05-15 15:49 ` Toshi Kani 2013-05-15 20:46 ` Larry Finger 0 siblings, 2 replies; 18+ messages in thread From: Catalin Marinas @ 2013-05-15 15:02 UTC (permalink / raw) To: Larry Finger Cc: Steven Rostedt, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell, Toshi Kani On Wed, May 15, 2013 at 04:15:46AM +0100, Larry Finger wrote: > I do not see that particular one; however, I see 4 instances of > > unreferenced object 0xffff8800b7979750 (size 8): > comm "swapper/0", pid 1, jiffies 4294892402 (age 21888.316s) > hex dump (first 8 bytes): > 31 38 00 b7 00 88 ff ff 18...... > backtrace: > [<ffffffff81432ea1>] kmemleak_alloc+0x21/0x50 > [<ffffffff81145d50>] __kmalloc_track_caller+0x140/0x2b0 > [<ffffffff81119fb5>] kstrdup+0x35/0x70 > [<ffffffff8125febc>] acpi_set_pnp_ids+0xd0/0x304 > [<ffffffff81260c47>] acpi_scan_init_hotplug+0x47/0xa1 > [<ffffffff81261223>] acpi_bus_check_add+0x66/0xd7 > [<ffffffff8127877a>] acpi_ns_walk_namespace+0xb9/0x173 > [<ffffffff81278bf3>] acpi_walk_namespace+0x93/0xc6 > [<ffffffff812612dc>] acpi_bus_scan+0x48/0x9a > [<ffffffff818c983d>] acpi_scan_init+0x57/0x14b > [<ffffffff818c966a>] acpi_init+0x244/0x286 > [<ffffffff810002fa>] do_one_initcall+0x10a/0x160 > [<ffffffff8189cef0>] kernel_init_freeable+0x103/0x192 > [<ffffffff814313a9>] kernel_init+0x9/0xf0 > [<ffffffff8144992c>] ret_from_fork+0x7c/0xb0 > [<ffffffffffffffff>] 0xffffffffffffffff > > All four were allocated early in the bootup, and are the only leaks reported in > my system. I have not yet tested to see if they are false. This looks to me like a real leak, possibly introduced by commit 6b772e8f9 (ACPI: Update PNPID match handling for notify). The acpi_scan_init_hotplug() function calls acpi_set_pnp_ids() which allocates pnp.unique_id (kstrdup()) but for some reason it fails and does not set pnp.type.hardware_id. The return does not call acpi_free_pnp_ids() which would be responsible for such freeing. Something like below, but not tested and may fail some NULL pointer checks: diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index fe158fd..c1bc608 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -1785,7 +1785,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) acpi_set_pnp_ids(handle, &pnp, type); if (!pnp.type.hardware_id) - return; + goto out; /* * This relies on the fact that acpi_install_notify_handler() will not @@ -1800,6 +1800,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) } } +out: acpi_free_pnp_ids(&pnp); } ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 15:02 ` Catalin Marinas @ 2013-05-15 15:49 ` Toshi Kani 2013-05-15 16:47 ` Catalin Marinas 2013-05-15 20:46 ` Larry Finger 1 sibling, 1 reply; 18+ messages in thread From: Toshi Kani @ 2013-05-15 15:49 UTC (permalink / raw) To: Catalin Marinas, rjw Cc: Larry Finger, Steven Rostedt, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell, linux-acpi On Wed, 2013-05-15 at 16:02 +0100, Catalin Marinas wrote: > On Wed, May 15, 2013 at 04:15:46AM +0100, Larry Finger wrote: > > I do not see that particular one; however, I see 4 instances of > > > > unreferenced object 0xffff8800b7979750 (size 8): > > comm "swapper/0", pid 1, jiffies 4294892402 (age 21888.316s) > > hex dump (first 8 bytes): > > 31 38 00 b7 00 88 ff ff 18...... > > backtrace: > > [<ffffffff81432ea1>] kmemleak_alloc+0x21/0x50 > > [<ffffffff81145d50>] __kmalloc_track_caller+0x140/0x2b0 > > [<ffffffff81119fb5>] kstrdup+0x35/0x70 > > [<ffffffff8125febc>] acpi_set_pnp_ids+0xd0/0x304 > > [<ffffffff81260c47>] acpi_scan_init_hotplug+0x47/0xa1 > > [<ffffffff81261223>] acpi_bus_check_add+0x66/0xd7 > > [<ffffffff8127877a>] acpi_ns_walk_namespace+0xb9/0x173 > > [<ffffffff81278bf3>] acpi_walk_namespace+0x93/0xc6 > > [<ffffffff812612dc>] acpi_bus_scan+0x48/0x9a > > [<ffffffff818c983d>] acpi_scan_init+0x57/0x14b > > [<ffffffff818c966a>] acpi_init+0x244/0x286 > > [<ffffffff810002fa>] do_one_initcall+0x10a/0x160 > > [<ffffffff8189cef0>] kernel_init_freeable+0x103/0x192 > > [<ffffffff814313a9>] kernel_init+0x9/0xf0 > > [<ffffffff8144992c>] ret_from_fork+0x7c/0xb0 > > [<ffffffffffffffff>] 0xffffffffffffffff > > > > All four were allocated early in the bootup, and are the only leaks reported in > > my system. I have not yet tested to see if they are false. > > This looks to me like a real leak, possibly introduced by commit > 6b772e8f9 (ACPI: Update PNPID match handling for notify). The > acpi_scan_init_hotplug() function calls acpi_set_pnp_ids() which > allocates pnp.unique_id (kstrdup()) but for some reason it fails and > does not set pnp.type.hardware_id. The return does not call > acpi_free_pnp_ids() which would be responsible for such freeing. I agree with your analysis. It appears that this ACPI device object has _UID but not _HID. ACPI spec defines that _UID is a unique ID among a same _HID. So, it is odd to have _UID without _HID. But, nonetheless, this case needs to be handled as such systems exist. > Something like below, but not tested and may fail some NULL pointer > checks: The change looks good. acpi_free_pnp_ids() handles this empty list pnp->ids properly. Are you going to submit this patch with your signed-off? Thanks! -Toshi > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c > index fe158fd..c1bc608 100644 > --- a/drivers/acpi/scan.c > +++ b/drivers/acpi/scan.c > @@ -1785,7 +1785,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) > acpi_set_pnp_ids(handle, &pnp, type); > > if (!pnp.type.hardware_id) > - return; > + goto out; > > /* > * This relies on the fact that acpi_install_notify_handler() will not > @@ -1800,6 +1800,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) > } > } > > +out: > acpi_free_pnp_ids(&pnp); > } > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 15:49 ` Toshi Kani @ 2013-05-15 16:47 ` Catalin Marinas 2013-05-15 17:53 ` Toshi Kani 0 siblings, 1 reply; 18+ messages in thread From: Catalin Marinas @ 2013-05-15 16:47 UTC (permalink / raw) To: Toshi Kani Cc: rjw@sisk.pl, Larry Finger, Steven Rostedt, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell, linux-acpi@vger.kernel.org On Wed, May 15, 2013 at 04:49:50PM +0100, Toshi Kani wrote: > On Wed, 2013-05-15 at 16:02 +0100, Catalin Marinas wrote: > > On Wed, May 15, 2013 at 04:15:46AM +0100, Larry Finger wrote: > > > I do not see that particular one; however, I see 4 instances of > > > > > > unreferenced object 0xffff8800b7979750 (size 8): > > > comm "swapper/0", pid 1, jiffies 4294892402 (age 21888.316s) > > > hex dump (first 8 bytes): > > > 31 38 00 b7 00 88 ff ff 18...... > > > backtrace: > > > [<ffffffff81432ea1>] kmemleak_alloc+0x21/0x50 > > > [<ffffffff81145d50>] __kmalloc_track_caller+0x140/0x2b0 > > > [<ffffffff81119fb5>] kstrdup+0x35/0x70 > > > [<ffffffff8125febc>] acpi_set_pnp_ids+0xd0/0x304 > > > [<ffffffff81260c47>] acpi_scan_init_hotplug+0x47/0xa1 > > > [<ffffffff81261223>] acpi_bus_check_add+0x66/0xd7 > > > [<ffffffff8127877a>] acpi_ns_walk_namespace+0xb9/0x173 > > > [<ffffffff81278bf3>] acpi_walk_namespace+0x93/0xc6 > > > [<ffffffff812612dc>] acpi_bus_scan+0x48/0x9a > > > [<ffffffff818c983d>] acpi_scan_init+0x57/0x14b > > > [<ffffffff818c966a>] acpi_init+0x244/0x286 > > > [<ffffffff810002fa>] do_one_initcall+0x10a/0x160 > > > [<ffffffff8189cef0>] kernel_init_freeable+0x103/0x192 > > > [<ffffffff814313a9>] kernel_init+0x9/0xf0 > > > [<ffffffff8144992c>] ret_from_fork+0x7c/0xb0 > > > [<ffffffffffffffff>] 0xffffffffffffffff > > > > > > All four were allocated early in the bootup, and are the only leaks reported in > > > my system. I have not yet tested to see if they are false. > > > > This looks to me like a real leak, possibly introduced by commit > > 6b772e8f9 (ACPI: Update PNPID match handling for notify). The > > acpi_scan_init_hotplug() function calls acpi_set_pnp_ids() which > > allocates pnp.unique_id (kstrdup()) but for some reason it fails and > > does not set pnp.type.hardware_id. The return does not call > > acpi_free_pnp_ids() which would be responsible for such freeing. > > I agree with your analysis. It appears that this ACPI device object has > _UID but not _HID. ACPI spec defines that _UID is a unique ID among a > same _HID. So, it is odd to have _UID without _HID. But, nonetheless, > this case needs to be handled as such systems exist. > > > Something like below, but not tested and may fail some NULL pointer > > checks: > > The change looks good. acpi_free_pnp_ids() handles this empty list > pnp->ids properly. Are you going to submit this patch with your > signed-off? Yes, I'll post it shortly. But I'd like an acked/tested-by as I don't have a platform to test it. Thanks. -- Catalin ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 16:47 ` Catalin Marinas @ 2013-05-15 17:53 ` Toshi Kani 0 siblings, 0 replies; 18+ messages in thread From: Toshi Kani @ 2013-05-15 17:53 UTC (permalink / raw) To: Catalin Marinas Cc: rjw@sisk.pl, Larry Finger, Steven Rostedt, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell, linux-acpi@vger.kernel.org On Wed, 2013-05-15 at 17:47 +0100, Catalin Marinas wrote: > On Wed, May 15, 2013 at 04:49:50PM +0100, Toshi Kani wrote: > > On Wed, 2013-05-15 at 16:02 +0100, Catalin Marinas wrote: > > > On Wed, May 15, 2013 at 04:15:46AM +0100, Larry Finger wrote: > > > > I do not see that particular one; however, I see 4 instances of > > > > > > > > unreferenced object 0xffff8800b7979750 (size 8): > > > > comm "swapper/0", pid 1, jiffies 4294892402 (age 21888.316s) > > > > hex dump (first 8 bytes): > > > > 31 38 00 b7 00 88 ff ff 18...... > > > > backtrace: > > > > [<ffffffff81432ea1>] kmemleak_alloc+0x21/0x50 > > > > [<ffffffff81145d50>] __kmalloc_track_caller+0x140/0x2b0 > > > > [<ffffffff81119fb5>] kstrdup+0x35/0x70 > > > > [<ffffffff8125febc>] acpi_set_pnp_ids+0xd0/0x304 > > > > [<ffffffff81260c47>] acpi_scan_init_hotplug+0x47/0xa1 > > > > [<ffffffff81261223>] acpi_bus_check_add+0x66/0xd7 > > > > [<ffffffff8127877a>] acpi_ns_walk_namespace+0xb9/0x173 > > > > [<ffffffff81278bf3>] acpi_walk_namespace+0x93/0xc6 > > > > [<ffffffff812612dc>] acpi_bus_scan+0x48/0x9a > > > > [<ffffffff818c983d>] acpi_scan_init+0x57/0x14b > > > > [<ffffffff818c966a>] acpi_init+0x244/0x286 > > > > [<ffffffff810002fa>] do_one_initcall+0x10a/0x160 > > > > [<ffffffff8189cef0>] kernel_init_freeable+0x103/0x192 > > > > [<ffffffff814313a9>] kernel_init+0x9/0xf0 > > > > [<ffffffff8144992c>] ret_from_fork+0x7c/0xb0 > > > > [<ffffffffffffffff>] 0xffffffffffffffff > > > > > > > > All four were allocated early in the bootup, and are the only leaks reported in > > > > my system. I have not yet tested to see if they are false. > > > > > > This looks to me like a real leak, possibly introduced by commit > > > 6b772e8f9 (ACPI: Update PNPID match handling for notify). The > > > acpi_scan_init_hotplug() function calls acpi_set_pnp_ids() which > > > allocates pnp.unique_id (kstrdup()) but for some reason it fails and > > > does not set pnp.type.hardware_id. The return does not call > > > acpi_free_pnp_ids() which would be responsible for such freeing. > > > > I agree with your analysis. It appears that this ACPI device object has > > _UID but not _HID. ACPI spec defines that _UID is a unique ID among a > > same _HID. So, it is odd to have _UID without _HID. But, nonetheless, > > this case needs to be handled as such systems exist. > > > > > Something like below, but not tested and may fail some NULL pointer > > > checks: > > > > The change looks good. acpi_free_pnp_ids() handles this empty list > > pnp->ids properly. Are you going to submit this patch with your > > signed-off? > > Yes, I'll post it shortly. But I'd like an acked/tested-by as I don't > have a platform to test it. I was able to reproduce this issue by adding a fake ACPI device object with _UID only. I will test your change as well. Thanks, -Toshi ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 15:02 ` Catalin Marinas 2013-05-15 15:49 ` Toshi Kani @ 2013-05-15 20:46 ` Larry Finger 1 sibling, 0 replies; 18+ messages in thread From: Larry Finger @ 2013-05-15 20:46 UTC (permalink / raw) To: Catalin Marinas Cc: Steven Rostedt, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell, Toshi Kani On 05/15/2013 10:02 AM, Catalin Marinas wrote: > On Wed, May 15, 2013 at 04:15:46AM +0100, Larry Finger wrote: >> I do not see that particular one; however, I see 4 instances of >> >> unreferenced object 0xffff8800b7979750 (size 8): >> comm "swapper/0", pid 1, jiffies 4294892402 (age 21888.316s) >> hex dump (first 8 bytes): >> 31 38 00 b7 00 88 ff ff 18...... >> backtrace: >> [<ffffffff81432ea1>] kmemleak_alloc+0x21/0x50 >> [<ffffffff81145d50>] __kmalloc_track_caller+0x140/0x2b0 >> [<ffffffff81119fb5>] kstrdup+0x35/0x70 >> [<ffffffff8125febc>] acpi_set_pnp_ids+0xd0/0x304 >> [<ffffffff81260c47>] acpi_scan_init_hotplug+0x47/0xa1 >> [<ffffffff81261223>] acpi_bus_check_add+0x66/0xd7 >> [<ffffffff8127877a>] acpi_ns_walk_namespace+0xb9/0x173 >> [<ffffffff81278bf3>] acpi_walk_namespace+0x93/0xc6 >> [<ffffffff812612dc>] acpi_bus_scan+0x48/0x9a >> [<ffffffff818c983d>] acpi_scan_init+0x57/0x14b >> [<ffffffff818c966a>] acpi_init+0x244/0x286 >> [<ffffffff810002fa>] do_one_initcall+0x10a/0x160 >> [<ffffffff8189cef0>] kernel_init_freeable+0x103/0x192 >> [<ffffffff814313a9>] kernel_init+0x9/0xf0 >> [<ffffffff8144992c>] ret_from_fork+0x7c/0xb0 >> [<ffffffffffffffff>] 0xffffffffffffffff >> >> All four were allocated early in the bootup, and are the only leaks reported in >> my system. I have not yet tested to see if they are false. > > This looks to me like a real leak, possibly introduced by commit > 6b772e8f9 (ACPI: Update PNPID match handling for notify). The > acpi_scan_init_hotplug() function calls acpi_set_pnp_ids() which > allocates pnp.unique_id (kstrdup()) but for some reason it fails and > does not set pnp.type.hardware_id. The return does not call > acpi_free_pnp_ids() which would be responsible for such freeing. > Something like below, but not tested and may fail some NULL pointer > checks: > > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c > index fe158fd..c1bc608 100644 > --- a/drivers/acpi/scan.c > +++ b/drivers/acpi/scan.c > @@ -1785,7 +1785,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) > acpi_set_pnp_ids(handle, &pnp, type); > > if (!pnp.type.hardware_id) > - return; > + goto out; > > /* > * This relies on the fact that acpi_install_notify_handler() will not > @@ -1800,6 +1800,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) > } > } > > +out: > acpi_free_pnp_ids(&pnp); > } This patch fixes the memory leaks on my system. My kmemleak scans are now clean again. You may add a "Tested-by: Larry Finger <Larry.Finger@lwfinger.net>". Thanks, Larry ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 0:57 ` Steven Rostedt 2013-05-15 3:15 ` Larry Finger @ 2013-05-15 14:37 ` Catalin Marinas 2013-05-15 19:33 ` Steven Rostedt 1 sibling, 1 reply; 18+ messages in thread From: Catalin Marinas @ 2013-05-15 14:37 UTC (permalink / raw) To: Steven Rostedt Cc: Larry Finger, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell On Wed, May 15, 2013 at 01:57:03AM +0100, Steven Rostedt wrote: > On Tue, 2013-05-14 at 17:20 -0400, Steven Rostedt wrote: > > On Tue, 2013-05-14 at 16:10 -0500, Larry Finger wrote: > > > On 05/14/2013 03:30 PM, Catalin Marinas wrote: > > > > > > > > I just got a patch today: > > > > > > > > https://lkml.org/lkml/2013/5/10/607 > > > > > > > > which could be related. If Rusty doesn't push it I'll do. But please let > > > > me know if it does not solve the problem. > > > > > > This patch fixes my problem. Now I can see the next new problem reported by > > > kmemleak. :) > > > > > > Thanks to you and Jianpeng Ma, > > > > > > Larry > > > > > > > It goes away on my testing too. So you can add: > > > > Tested-by: Steven Rostedt <rostedt@goodmis.org> > > > > But we are not out of the woods yet. I'm also getting these: > > unreferenced object 0xffff88007800efc0 (size 32): > comm "modprobe", pid 1309, jiffies 4294697214 (age 188.356s) > hex dump (first 32 bytes): > 00 00 00 00 00 00 00 00 a8 d0 3e a0 ff ff ff ff ..........>..... > 30 d1 3e a0 ff ff ff ff 00 00 00 00 00 00 00 00 0.>............. > backtrace: > [<ffffffff814b535f>] kmemleak_alloc+0x73/0x98 > [<ffffffff8112003c>] kmemleak_alloc_recursive.constprop.42+0x16/0x18 > [<ffffffff81120dfe>] kmem_cache_alloc_trace+0xc0/0x10b > [<ffffffff810e5478>] jump_label_module_notify+0xce/0x1d5 > [<ffffffff814d221d>] notifier_call_chain+0x37/0x63 > [<ffffffff8105c29c>] __blocking_notifier_call_chain+0x4b/0x60 > [<ffffffff8105c2c5>] blocking_notifier_call_chain+0x14/0x16 > [<ffffffff8108fe83>] load_module+0x1d7f/0x20d3 > [<ffffffff810902b0>] SyS_init_module+0xd9/0xdb > [<ffffffff814d5754>] tracesys+0xdd/0xe2 > [<ffffffffffffffff>] 0xffffffffffffffff > > Where it points to the allocation in jump_label_add_module() where it > allocates the jlm. And this does get freed in jump_label_del_module(). Indeed, another false positive (I should use modules more often ;). Here's a patch: ---------------------8<---------------------------------- >From 0621c7e1909ea86bf8499a0ffe5ea59d1007ee8c Mon Sep 17 00:00:00 2001 From: Catalin Marinas <catalin.marinas@arm.com> Date: Wed, 15 May 2013 15:30:46 +0100 Subject: [PATCH] kmemleak: Scan the jump label module section Objects allocated in jump_label_add_module() are currently reported as leaks, though the pointers are stored in the module jump label section. This patch informs kmemleak that this section needs to be scanned. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Reported-by: Steven Rostedt <rostedt@goodmis.org> --- kernel/module.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/module.c b/kernel/module.c index b049939..ff83711 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2764,6 +2764,13 @@ static void find_module_sections(struct module *mod, struct load_info *info) mod->jump_entries = section_objs(info, "__jump_table", sizeof(*mod->jump_entries), &mod->num_jump_entries); + /* + * This section contains pointers to objects allocated in + * jump_label_add_module() and not scanning it leads to false + * positives. + */ + kmemleak_scan_area(mod->jump_entries, sizeof(*mod->jump_entries) * + mod->num_jump_entries, GFP_KERNEL); #endif #ifdef CONFIG_EVENT_TRACING mod->trace_events = section_objs(info, "_ftrace_events", ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 14:37 ` Catalin Marinas @ 2013-05-15 19:33 ` Steven Rostedt 2013-05-15 19:46 ` Steven Rostedt 2013-05-16 10:12 ` Catalin Marinas 0 siblings, 2 replies; 18+ messages in thread From: Steven Rostedt @ 2013-05-15 19:33 UTC (permalink / raw) To: Catalin Marinas Cc: Larry Finger, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell On Wed, 2013-05-15 at 15:37 +0100, Catalin Marinas wrote: > >From 0621c7e1909ea86bf8499a0ffe5ea59d1007ee8c Mon Sep 17 00:00:00 2001 > From: Catalin Marinas <catalin.marinas@arm.com> > Date: Wed, 15 May 2013 15:30:46 +0100 > Subject: [PATCH] kmemleak: Scan the jump label module section > > Objects allocated in jump_label_add_module() are currently reported as > leaks, though the pointers are stored in the module jump label section. > This patch informs kmemleak that this section needs to be scanned. > > Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> > Reported-by: Steven Rostedt <rostedt@goodmis.org> This didn't work. I still get the leak messages. But this change did: Instead of just picking data sections by name (names that start with .data, .bss or .ref.data), use the section flags and scan all sections that are allocated, writable and not executable. Which should cover all sections of a module that might reference data. Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Index: linux-trace.git/kernel/module.c =================================================================== --- linux-trace.git.orig/kernel/module.c +++ linux-trace.git/kernel/module.c @@ -2432,10 +2432,12 @@ static void kmemleak_load_module(const s for (i = 1; i < info->hdr->e_shnum; i++) { const char *name = info->secstrings + info->sechdrs[i].sh_name; - if (!(info->sechdrs[i].sh_flags & SHF_ALLOC)) + + /* Scan all writable sections that's not executable */ + if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) || + !(info->sechdrs[i].sh_flags & SHF_WRITE)) continue; - if (!strstarts(name, ".data") && !strstarts(name, ".bss") && - !strstarts(name, ".ref.data")) + if (info->sechdrs[i].sh_flags & SHF_EXECINSTR) continue; kmemleak_scan_area((void *)info->sechdrs[i].sh_addr, ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 19:33 ` Steven Rostedt @ 2013-05-15 19:46 ` Steven Rostedt 2013-05-16 10:12 ` Catalin Marinas 1 sibling, 0 replies; 18+ messages in thread From: Steven Rostedt @ 2013-05-15 19:46 UTC (permalink / raw) To: Catalin Marinas Cc: Larry Finger, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell On Wed, 2013-05-15 at 15:33 -0400, Steven Rostedt wrote: > Instead of just picking data sections by name (names that start > with .data, .bss or .ref.data), use the section flags and scan all > sections that are allocated, writable and not executable. Which should > cover all sections of a module that might reference data. After this patch is applied, you can add this one too: kmemleak: No need for scanning specific module sections As kmemleak now scans all module sections that are allocated, writable and non executable, there's no need to scan individual sections that might reference data. Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Index: linux-trace.git/kernel/module.c =================================================================== --- linux-trace.git.orig/kernel/module.c +++ linux-trace.git/kernel/module.c @@ -2772,24 +2772,11 @@ static void find_module_sections(struct mod->trace_events = section_objs(info, "_ftrace_events", sizeof(*mod->trace_events), &mod->num_trace_events); - /* - * This section contains pointers to allocated objects in the trace - * code and not scanning it leads to false positives. - */ - kmemleak_scan_area(mod->trace_events, sizeof(*mod->trace_events) * - mod->num_trace_events, GFP_KERNEL); #endif #ifdef CONFIG_TRACING mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt", sizeof(*mod->trace_bprintk_fmt_start), &mod->num_trace_bprintk_fmt); - /* - * This section contains pointers to allocated objects in the trace - * code and not scanning it leads to false positives. - */ - kmemleak_scan_area(mod->trace_bprintk_fmt_start, - sizeof(*mod->trace_bprintk_fmt_start) * - mod->num_trace_bprintk_fmt, GFP_KERNEL); #endif #ifdef CONFIG_FTRACE_MCOUNT_RECORD /* sechdrs[0].sh_size is always zero */ ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-15 19:33 ` Steven Rostedt 2013-05-15 19:46 ` Steven Rostedt @ 2013-05-16 10:12 ` Catalin Marinas 2013-05-16 23:47 ` Rusty Russell 1 sibling, 1 reply; 18+ messages in thread From: Catalin Marinas @ 2013-05-16 10:12 UTC (permalink / raw) To: Steven Rostedt Cc: Larry Finger, zhangwei(Jovi), Masami Hiramatsu, LKML, Rusty Russell On Wed, May 15, 2013 at 08:33:01PM +0100, Steven Rostedt wrote: > On Wed, 2013-05-15 at 15:37 +0100, Catalin Marinas wrote: > > > >From 0621c7e1909ea86bf8499a0ffe5ea59d1007ee8c Mon Sep 17 00:00:00 2001 > > From: Catalin Marinas <catalin.marinas@arm.com> > > Date: Wed, 15 May 2013 15:30:46 +0100 > > Subject: [PATCH] kmemleak: Scan the jump label module section > > > > Objects allocated in jump_label_add_module() are currently reported as > > leaks, though the pointers are stored in the module jump label section. > > This patch informs kmemleak that this section needs to be scanned. > > > > Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> > > Reported-by: Steven Rostedt <rostedt@goodmis.org> > > This didn't work. I still get the leak messages. But this change did: > > Instead of just picking data sections by name (names that start > with .data, .bss or .ref.data), use the section flags and scan all > sections that are allocated, writable and not executable. Which should > cover all sections of a module that might reference data. > > Signed-off-by: Steven Rostedt <rostedt@goodmis.org> That's even better. I tested the two patches as well, added a subject and a bit of clean-up and pushed them to this branch: git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64.git kmemleak Rusty, are you ok to take these or just ack and I'll push them to Linus. Thanks. -- Catalin ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-16 10:12 ` Catalin Marinas @ 2013-05-16 23:47 ` Rusty Russell 0 siblings, 0 replies; 18+ messages in thread From: Rusty Russell @ 2013-05-16 23:47 UTC (permalink / raw) To: Catalin Marinas, Steven Rostedt Cc: Larry Finger, zhangwei(Jovi), Masami Hiramatsu, LKML Catalin Marinas <catalin.marinas@arm.com> writes: > On Wed, May 15, 2013 at 08:33:01PM +0100, Steven Rostedt wrote: >> On Wed, 2013-05-15 at 15:37 +0100, Catalin Marinas wrote: >> >> > >From 0621c7e1909ea86bf8499a0ffe5ea59d1007ee8c Mon Sep 17 00:00:00 2001 >> > From: Catalin Marinas <catalin.marinas@arm.com> >> > Date: Wed, 15 May 2013 15:30:46 +0100 >> > Subject: [PATCH] kmemleak: Scan the jump label module section >> > >> > Objects allocated in jump_label_add_module() are currently reported as >> > leaks, though the pointers are stored in the module jump label section. >> > This patch informs kmemleak that this section needs to be scanned. >> > >> > Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> >> > Reported-by: Steven Rostedt <rostedt@goodmis.org> >> >> This didn't work. I still get the leak messages. But this change did: >> >> Instead of just picking data sections by name (names that start >> with .data, .bss or .ref.data), use the section flags and scan all >> sections that are allocated, writable and not executable. Which should >> cover all sections of a module that might reference data. >> >> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> > > That's even better. I tested the two patches as well, added a subject > and a bit of clean-up and pushed them to this branch: > > git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64.git kmemleak > > Rusty, are you ok to take these or just ack and I'll push them to Linus. Thanks. I've dropped the original "add .ref.data" patch. For both patches: Acked-by: Rusty Russell <rusty@rustcorp.com.au> Cheers, Rusty. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: V3.10-rc1 memory leak 2013-05-14 19:09 ` Steven Rostedt 2013-05-14 20:30 ` Catalin Marinas @ 2013-05-14 20:36 ` Larry Finger 1 sibling, 0 replies; 18+ messages in thread From: Larry Finger @ 2013-05-14 20:36 UTC (permalink / raw) To: Steven Rostedt Cc: zhangwei(Jovi), Steven Rostedt, Masami Hiramatsu, LKML, Catalin Marinas On 05/14/2013 02:09 PM, Steven Rostedt wrote: > On Mon, 2013-05-13 at 15:06 -0400, Larry Finger wrote: >> Using v3.10-rc1-68-g2d3ec09, I am getting many instances of the following from >> kmemleak: >> >> unreferenced object 0xffff8800b546dc30 (size 48): >> comm "systemd-udevd", pid 2181, jiffies 4294899141 (age 274.096s) >> hex dump (first 32 bytes): >> 00 dc 46 b5 00 88 ff ff d0 ff 5b a0 ff ff ff ff ..F.......[..... >> 1c 3b 5b a0 ff ff ff ff 12 3a 5b a0 ff ff ff ff .;[......:[..... >> backtrace: >> [<ffffffff81432e81>] kmemleak_alloc+0x21/0x50 >> [<ffffffff81143c2b>] kmem_cache_alloc+0x11b/0x270 >> [<ffffffff810e9ee0>] __trace_define_field+0x40/0xd0 >> [<ffffffff810e9fc5>] trace_define_field+0x55/0x70 >> [<ffffffffa05e6ba0>] 0xffffffffa05e6ba0 >> [<ffffffff810ea735>] event_create_dir+0x2e5/0x480 >> [<ffffffff810ea920>] __trace_add_new_event+0x50/0x80 >> [<ffffffff810eacf9>] __add_event_to_tracers+0x69/0xc0 >> [<ffffffff810eb4e1>] trace_module_notify+0x1e1/0x2f0 >> [<ffffffff8106e8f5>] notifier_call_chain+0x55/0x110 >> [<ffffffff8106eb27>] __blocking_notifier_call_chain+0x67/0xc0 >> [<ffffffff8106eb91>] blocking_notifier_call_chain+0x11/0x20 >> [<ffffffff810af792>] load_module+0x19e2/0x24b0 >> [<ffffffff810b0317>] SyS_init_module+0xb7/0xe0 >> [<ffffffff814499d2>] system_call_fastpath+0x16/0x1b >> [<ffffffffffffffff>] 0xffffffffffffffff >> >> These appear to be real leaks, but I am not familiar with this section of the >> code, and they could be false indications. > > They are false positives. Yesterday and today I've been looking at these > trying to find where the leak is. I actually discovered a leak elsewhere > that's been there for a while (and fixed it), but it had nothing to do > with these. > > Finally, as I was suspecting that these were false positives, I broke > down and added the following code: > > +++ b/kernel/trace/trace_events.c > @@ -863,15 +863,15 @@ static int f_show(struct seq_file *m, void *v) > array_descriptor = NULL; > > if (!array_descriptor) > - seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d; > + seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d; > field->type, field->name, field->offset, > - field->size, !!field->is_signed); > + field->size, !!field->is_signed, field); > else > - seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned > + seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned > (int)(array_descriptor - field->type), > field->type, field->name, > array_descriptor, field->offset, > - field->size, !!field->is_signed); > + field->size, !!field->is_signed, field); > > > Which adds the field pointer to the output of the fields in the format > files. And sure enough, it proved to be a false positive: > > # cat /debug/kmemleak > unreferenced object 0xffff8800769f7438 (size 48): > comm "modprobe", pid 881, jiffies 4294691017 (age 716.781s) > hex dump (first 32 bytes): > 90 98 04 a0 ff ff ff ff 08 74 9f 76 00 88 ff ff .........t.v.... > b6 52 04 a0 ff ff ff ff ba 52 04 a0 ff ff ff ff .R.......R...... > backtrace: > [<ffffffff814b52ef>] kmemleak_alloc+0x73/0x98 > [<ffffffff8111ffcc>] kmemleak_alloc_recursive.constprop.42+0x16/0x18 > [<ffffffff8112092f>] kmem_cache_alloc+0xb9/0x142 > [<ffffffff810d0e2e>] __trace_define_field+0x3c/0xbd > [<ffffffff810d0f0c>] trace_define_field+0x5d/0x5f > [<ffffffffa005a166>] 0xffffffffa005a166 > [<ffffffff810d19dc>] event_create_dir+0x31c/0x381 > [<ffffffff810d1ae3>] __add_event_to_tracers+0xa2/0xbd > [<ffffffff810d1cc6>] trace_module_notify+0x1c8/0x26f > [<ffffffff814d219d>] notifier_call_chain+0x37/0x63 > [<ffffffff8105c29c>] __blocking_notifier_call_chain+0x4b/0x60 > [<ffffffff8105c2c5>] blocking_notifier_call_chain+0x14/0x16 > [<ffffffff8108fe59>] load_module+0x1d55/0x20a9 > [<ffffffff81090286>] SyS_init_module+0xd9/0xdb > [<ffffffff814d5694>] tracesys+0xdd/0xe2 > [<ffffffffffffffff>] 0xffffffffffffffff > [...] > > # find /debug/tracing/events/ -name format |xargs grep ffff8800769f7438 > /debug/tracing/events/drm/drm_vblank_event_delivered/format: field:pid_t pid; offset:8; size:4; signed:1;ffff8800769f7438 > > Thus, what it is complaining about being leaked, is currently being > used. > > I guess it's because the fields are stored on the "event class" > structure of the module. That is, the struct ftrace_event_class, which > is part of the module data section: > > struct ftrace_event_class { > char *system; > void *probe; > #ifdef CONFIG_PERF_EVENTS > void *perf_probe; > #endif > int (*reg)(struct ftrace_event_call *event, > enum trace_reg type, void *data); > int (*define_fields)(struct ftrace_event_call *); > struct list_head *(*get_fields)(struct ftrace_event_call *); > struct list_head fields; > int (*raw_init)(struct ftrace_event_call *); > }; > > > The list_head fields holds the fields and these are used to print out > the formats. For some reason, kmemleak is missing that the fields are > being assigned to this list on module load. > > Catalin, have any idea why kmemleak is not detecting that the field is > being referenced? > > kernel/trace/trace_events.c: __trace_define_field() > > list_add(&field->link, head); > > -- Steve > > >> >> This mail is sent to all authors of patches incorporated in >> kernel/trace/trace_events.c in 2013. Kernel 3.9 did not show this problem. Steve, Thanks for checking on this. While you and Catalin work this out, I can always drop back to 3.9 to cut out the noise if I need to check one of my drivers for leaks, Larry ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2013-05-17 1:14 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-05-13 17:39 V3.10-rc1 memory leak Larry Finger 2013-05-14 19:09 ` Steven Rostedt 2013-05-14 20:30 ` Catalin Marinas 2013-05-14 21:10 ` Larry Finger 2013-05-14 21:20 ` Steven Rostedt 2013-05-15 0:57 ` Steven Rostedt 2013-05-15 3:15 ` Larry Finger 2013-05-15 15:02 ` Catalin Marinas 2013-05-15 15:49 ` Toshi Kani 2013-05-15 16:47 ` Catalin Marinas 2013-05-15 17:53 ` Toshi Kani 2013-05-15 20:46 ` Larry Finger 2013-05-15 14:37 ` Catalin Marinas 2013-05-15 19:33 ` Steven Rostedt 2013-05-15 19:46 ` Steven Rostedt 2013-05-16 10:12 ` Catalin Marinas 2013-05-16 23:47 ` Rusty Russell 2013-05-14 20:36 ` Larry Finger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox