Thread (8 messages) 8 messages, 3 authors, 2011-02-24

Re: [Bug 29772] New: memory compaction crashed

From: Mel Gorman <hidden>
Date: 2011-02-24 15:06:36

On Thu, Feb 24, 2011 at 12:25:50PM +0100, Johannes Berg wrote:
On Thu, 2011-02-24 at 10:37 +0000, Mel Gorman wrote:
quoted
quoted
Yes. I was using evince to pan around in a fairly large PDF that really
is a large single-page bitmap, but that's about it. I also have a fairly
large (bit more than full HD) external monitor, both of these probably
take some amount of memory. The system had been up for a while few hours
at most, with similar workloads, sometimes a kernel compile (but none
was running at the time).
quoted
Is this reproducible or did it just happen the once?
It happened only once so far. And it wasn't the first time I was doing
this (panning large files) either.
quoted
quoted
quoted
Can you tell me what line the instruction ffffffff8100f1c2 corresponds to? If
you have CONFIG_DEBUG_INFO set, it should be a case of telling me what the
output of "addr2line -e vmlinux 0xffffffff8100f1c2" is. On a similar note,
do you know what sort of crash this was? i.e. was it a NULL deference or
did a VM_BUG_ON or BUG_ON hit such as VM_BUG_ON(PageTransCompound(page))?
Was CONFIG_DEBUG_VM set? Actually, it would be preferable to have the
whole .config attached to the bugzilla if possible please.
Attached the config. addr2line failed so I probably don't have enough
debug info,
Indeed not, can you enable CONFIG_DEBUG_INFO for future reference
please? It'll be easier to figure out where things crashed exactly.
Also, what compiler are you using?
$ gcc --version
gcc-4.5.real (Debian 4.5.2-2) 4.5.2

I thought I had DEBUG_INFO, but I just checked in my .config and I it
seems not. My mistake. Is DEBUG_INFO_REDUCED=y acceptable? From
experience, not setting that takes an order of magnitude longer to
compile on my laptop.
It's not something I use myself but if you run objdump on vmlinux, see
if there is symbolic names against things like "call" and see if
addr2line works. If yes, then it's enough information.
quoted
quoted
ffffffff8110f197:       48 81 c3 ff 07 00 00    add    $0x7ff,%rbx
ffffffff8110f19e:       4c 89 45 a0             mov    %r8,-0x60(%rbp)
ffffffff8110f1a2:       48 81 e3 00 fc ff ff    and    $0xfffffffffffffc00,%rbx
ffffffff8110f1a9:       48 ff cb                dec    %rbx
ffffffff8110f1ac:       0f 1f 40 00             nopl   0x0(%rax)
ffffffff8110f1b0:       48 ff c3                inc    %rbx
ffffffff8110f1b3:       49 39 de                cmp    %rbx,%r14
ffffffff8110f1b6:       76 58                   jbe    0xffffffff8110f210
ffffffff8110f1b8:       48 6b cb 38             imul   $0x38,%rbx,%rcx
ffffffff8110f1bc:       49 ff c4                inc    %r12
ffffffff8110f1bf:       4c 01 f9                add    %r15,%rcx
ffffffff8110f1c2:****   8b 41 0c                mov    0xc(%rcx),%eax
ffffffff8110f1c5:       83 f8 fe                cmp    $0xfffffffffffffffe,%eax
ffffffff8110f1c8:       74 e6                   je     0xffffffff8110f1b0
ffffffff8110f1ca:       41 80 7d 40 00          cmpb   $0x0,0x40(%r13)
ffffffff8110f1cf:       74 8f                   je     0xffffffff8110f160
ffffffff8110f1d1:       48 8b 01                mov    (%rcx),%rax
ffffffff8110f1d4:       a8 20                   test   $0x20,%al
ffffffff8110f1d6:       74 d8                   je     0xffffffff8110f1b0

(this matches the Code: in the picture) which means it was some sort of
bad pointer dereference since %rcx is 0xffffea0000a00000 (I think). That
almost seems like a valid pointer, hmm.
I believe this corresponds to;

        for (; low_pfn < end_pfn; low_pfn++) {
                struct page *page;
                if (!pfn_valid_within(low_pfn))
                        continue;
                nr_scanned++;

                /* Get the page and skip if free */
                page = pfn_to_page(low_pfn);
                if (PageBuddy(page))			<----- HERE
                        continue;

rcx is storing a struct page pointer and the 0xc offset is the _mapcount.
It should be "impossible" for this page to be invalid though so I'm wondering
if there is some other memory corruption going on.
Possible. I had some graphics issues with X hanging once a while, but
with all of those I could still ssh in and reboot the machine.
It could very well be related with the main difference being that
compaction blew up with interrupts disabled taking down the whole
machine. Have you a reproduction case for the X hangs?

It might also be worth running memtest on the machine just in case but I
find it doubtful that it's the problem. A buggy graphics driver feels
more likely. Are you running anything like compiz? If yes, are the
hangs still reproducible with it disabled?
quoted
quoted
Also,
since I was working on the kernel and didn't make a snapshot, I rebuilt
the image using the attached config. That shouldn't change anything
(went back to the same sources), but still -- FYI.
Can you also enable;

CONFIG_DEBUG_INFO
CONFIG_DEBUG_VM

If this works for you, also enable

CONFIG_DEBUG_PAGEALLOC

The last option should work but it'll also slow your machine quite a
bit.
Ok, I'll give it a try.
Thanks. With luck, it'll show up a driver that is corrupting memory.
quoted
quoted
quoted
However, I can't see what this corresponds to. eac0466 is not a commit I
can identify and the "dirty" implies that it's patched. How does this
kernel differ from mainline?
The "-wl" indicates that it's a wireless-testing kernel (John Linville's
repository), but I'm using iwlwifi-2.6 right now. The -dirty indicates
that I've played with it, but only in the wireless code; the diffstat
between this and rc6 indicates that only wireless, bluetooth and some
tiny arch/arm changes are in here.
There is a chance this is a driver bug that is corrupting memory. With
the debug options above, it would be worth trying to stress the machine
with network traffic with mainline, the wireless testing tree and
iwlwifi-2.6 (out of tree driver?) and see does each behave differently.
I'd agree, but it's unlikely to be network -- my laptop doesn't even
have iwlwifi hardware (which iwlwifi-2.6 contains, not out of tree, but
our development tree, I just run it out of habit); and I wasn't even
using wireless at all; networking itself and ethernet drivers are
untouched in this tree.
Ok, good to know. Right now I am leaning towards a buggy graphics driver
or X server is corrupting memory and compaction suffered particularly
badly from it.

-- 
Mel Gorman
SUSE Labs

--
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/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help