Re: sparc64, mm BUG in 3.9-rc8

From: David Miller
Date: Wed Apr 24 2013 - 19:53:57 EST


From: David Miller <davem@xxxxxxxxxxxxx>
Date: Wed, 24 Apr 2013 14:36:15 -0400 (EDT)

> From: David Miller <davem@xxxxxxxxxxxxx>
> Date: Tue, 23 Apr 2013 16:17:51 -0400 (EDT)
>
>> From: Meelis Roos <mroos@xxxxxxxx>
>> Date: Tue, 23 Apr 2013 00:19:49 +0300 (EEST)
>>
>>>> > Hello, I got a non-booting Sun E420R (sparc64) with 3.9-rc8: BUG-s in
>>>> > mm/slub.c:925 and mm/memory.c:1267 (the latter keeps scrolling until
>>>> > other things break and panic comes from trying to kill init). This is
>>>> > reproducible. Same machine runs 3.9.0-rc7-00004-gbb33db7 successfully.
>>>> > Configuration is below.
>>>>
>>>> It's certainly a bug in the TLB shootdown fix, please verify that
>>>> reverting the following fixes things:
>>>>
>>>> >From f36391d2790d04993f48da6a45810033a2cdf847 Mon Sep 17 00:00:00 2001
>>>> From: "David S. Miller" <davem@xxxxxxxxxxxxx>
>>>> Date: Fri, 19 Apr 2013 17:26:26 -0400
>>>> Subject: [PATCH] sparc64: Fix race in TLB batch processing.
>>>
>>> Yes, reverting that makes it work again.
>>
>> Just an update, using your config I was able to make one that boots on my
>> machine and reproduces the problem.
>
> Ok, I've narrowed it down to CONFIG_DEBUG_ATOMIC_SLEEP, as the exact config
> option which starts the crashes happening when it is enabled.
>
> I should have this fixed by the end of today.

This fixes it, I'll push this to Linus immediately.

Thanks for your report!

--------------------
sparc64: Fix missing put_cpu_var() in tlb_batch_add_one() when not batching.

Reported-by: Meelis Roos <mroos@xxxxxxxx>
Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
---
arch/sparc/mm/tlb.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c
index 272aa4f..83d89bc 100644
--- a/arch/sparc/mm/tlb.c
+++ b/arch/sparc/mm/tlb.c
@@ -87,7 +87,7 @@ static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
if (!tb->active) {
global_flush_tlb_page(mm, vaddr);
flush_tsb_user_page(mm, vaddr);
- return;
+ goto out;
}

if (nr == 0)
@@ -98,6 +98,7 @@ static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
if (nr >= TLB_BATCH_NR)
flush_tlb_pending();

+out:
put_cpu_var(tlb_batch);
}

--
1.8.1.2


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/