Discussion:
incomplete mips patch made 3.10.55, remains broken in 3.10.58
Alexandre Oliva
2014-10-16 06:57:33 UTC
Permalink
Greg,

Commit ff522058bd717506b2fa066fa564657f2b86477e was merged into 3.10.55
stable as commit 4f91cb537d2f7fa700a2b6d86a2cc77d20ee2616.

Without the complement, commit 5596b0b245fb9d2cefb5023b11061050351c1398,
included below, cache invalidation functions modified by the former
patch may return between preempt_disable() and preempt_enable(), causing
such machines as yeeloongs to go down in flames early in the boot.

The complement patch had already made v3.12-rc4, and it's quite
obviously needed and correct. I've also tested that it fixes the
regression on the yeeloong.

So, would you please merge it into the 3.10 stable series, at your
earlier convenience, so as to fix this regression?

Thanks in advance,
Ralf Baechle
2014-10-23 13:45:13 UTC
Permalink
Greg, please apply.

Thanks,

Ralf
Post by Alexandre Oliva
Commit ff522058bd717506b2fa066fa564657f2b86477e was merged into 3.10.55
stable as commit 4f91cb537d2f7fa700a2b6d86a2cc77d20ee2616.
Without the complement, commit 5596b0b245fb9d2cefb5023b11061050351c1398,
included below, cache invalidation functions modified by the former
patch may return between preempt_disable() and preempt_enable(), causing
such machines as yeeloongs to go down in flames early in the boot.
The complement patch had already made v3.12-rc4, and it's quite
obviously needed and correct. I've also tested that it fixes the
regression on the yeeloong.
So, would you please merge it into the 3.10 stable series, at your
earlier convenience, so as to fix this regression?
Thanks in advance,
From 5596b0b245fb9d2cefb5023b11061050351c1398 Mon Sep 17 00:00:00 2001
Date: Wed, 2 Oct 2013 15:03:03 +0900
Subject: [PATCH] MIPS: Fix forgotten preempt_enable() when CPU has inclusive
pcaches
[ 1.904000] BUG: scheduling while atomic: swapper/1/0x00000002
[ 1.916000] CPU: 0 PID: 1 Comm: swapper Not tainted 3.12.0-rc2-lemote-los.git-5318619-dirty #1
[ 1.920000] Stack : 0000000031aac000 ffffffff810d0000 0000000000000052 ffffffff802730a4
0000000000000000 0000000000000001 ffffffff810cdf90 ffffffff810d0000
ffffffff8068b968 ffffffff806f5537 ffffffff810cdf90 980000009f0782e8
0000000000000001 ffffffff80720000 ffffffff806b0000 980000009f078000
980000009f290000 ffffffff805f312c 980000009f05b5d8 ffffffff80233518
980000009f05b5e8 ffffffff80274b7c 980000009f078000 ffffffff8068b968
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 980000009f05b520 0000000000000000 ffffffff805f2f6c
0000000000000000 ffffffff80700000 ffffffff80700000 ffffffff806fc758
ffffffff80700000 ffffffff8020be98 ffffffff806fceb0 ffffffff805f2f6c
...
[ 2.032000] [<ffffffff8020be98>] show_stack+0x80/0x98
[ 2.036000] [<ffffffff805f2f6c>] __schedule_bug+0x44/0x6c
[ 2.040000] [<ffffffff805fac58>] __schedule+0x518/0x5b0
[ 2.044000] [<ffffffff805f8a58>] schedule_timeout+0x128/0x1f0
[ 2.048000] [<ffffffff80240314>] msleep+0x3c/0x60
[ 2.052000] [<ffffffff80495400>] do_probe+0x238/0x3a8
[ 2.056000] [<ffffffff804958b0>] ide_probe_port+0x340/0x7e8
[ 2.060000] [<ffffffff80496028>] ide_host_register+0x2d0/0x7a8
[ 2.064000] [<ffffffff8049c65c>] ide_pci_init_two+0x4e4/0x790
[ 2.068000] [<ffffffff8049f9b8>] amd74xx_probe+0x148/0x2c8
[ 2.072000] [<ffffffff803f571c>] pci_device_probe+0xc4/0x130
[ 2.076000] [<ffffffff80478f60>] driver_probe_device+0x98/0x270
[ 2.080000] [<ffffffff80479298>] __driver_attach+0xe0/0xe8
[ 2.084000] [<ffffffff80476ab0>] bus_for_each_dev+0x78/0xe0
[ 2.088000] [<ffffffff80478468>] bus_add_driver+0x230/0x310
[ 2.092000] [<ffffffff80479b44>] driver_register+0x84/0x158
[ 2.096000] [<ffffffff80200504>] do_one_initcall+0x104/0x160
Patchwork: https://patchwork.linux-mips.org/patch/5941/
---
arch/mips/mm/c-r4k.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index 627883b..bc6f96f 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -609,6 +609,7 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
r4k_blast_scache();
else
blast_scache_range(addr, addr + size);
+ preempt_enable();
__sync();
return;
}
@@ -650,6 +651,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
*/
blast_inv_scache_range(addr, addr + size);
}
+ preempt_enable();
__sync();
return;
}
--
1.9.3
--
Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/ FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer
Ralf

Loading...