2013-08-12 02:46:14

by Alexandra N. Kossovsky

[permalink] [raw]
Subject: kmemleak in apei_res_add

When running 3.10.3 with kmemleak enabled, I see following warnings from
kmemleak:

unreferenced object 0xffff88024d2219a0 (size 32):
comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
hex dump (first 32 bytes):
58 de 0c 73 02 88 ff ff 58 de 0c 73 02 88 ff ff X..s....X..s....
18 50 fd 7d 00 00 00 00 3f 50 fd 7d 00 00 00 00 .P.}....?P.}....
backtrace:
[<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
[<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
[<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
[<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
[<ffffffff81278faa>] collect_res_callback+0x6d/0x7c
[<ffffffff812788ed>] apei_exec_for_each_entry+0x78/0x93
[<ffffffff8127891d>] apei_exec_collect_resources+0x15/0x17
[<ffffffff81b010e5>] erst_init+0x278/0x2a3
[<ffffffff810020b5>] do_one_initcall+0x7b/0x116
[<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
[<ffffffff813db19f>] kernel_init+0x9/0xd6
[<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
[<ffffffffffffffff>] 0xffffffffffffffff
unreferenced object 0xffff88024d221980 (size 32):
comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
hex dump (first 32 bytes):
68 de 0c 73 02 88 ff ff 68 de 0c 73 02 88 ff ff h..s....h..s....
b2 00 00 00 00 00 00 00 b3 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
[<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
[<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
[<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
[<ffffffff81278faa>] collect_res_callback+0x6d/0x7c
[<ffffffff812788ed>] apei_exec_for_each_entry+0x78/0x93
[<ffffffff8127891d>] apei_exec_collect_resources+0x15/0x17
[<ffffffff81b010e5>] erst_init+0x278/0x2a3
[<ffffffff810020b5>] do_one_initcall+0x7b/0x116
[<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
[<ffffffff813db19f>] kernel_init+0x9/0xd6
[<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
[<ffffffffffffffff>] 0xffffffffffffffff
unreferenced object 0xffff88024d221960 (size 32):
comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
hex dump (first 32 bytes):
00 de 0c 73 02 88 ff ff 40 19 22 4d 02 88 ff ff ...s....@."M....
00 50 09 7e 00 00 00 00 00 90 29 7e 00 00 00 00 .P.~......)~....
backtrace:
[<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
[<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
[<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
[<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
[<ffffffff81278fce>] apei_get_nvs_callback+0x15/0x17
[<ffffffff8125197d>] acpi_nvs_for_each_region+0x25/0x46
[<ffffffff8127903b>] apei_resources_request+0x56/0x217
[<ffffffff81b00f28>] erst_init+0xbb/0x2a3
[<ffffffff810020b5>] do_one_initcall+0x7b/0x116
[<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
[<ffffffff813db19f>] kernel_init+0x9/0xd6
[<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
[<ffffffffffffffff>] 0xffffffffffffffff
unreferenced object 0xffff88024d221940 (size 32):
comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
hex dump (first 32 bytes):
60 19 22 4d 02 88 ff ff 00 de 0c 73 02 88 ff ff `."M.......s....
00 00 37 7f 00 00 00 00 00 60 3f 7f 00 00 00 00 ..7......`?.....
backtrace:
[<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
[<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
[<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
[<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
[<ffffffff81278fce>] apei_get_nvs_callback+0x15/0x17
[<ffffffff8125197d>] acpi_nvs_for_each_region+0x25/0x46
[<ffffffff8127903b>] apei_resources_request+0x56/0x217
[<ffffffff81b00f28>] erst_init+0xbb/0x2a3
[<ffffffff810020b5>] do_one_initcall+0x7b/0x116
[<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
[<ffffffff813db19f>] kernel_init+0x9/0xd6
[<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
[<ffffffffffffffff>] 0xffffffffffffffff


2013-08-21 09:38:32

by Catalin Marinas

[permalink] [raw]
Subject: Re: kmemleak in apei_res_add

On 12 August 2013 03:45, Alexandra N. Kossovsky
<[email protected]> wrote:
> When running 3.10.3 with kmemleak enabled, I see following warnings from
> kmemleak:
>
> unreferenced object 0xffff88024d2219a0 (size 32):
> comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
> hex dump (first 32 bytes):
> 58 de 0c 73 02 88 ff ff 58 de 0c 73 02 88 ff ff X..s....X..s....
> 18 50 fd 7d 00 00 00 00 3f 50 fd 7d 00 00 00 00 .P.}....?P.}....
> backtrace:
> [<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
> [<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
> [<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
> [<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
> [<ffffffff81278faa>] collect_res_callback+0x6d/0x7c
> [<ffffffff812788ed>] apei_exec_for_each_entry+0x78/0x93
> [<ffffffff8127891d>] apei_exec_collect_resources+0x15/0x17
> [<ffffffff81b010e5>] erst_init+0x278/0x2a3
> [<ffffffff810020b5>] do_one_initcall+0x7b/0x116
> [<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
> [<ffffffff813db19f>] kernel_init+0x9/0xd6
> [<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
> [<ffffffffffffffff>] 0xffffffffffffffff

Are there any "APEI:" errors in the kernel log? It could be some
freeing missing on an error path.

apei_res_add() allocates struct apei_res objects and places them on
the erst_resources.{iomem,ioport} list heads as given by erst_init().
The erst_resources is just a local variable on the erst_init() stack,
hence kmemleak doesn't have any trace of the allocated objects.

It looks like erst_init() calls apei_resources_request() which should
merge the local erst_resources list heads with the global
apei_resources_all but for whatever reason, this or any of the
previous calls in erst_init() fail and we don't get the merging. Some
of the goto err_fini in this function should probably be err_release.
I cc'ed Huang as the driver author.

--
Catalin

2013-08-21 13:45:14

by Alexandra N. Kossovsky

[permalink] [raw]
Subject: Re: kmemleak in apei_res_add

On Aug 21 10:38, Catalin Marinas wrote:
> On 12 August 2013 03:45, Alexandra N. Kossovsky
> <[email protected]> wrote:
> > When running 3.10.3 with kmemleak enabled, I see following warnings from
> > kmemleak:
> >
> > unreferenced object 0xffff88024d2219a0 (size 32):
> > comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
> > hex dump (first 32 bytes):
> > 58 de 0c 73 02 88 ff ff 58 de 0c 73 02 88 ff ff X..s....X..s....
> > 18 50 fd 7d 00 00 00 00 3f 50 fd 7d 00 00 00 00 .P.}....?P.}....
> > backtrace:
> > [<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
> > [<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
> > [<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
> > [<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
> > [<ffffffff81278faa>] collect_res_callback+0x6d/0x7c
> > [<ffffffff812788ed>] apei_exec_for_each_entry+0x78/0x93
> > [<ffffffff8127891d>] apei_exec_collect_resources+0x15/0x17
> > [<ffffffff81b010e5>] erst_init+0x278/0x2a3
> > [<ffffffff810020b5>] do_one_initcall+0x7b/0x116
> > [<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
> > [<ffffffff813db19f>] kernel_init+0x9/0xd6
> > [<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
> > [<ffffffffffffffff>] 0xffffffffffffffff
>
> Are there any "APEI:" errors in the kernel log? It could be some
> freeing missing on an error path.

No.
dmesg |grep APEI
[ 9.602274] GHES: APEI firmware first mode is enabled by APEI bit and WHEA _OSC.


--
Alexandra N. Kossovsky
OKTET Labs (http://www.oktetlabs.ru/)
e-mail: [email protected]

2013-08-22 08:44:04

by Huang, Ying

[permalink] [raw]
Subject: Re: kmemleak in apei_res_add

Hi, Alexandra,

On Wed, 2013-08-21 at 17:44 +0400, Alexandra N. Kossovsky wrote:
> On Aug 21 10:38, Catalin Marinas wrote:
> > On 12 August 2013 03:45, Alexandra N. Kossovsky
> > <[email protected]> wrote:
> > > When running 3.10.3 with kmemleak enabled, I see following warnings from
> > > kmemleak:
> > >
> > > unreferenced object 0xffff88024d2219a0 (size 32):
> > > comm "swapper/0", pid 1, jiffies 4294894532 (age 26865.180s)
> > > hex dump (first 32 bytes):
> > > 58 de 0c 73 02 88 ff ff 58 de 0c 73 02 88 ff ff X..s....X..s....
> > > 18 50 fd 7d 00 00 00 00 3f 50 fd 7d 00 00 00 00 .P.}....?P.}....
> > > backtrace:
> > > [<ffffffff813ddf40>] kmemleak_alloc+0x21/0x3e
> > > [<ffffffff8111cb99>] kmemleak_alloc_recursive.constprop.58+0x16/0x18
> > > [<ffffffff8111efac>] kmem_cache_alloc_trace+0xe6/0x12f
> > > [<ffffffff81278f0e>] apei_res_add+0xb9/0xe8
> > > [<ffffffff81278faa>] collect_res_callback+0x6d/0x7c
> > > [<ffffffff812788ed>] apei_exec_for_each_entry+0x78/0x93
> > > [<ffffffff8127891d>] apei_exec_collect_resources+0x15/0x17
> > > [<ffffffff81b010e5>] erst_init+0x278/0x2a3
> > > [<ffffffff810020b5>] do_one_initcall+0x7b/0x116
> > > [<ffffffff81ac9ee7>] kernel_init_freeable+0x13f/0x1cc
> > > [<ffffffff813db19f>] kernel_init+0x9/0xd6
> > > [<ffffffff813fe5bc>] ret_from_fork+0x7c/0xb0
> > > [<ffffffffffffffff>] 0xffffffffffffffff
> >
> > Are there any "APEI:" errors in the kernel log? It could be some
> > freeing missing on an error path.
>
> No.
> dmesg |grep APEI
> [ 9.602274] GHES: APEI firmware first mode is enabled by APEI bit and WHEA _OSC.
>

Can you try the following debug patch, and send me back the output of:

$ dmesg | grep apei_res

Best Regards,
Huang Ying


---
drivers/acpi/apei/apei-base.c | 4 ++++
1 file changed, 4 insertions(+)

--- a/drivers/acpi/apei/apei-base.c
+++ b/drivers/acpi/apei/apei-base.c
@@ -310,6 +310,8 @@ static int apei_res_add(struct list_head
struct apei_res *res, *resn, *res_ins = NULL;
unsigned long end = start + size;

+ pr_info("apei_res_add: %p: %lx - %lx\n", res_list, start, end);
+
if (end <= start)
return 0;
repeat:
@@ -346,6 +348,7 @@ static int apei_res_sub(struct list_head
struct list_head *res_list2)
{
struct apei_res *res1, *resn1, *res2, *res;
+ pr_info("apei_res_sub: %p - %p\n", res_list1, res_list2);
res1 = list_entry(res_list1->next, struct apei_res, list);
resn1 = list_entry(res1->list.next, struct apei_res, list);
while (&res1->list != res_list1) {
@@ -386,6 +389,7 @@ static void apei_res_clean(struct list_h
{
struct apei_res *res, *resn;

+ pr_info("apei_res_clean: %p\n", res_list);
list_for_each_entry_safe(res, resn, res_list, list) {
list_del(&res->list);
kfree(res);

2013-08-23 12:32:18

by Alexandra N. Kossovsky

[permalink] [raw]
Subject: Re: kmemleak in apei_res_add

Hi Huang,

On Aug 22 16:43, Huang Ying wrote:
> Hi, Alexandra,
> Can you try the following debug patch, and send me back the output of:
>
> $ dmesg | grep apei_res

bash$ dmesg |grep apei
[ 9.608829] apei_res_add: ffff8802730cde48: 7dfd5018 - 7dfd5019
[ 9.615354] apei_res_add: ffff8802730cde48: 7dfd5018 - 7dfd5019
[ 9.621595] apei_res_add: ffff8802730cde48: 7dfd5018 - 7dfd5019
[ 9.627915] apei_res_add: ffff8802730cde48: 7dfd5019 - 7dfd501a
[ 9.634363] apei_res_add: ffff8802730cde48: 7dfd501a - 7dfd501e
[ 9.640689] apei_res_add: ffff8802730cde58: b2 - b3
[ 9.646008] apei_res_add: ffff8802730cde48: 7dfd501e - 7dfd501f
[ 9.652320] apei_res_add: ffff8802730cde48: 7dfd501f - 7dfd5020
[ 9.658637] apei_res_add: ffff8802730cde48: 7dfd5020 - 7dfd5028
[ 9.664952] apei_res_add: ffff8802730cde48: 7dfd5028 - 7dfd5030
[ 9.671227] apei_res_add: ffff8802730cde48: 7dfd5030 - 7dfd5032
[ 9.686533] apei_res_add: ffff8802730cde48: 7dfd5018 - 7dfd5019
[ 9.702283] apei_res_add: ffff8802730cde48: 7dfd5032 - 7dfd5033
[ 9.718050] apei_res_add: ffff8802730cde48: 7dfd5032 - 7dfd503a
[ 9.732699] apei_res_add: ffff8802730cde48: 7dfd503a - 7dfd503e
[ 9.747231] apei_res_add: ffff8802730cde48: 7dfd503e - 7dfd503f
[ 9.761822] apei_res_sub: ffff8802730cde48 - ffffffff81a76ee0
[ 9.775718] apei_res_sub: ffff8802730cde58 - ffffffff81a76ef0
[ 9.789058] apei_res_add: ffff8802730cdde8: 7e095000 - 7e299000
[ 9.803780] apei_res_add: ffff8802730cdde8: 7f370000 - 7f3f6000
[ 9.818264] apei_res_sub: ffff8802730cde48 - ffff8802730cdde8
[ 9.831933] apei_res_sub: ffff8802730cde58 - ffff8802730cddf8
[ 9.846091] apei_res_add: ffffffff81a76ee0: 7dfd5018 - 7dfd503f
[ 9.859528] apei_res_add: ffffffff81a76ef0: b2 - b3

I hope it helps.

Alexandra.
--
Alexandra N. Kossovsky
OKTET Labs (http://www.oktetlabs.ru/)
e-mail: [email protected]