* [RFC PATCH powerpc] try secondary hash before BUG in kernel_map_linear_page()
@ 2013-02-25 9:29 Li Zhong
2013-04-10 2:21 ` Michael Ellerman
0 siblings, 1 reply; 3+ messages in thread
From: Li Zhong @ 2013-02-25 9:29 UTC (permalink / raw)
To: PowerPC email list; +Cc: Paul Mackerras
This patch tries to fix following issue when CONFIG_DEBUG_PAGEALLOC
is enabled:
[ 543.075675] ------------[ cut here ]------------
[ 543.075701] kernel BUG at arch/powerpc/mm/hash_utils_64.c:1239!
[ 543.075714] Oops: Exception in kernel mode, sig: 5 [#1]
[ 543.075722] PREEMPT SMP NR_CPUS=16 DEBUG_PAGEALLOC NUMA pSeries
[ 543.075741] Modules linked in: binfmt_misc ehea
[ 543.075759] NIP: c000000000036eb0 LR: c000000000036ea4 CTR: c00000000005a594
[ 543.075771] REGS: c0000000a90832c0 TRAP: 0700 Not tainted (3.8.0-next-20130222)
[ 543.075781] MSR: 8000000000029032 <SF,EE,ME,IR,DR,RI> CR: 22224482 XER: 00000000
[ 543.075816] SOFTE: 0
[ 543.075823] CFAR: c00000000004c200
[ 543.075830] TASK = c0000000e506b750[23934] 'cc1' THREAD: c0000000a9080000 CPU: 1
GPR00: 0000000000000001 c0000000a9083540 c000000000c600a8 ffffffffffffffff
GPR04: 0000000000000050 fffffffffffffffa c0000000a90834e0 00000000004ff594
GPR08: 0000000000000001 0000000000000000 000000009592d4d8 c000000000c86854
GPR12: 0000000000000002 c000000006ead300 0000000000a51000 0000000000000001
GPR16: f000000003354380 ffffffffffffffff ffffffffffffff80 0000000000000000
GPR20: 0000000000000001 c000000000c600a8 0000000000000001 0000000000000001
GPR24: 0000000003354380 c000000000000000 0000000000000000 c000000000b65950
GPR28: 0000002000000000 00000000000cd50e 0000000000bf50d9 c000000000c7c230
[ 543.076005] NIP [c000000000036eb0] .kernel_map_pages+0x1e0/0x3f8
[ 543.076016] LR [c000000000036ea4] .kernel_map_pages+0x1d4/0x3f8
[ 543.076025] Call Trace:
[ 543.076033] [c0000000a9083540] [c000000000036ea4] .kernel_map_pages+0x1d4/0x3f8 (unreliable)
[ 543.076053] [c0000000a9083640] [c000000000167638] .get_page_from_freelist+0x6cc/0x8dc
[ 543.076067] [c0000000a9083800] [c000000000167a48] .__alloc_pages_nodemask+0x200/0x96c
[ 543.076082] [c0000000a90839c0] [c0000000001ade44] .alloc_pages_vma+0x160/0x1e4
[ 543.076098] [c0000000a9083a80] [c00000000018ce04] .handle_pte_fault+0x1b0/0x7e8
[ 543.076113] [c0000000a9083b50] [c00000000018d5a8] .handle_mm_fault+0x16c/0x1a0
[ 543.076129] [c0000000a9083c00] [c0000000007bf1dc] .do_page_fault+0x4d0/0x7a4
[ 543.076144] [c0000000a9083e30] [c0000000000090e8] handle_page_fault+0x10/0x30
[ 543.076155] Instruction dump:
[ 543.076163] 7c630038 78631d88 e80a0000 f8410028 7c0903a6 e91f01de e96a0010 e84a0008
[ 543.076192] 4e800421 e8410028 7c7107b4 7a200fe0 <0b000000> 7f63db78 48785781 60000000
[ 543.076224] ---[ end trace bd5807e8d6ae186b ]---
The code is borrowed from that in __hash_page_huge().
Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
---
arch/powerpc/mm/hash_utils_64.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 1b6e127..31c7924 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -1231,11 +1231,28 @@ static void kernel_map_linear_page(unsigned long vaddr, unsigned long lmi)
int ret;
hash = hpt_hash(vpn, PAGE_SHIFT, mmu_kernel_ssize);
+
+repeat:
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr),
mode, HPTE_V_BOLTED,
mmu_linear_psize, mmu_kernel_ssize);
+
+ if (unlikely(ret == -1)) {
+ hpteg = (~hash & htab_hash_mask) * HPTES_PER_GROUP;
+ ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr), mode,
+ HPTE_V_SECONDARY,
+ mmu_linear_psize, mmu_kernel_ssize);
+ if (ret == -1) {
+ if (mftb() & 0x1)
+ hpteg = (hash & htab_hash_mask) *
+ HPTES_PER_GROUP;
+ ppc_md.hpte_remove(hpteg);
+ goto repeat;
+ }
+ }
+
BUG_ON (ret < 0);
spin_lock(&linear_map_hash_lock);
BUG_ON(linear_map_hash_slots[lmi] & 0x80);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [RFC PATCH powerpc] try secondary hash before BUG in kernel_map_linear_page()
2013-02-25 9:29 [RFC PATCH powerpc] try secondary hash before BUG in kernel_map_linear_page() Li Zhong
@ 2013-04-10 2:21 ` Michael Ellerman
2013-04-10 5:29 ` Li Zhong
0 siblings, 1 reply; 3+ messages in thread
From: Michael Ellerman @ 2013-04-10 2:21 UTC (permalink / raw)
To: Li Zhong; +Cc: Paul Mackerras, PowerPC email list
On Mon, Feb 25, 2013 at 05:29:35PM +0800, Li Zhong wrote:
> This patch tries to fix following issue when CONFIG_DEBUG_PAGEALLOC
> is enabled:
>
> [ 543.075675] ------------[ cut here ]------------
> [ 543.075701] kernel BUG at arch/powerpc/mm/hash_utils_64.c:1239!
> [ 543.075714] Oops: Exception in kernel mode, sig: 5 [#1]
So the issue is that kernel_map_linear_page() doesn't try the secondary
hash slot.
> The code is borrowed from that in __hash_page_huge().
It is, and in fact there is another copy in hash_low_64.S - in assembler.
So I think we should at least try and keep ourselves to two
implementations, one in asm and one in C. So can you split it out into a
helper routine called by both kernel_map_linear_page() and
__hash_page_huge() ?
cheers
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFC PATCH powerpc] try secondary hash before BUG in kernel_map_linear_page()
2013-04-10 2:21 ` Michael Ellerman
@ 2013-04-10 5:29 ` Li Zhong
0 siblings, 0 replies; 3+ messages in thread
From: Li Zhong @ 2013-04-10 5:29 UTC (permalink / raw)
To: Michael Ellerman; +Cc: Paul Mackerras, PowerPC email list
On Wed, 2013-04-10 at 12:21 +1000, Michael Ellerman wrote:
> On Mon, Feb 25, 2013 at 05:29:35PM +0800, Li Zhong wrote:
> > This patch tries to fix following issue when CONFIG_DEBUG_PAGEALLOC
> > is enabled:
> >
> > [ 543.075675] ------------[ cut here ]------------
> > [ 543.075701] kernel BUG at arch/powerpc/mm/hash_utils_64.c:1239!
> > [ 543.075714] Oops: Exception in kernel mode, sig: 5 [#1]
Hi Michael,
Thanks for the review.
> So the issue is that kernel_map_linear_page() doesn't try the secondary
> hash slot.
It seems so.
> > The code is borrowed from that in __hash_page_huge().
>
> It is, and in fact there is another copy in hash_low_64.S - in assembler.
>
> So I think we should at least try and keep ourselves to two
> implementations, one in asm and one in C. So can you split it out into a
> helper routine called by both kernel_map_linear_page() and
> __hash_page_huge() ?
OK, I'll try to update it as you suggested.
Thanks, Zhong
> cheers
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-04-10 5:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-02-25 9:29 [RFC PATCH powerpc] try secondary hash before BUG in kernel_map_linear_page() Li Zhong
2013-04-10 2:21 ` Michael Ellerman
2013-04-10 5:29 ` Li Zhong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).