From: Mel Gorman <mgorman@suse.de>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Henrik Rydberg <rydberg@euromail.se>, Jan Kara <jack@suse.cz>,
linux-mm <linux-mm@kvack.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: Oops in 3.7-rc8 isolate_free_pages_block()
Date: Thu, 6 Dec 2012 16:35:11 +0000 [thread overview]
Message-ID: <20121206163511.GB17258@suse.de> (raw)
In-Reply-To: <CA+55aFwuuAQdoBx_R4CaHJp1ZdRTAwG8n1ZfiKmpZUwwZ9iUkw@mail.gmail.com>
On Thu, Dec 06, 2012 at 08:10:13AM -0800, Linus Torvalds wrote:
> Ok, so it's isolate_freepages_block+0x88, and as Jan Kara already
> guessed from just the offset, that is indeed likely the PageBuddy()
> test.
>
> On Thu, Dec 6, 2012 at 7:22 AM, Henrik Rydberg <rydberg@euromail.se> wrote:
> >
> > http://bitmath.org/test/oops-3.7-rc8.jpg
> >
> > ffffffff810a6d6a: eb 1c jmp ffffffff810a6d88 <isolate_freepages_block+0x88>
> > ffffffff810a6d6c: 0f 1f 40 00 nopl 0x0(%rax)
>
> On the first entry to the loop, we jump *into* the loop, over the end
> condition (the compiler has basically turned. And we jump directly to
> the faulting instruction. Looking at the register state, though, we're
> not at the first iteration of the loop, so we don't have to worry
> about that case. The loop itself then starts with:
>
> > ffffffff810a6d70: 48 83 c5 01 add $0x1,%rbp
> > ffffffff810a6d74: 48 83 c3 40 add $0x40,%rbx
>
> The above is the "blockpfn++, cursor++" part of the loop, while the
> test below is the loop condition ("blockpfn < end_pfn"):
>
> > ffffffff810a6d78: 49 39 ed cmp %rbp,%r13
> > ffffffff810a6d7b: 0f 86 cf 00 00 00 jbe ffffffff810a6e50 <isolate_freepages_block+0x150>
>
> From your image, %rbp is 0x070000 and %r13 is 0x0702f9.
>
> The "pfn_valid_within()" test is a no-op because we don't have holes
> in zones on x86, so then we have
>
That thing is not about holes in zones, it's about holes within a
MAX_ORDER_NR_PAGES block but either way it's a no-op x86 and we're not doing
a pfn_valid check in this loop. I didn't look back in time but I have a
vague recollection that this used to be always start with an aligned PFN
but with large amounts of churn since, it's no longer true.
> if (!valid_page)
> valid_page = page;
>
> which generates a test+cmove:
>
> > ffffffff810a6d81: 4d 85 e4 test %r12,%r12
> > ffffffff810a6d84: 4c 0f 44 e3 cmove %rbx,%r12
>
> (which is how we can tell we're not at the beginning: 'valid_page' is
> 0xffffea0001bfbe40, while the current page is 0xffffea0001c00000).
>
> .. and finally the oopsing instruction from PageBuddy(), which is the
> read of the 'page->_mapcount'
>
> > ffffffff810a6d88: 8b 43 18 mov 0x18(%rbx),%eax
> > ffffffff810a6d8b: 83 f8 80 cmp $0xffffff80,%eax
> > ffffffff810a6d8e: 75 e0 jne ffffffff810a6d70 <isolate_freepages_block+0x70>
>
> So yeah, that loop has apparently wandered into la-la-land. end_pfn
> must be somehow wrong.
>
I think we wandered into a hole where there is no valid struct page.
> Mel, does any of this ring a bell (Andrew also added to the cc, since
> the patches came through him).
>
It reminded me of a similar bug in the migration scanner which I mentioned
in the patch elsewhere in the thread but carelessly failed to cc Andrew.
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Mel Gorman <mgorman@suse.de>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Henrik Rydberg <rydberg@euromail.se>, Jan Kara <jack@suse.cz>,
linux-mm <linux-mm@kvack.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: Oops in 3.7-rc8 isolate_free_pages_block()
Date: Thu, 6 Dec 2012 16:35:11 +0000 [thread overview]
Message-ID: <20121206163511.GB17258@suse.de> (raw)
In-Reply-To: <CA+55aFwuuAQdoBx_R4CaHJp1ZdRTAwG8n1ZfiKmpZUwwZ9iUkw@mail.gmail.com>
On Thu, Dec 06, 2012 at 08:10:13AM -0800, Linus Torvalds wrote:
> Ok, so it's isolate_freepages_block+0x88, and as Jan Kara already
> guessed from just the offset, that is indeed likely the PageBuddy()
> test.
>
> On Thu, Dec 6, 2012 at 7:22 AM, Henrik Rydberg <rydberg@euromail.se> wrote:
> >
> > http://bitmath.org/test/oops-3.7-rc8.jpg
> >
> > ffffffff810a6d6a: eb 1c jmp ffffffff810a6d88 <isolate_freepages_block+0x88>
> > ffffffff810a6d6c: 0f 1f 40 00 nopl 0x0(%rax)
>
> On the first entry to the loop, we jump *into* the loop, over the end
> condition (the compiler has basically turned. And we jump directly to
> the faulting instruction. Looking at the register state, though, we're
> not at the first iteration of the loop, so we don't have to worry
> about that case. The loop itself then starts with:
>
> > ffffffff810a6d70: 48 83 c5 01 add $0x1,%rbp
> > ffffffff810a6d74: 48 83 c3 40 add $0x40,%rbx
>
> The above is the "blockpfn++, cursor++" part of the loop, while the
> test below is the loop condition ("blockpfn < end_pfn"):
>
> > ffffffff810a6d78: 49 39 ed cmp %rbp,%r13
> > ffffffff810a6d7b: 0f 86 cf 00 00 00 jbe ffffffff810a6e50 <isolate_freepages_block+0x150>
>
> From your image, %rbp is 0x070000 and %r13 is 0x0702f9.
>
> The "pfn_valid_within()" test is a no-op because we don't have holes
> in zones on x86, so then we have
>
That thing is not about holes in zones, it's about holes within a
MAX_ORDER_NR_PAGES block but either way it's a no-op x86 and we're not doing
a pfn_valid check in this loop. I didn't look back in time but I have a
vague recollection that this used to be always start with an aligned PFN
but with large amounts of churn since, it's no longer true.
> if (!valid_page)
> valid_page = page;
>
> which generates a test+cmove:
>
> > ffffffff810a6d81: 4d 85 e4 test %r12,%r12
> > ffffffff810a6d84: 4c 0f 44 e3 cmove %rbx,%r12
>
> (which is how we can tell we're not at the beginning: 'valid_page' is
> 0xffffea0001bfbe40, while the current page is 0xffffea0001c00000).
>
> .. and finally the oopsing instruction from PageBuddy(), which is the
> read of the 'page->_mapcount'
>
> > ffffffff810a6d88: 8b 43 18 mov 0x18(%rbx),%eax
> > ffffffff810a6d8b: 83 f8 80 cmp $0xffffff80,%eax
> > ffffffff810a6d8e: 75 e0 jne ffffffff810a6d70 <isolate_freepages_block+0x70>
>
> So yeah, that loop has apparently wandered into la-la-land. end_pfn
> must be somehow wrong.
>
I think we wandered into a hole where there is no valid struct page.
> Mel, does any of this ring a bell (Andrew also added to the cc, since
> the patches came through him).
>
It reminded me of a similar bug in the migration scanner which I mentioned
in the patch elsewhere in the thread but carelessly failed to cc Andrew.
next prev parent reply other threads:[~2012-12-06 16:43 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-06 9:17 Oops in 3.7-rc8 isolate_free_pages_block() Henrik Rydberg
2012-12-06 14:48 ` Jan Kara
2012-12-06 14:48 ` Jan Kara
2012-12-06 15:22 ` Henrik Rydberg
2012-12-06 15:22 ` Henrik Rydberg
2012-12-06 16:10 ` Linus Torvalds
2012-12-06 16:10 ` Linus Torvalds
2012-12-06 16:35 ` Mel Gorman [this message]
2012-12-06 16:35 ` Mel Gorman
2012-12-06 16:19 ` Mel Gorman
2012-12-06 16:19 ` Mel Gorman
2012-12-06 16:50 ` Linus Torvalds
2012-12-06 16:50 ` Linus Torvalds
2012-12-06 17:55 ` Mel Gorman
2012-12-06 17:55 ` Mel Gorman
2012-12-06 18:19 ` Linus Torvalds
2012-12-06 18:19 ` Linus Torvalds
2012-12-06 18:21 ` Mel Gorman
2012-12-06 18:21 ` Mel Gorman
2012-12-06 18:32 ` Henrik Rydberg
2012-12-06 18:32 ` Henrik Rydberg
2012-12-06 18:41 ` Linus Torvalds
2012-12-06 18:41 ` Linus Torvalds
2012-12-06 19:01 ` Mel Gorman
2012-12-06 19:01 ` Mel Gorman
2012-12-06 19:28 ` Henrik Rydberg
2012-12-06 19:28 ` Henrik Rydberg
2012-12-06 19:38 ` Linus Torvalds
2012-12-06 19:38 ` Linus Torvalds
2012-12-06 21:39 ` Henrik Rydberg
2012-12-06 21:39 ` Henrik Rydberg
2012-12-07 8:32 ` Mel Gorman
2012-12-07 8:32 ` Mel Gorman
2012-12-06 16:58 ` Henrik Rydberg
2012-12-06 16:58 ` Henrik Rydberg
2012-12-06 17:22 ` Henrik Rydberg
2012-12-06 17:22 ` Henrik Rydberg
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=20121206163511.GB17258@suse.de \
--to=mgorman@suse.de \
--cc=akpm@linux-foundation.org \
--cc=jack@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rydberg@euromail.se \
--cc=torvalds@linux-foundation.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.