From: Chris Friesen <chris.friesen@windriver.com>
To: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: linux-mm@kvack.org
Subject: Re: Oops in slab.c in CentOS kernel, looking for ideas -- correction, it's in slub.c
Date: Wed, 28 Sep 2016 16:10:15 -0600 [thread overview]
Message-ID: <57EC3FC7.8010000@windriver.com> (raw)
In-Reply-To: <20160928051445.GA22706@js1304-P5Q-DELUXE>
On 09/27/2016 11:14 PM, Joonsoo Kim wrote:
> On Tue, Sep 27, 2016 at 12:33:08PM -0600, Chris Friesen wrote:
>> On 09/27/2016 10:12 AM, Chris Friesen wrote:
>>> Basically it appears that __mpol_dup() is failing because the value of
>>> c->freelist in slab_alloc_node() is corrupt, causing the call to
>>> get_freepointer_safe(s, object) to Oops because it tries to dereference
>>> "object + s->offset". (Where s->offset is zero.)
>>>
>>> In the trace, "kmem_cache_alloc+0x87" maps to the following assembly:
>>> 0xffffffff8118be17 <+135>: mov (%r12,%rax,1),%rbx
>>>
>>> This corresponds to this line in get_freepointer():
>>> return *(void **)(object + s->offset);
>>>
>>> In the assembly code, R12 is "object", and RAX is s->offset.
>>>
>>> So the question becomes, why is "object" (which corresponds to c->freelist)
>>> corrupt?
>>>
>>> Looking at the value of R12 (0x1ada8000), it's nonzero but also not a
>>> valid pointer. Does the value mean anything to you? (I'm not really
>>> a memory subsystem guy, so I'm hoping you might have some ideas.)
>>>
>>> Do you have any suggestions on how to track down what's going on here?
>
> Please run with kernel parameter "slub_debug=F" or something.
> See Documentation/vm/slub.txt.
I enabled /sys/kernel/slab/numa_policy/sanity_checks, but that's only going to
maybe help if I can cause another CPU to get into the bad state.
I created a kernel module to walk the list of objects starting at
__this_cpu_ptr(policy_cache->cpu_slab)->freelist.
All other cpus had a freelist value of NULL, or else they pointed at a linked
list which eventually ended with a NULL pointer. ("s->offset" is 0, so
get_freepointer() just dereferences "object") For example:
cpu: 45, object: ffff88046d483cd8->ffff88046d483de0->ffff88046d483ee8->NULL
cpu: 46, object: NULL
In the case of CPU 48, the value of
__this_cpu_ptr(policy_cache->cpu_slab)->freelist was good, but dereferencing it
gave an invalid address:
cpu: 48, object: ffff8804102f0528->000000001ada8000
In the code path that causes problems we call mpol_new(), which calls
kmem_cache_alloc(policy_cache, GFP_KERNEL) and consumes the object at
0xffff8804102f0528. This results in
__this_cpu_ptr(policy_cache->cpu_slab)->freelist being set to
0x000000001ada8000. Then we fork, which calls __mpol_dup() which calls
kmem_cache_alloc(policy_cache, GFP_KERNEL) with 'object' set to
0x000000001ada8000, which segfaults when we try to dereference it in
get_freepointer().
So how do items get added to the freelist? Do they always get added at the
head, or is there a path where they could get added at the tail?
Chris
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-09-28 22:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-27 16:12 Oops in slab.c in CentOS kernel, looking for ideas Chris Friesen
2016-09-27 18:33 ` Oops in slab.c in CentOS kernel, looking for ideas -- correction, it's in slub.c Chris Friesen
2016-09-28 5:14 ` Joonsoo Kim
2016-09-28 22:10 ` Chris Friesen [this message]
2016-09-29 1:46 ` Joonsoo Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57EC3FC7.8010000@windriver.com \
--to=chris.friesen@windriver.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=linux-mm@kvack.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.