]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.6.2/powerpc-fix-vmx-fix-for-memcpy-case.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.6.2 / powerpc-fix-vmx-fix-for-memcpy-case.patch
CommitLineData
bd7abca0
GKH
1From c8adfeccee01ce3de6a7d14fcd4e3be02e27f03c Mon Sep 17 00:00:00 2001
2From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
3Date: Mon, 1 Oct 2012 14:59:13 +0000
4Subject: powerpc: Fix VMX fix for memcpy case
5
6From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
7
8commit c8adfeccee01ce3de6a7d14fcd4e3be02e27f03c upstream.
9
10In 2fae7cdb60240e2e2d9b378afbf6d9fcce8a3890 ("powerpc: Fix VMX in
11interrupt check in POWER7 copy loops"), Anton inadvertently
12introduced a regression for memcpy on POWER7 machines. copyuser and
13memcpy diverge slightly in their use of cr1 (copyuser doesn't use it,
14but memcpy does) and you end up clobbering that register with your fix.
15That results in (taken from an FC18 kernel):
16
17[ 18.824604] Unrecoverable VMX/Altivec Unavailable Exception f20 at c000000000052f40
18[ 18.824618] Oops: Unrecoverable VMX/Altivec Unavailable Exception, sig: 6 [#1]
19[ 18.824623] SMP NR_CPUS=1024 NUMA pSeries
20[ 18.824633] Modules linked in: tg3(+) be2net(+) cxgb4(+) ipr(+) sunrpc xts lrw gf128mul dm_crypt dm_round_robin dm_multipath linear raid10 raid456 async_raid6_recov async_memcpy async_pq raid6_pq async_xor xor async_tx raid1 raid0 scsi_dh_rdac scsi_dh_hp_sw scsi_dh_emc scsi_dh_alua squashfs cramfs
21[ 18.824705] NIP: c000000000052f40 LR: c00000000020b874 CTR: 0000000000000512
22[ 18.824709] REGS: c000001f1fef7790 TRAP: 0f20 Not tainted (3.6.0-0.rc6.git0.2.fc18.ppc64)
23[ 18.824713] MSR: 8000000000009032 <SF,EE,ME,IR,DR,RI> CR: 4802802e XER: 20000010
24[ 18.824726] SOFTE: 0
25[ 18.824728] CFAR: 0000000000000f20
26[ 18.824731] TASK = c000000fa7128400[0] 'swapper/24' THREAD: c000000fa7480000 CPU: 24
27GPR00: 00000000ffffffc0 c000001f1fef7a10 c00000000164edc0 c000000f9b9a8120
28GPR04: c000000f9b9a8124 0000000000001438 0000000000000060 03ffffff064657ee
29GPR08: 0000000080000000 0000000000000010 0000000000000020 0000000000000030
30GPR12: 0000000028028022 c00000000ff25400 0000000000000001 0000000000000000
31GPR16: 0000000000000000 7fffffffffffffff c0000000016b2180 c00000000156a500
32GPR20: c000000f968c7a90 c0000000131c31d8 c000001f1fef4000 c000000001561d00
33GPR24: 000000000000000a 0000000000000000 0000000000000001 0000000000000012
34GPR28: c000000fa5c04f80 00000000000008bc c0000000015c0a28 000000000000022e
35[ 18.824792] NIP [c000000000052f40] .memcpy_power7+0x5a0/0x7c4
36[ 18.824797] LR [c00000000020b874] .pcpu_free_area+0x174/0x2d0
37[ 18.824800] Call Trace:
38[ 18.824803] [c000001f1fef7a10] [c000000000052c14] .memcpy_power7+0x274/0x7c4 (unreliable)
39[ 18.824809] [c000001f1fef7b10] [c00000000020b874] .pcpu_free_area+0x174/0x2d0
40[ 18.824813] [c000001f1fef7bb0] [c00000000020ba88] .free_percpu+0xb8/0x1b0
41[ 18.824819] [c000001f1fef7c50] [c00000000043d144] .throtl_pd_exit+0x94/0xd0
42[ 18.824824] [c000001f1fef7cf0] [c00000000043acf8] .blkg_free+0x88/0xe0
43[ 18.824829] [c000001f1fef7d90] [c00000000018c048] .rcu_process_callbacks+0x2e8/0x8a0
44[ 18.824835] [c000001f1fef7e90] [c0000000000a8ce8] .__do_softirq+0x158/0x4d0
45[ 18.824840] [c000001f1fef7f90] [c000000000025ecc] .call_do_softirq+0x14/0x24
46[ 18.824845] [c000000fa7483650] [c000000000010e80] .do_softirq+0x160/0x1a0
47[ 18.824850] [c000000fa74836f0] [c0000000000a94a4] .irq_exit+0xf4/0x120
48[ 18.824854] [c000000fa7483780] [c000000000020c44] .timer_interrupt+0x154/0x4d0
49[ 18.824859] [c000000fa7483830] [c000000000003be0] decrementer_common+0x160/0x180
50[ 18.824866] --- Exception: 901 at .plpar_hcall_norets+0x84/0xd4
51[ 18.824866] LR = .check_and_cede_processor+0x48/0x80
52[ 18.824871] [c000000fa7483b20] [c00000000007f018] .check_and_cede_processor+0x18/0x80 (unreliable)
53[ 18.824877] [c000000fa7483b90] [c00000000007f104] .dedicated_cede_loop+0x84/0x150
54[ 18.824883] [c000000fa7483c50] [c0000000006bc030] .cpuidle_enter+0x30/0x50
55[ 18.824887] [c000000fa7483cc0] [c0000000006bc9f4] .cpuidle_idle_call+0x104/0x720
56[ 18.824892] [c000000fa7483d80] [c000000000070af8] .pSeries_idle+0x18/0x40
57[ 18.824897] [c000000fa7483df0] [c000000000019084] .cpu_idle+0x1a4/0x380
58[ 18.824902] [c000000fa7483ec0] [c0000000008a4c18] .start_secondary+0x520/0x528
59[ 18.824907] [c000000fa7483f90] [c0000000000093f0] .start_secondary_prolog+0x10/0x14
60[ 18.824911] Instruction dump:
61[ 18.824914] 38840008 90030000 90e30004 38630008 7ca62850 7cc300d0 78c7e102 7cf01120
62[ 18.824923] 78c60660 39200010 39400020 39600030 <7e00200c> 7c0020ce 38840010 409f001c
63[ 18.824935] ---[ end trace 0bb95124affaaa45 ]---
64[ 18.825046] Unrecoverable VMX/Altivec Unavailable Exception f20 at c000000000052d08
65
66I believe the right fix is to make memcpy match usercopy and not use
67cr1.
68
69Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
70Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
71Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
72
73---
74 arch/powerpc/lib/memcpy_power7.S | 4 ++--
75 1 file changed, 2 insertions(+), 2 deletions(-)
76
77--- a/arch/powerpc/lib/memcpy_power7.S
78+++ b/arch/powerpc/lib/memcpy_power7.S
79@@ -239,8 +239,8 @@ _GLOBAL(memcpy_power7)
80 ori r9,r9,1 /* stream=1 */
81
82 srdi r7,r5,7 /* length in cachelines, capped at 0x3FF */
83- cmpldi cr1,r7,0x3FF
84- ble cr1,1f
85+ cmpldi r7,0x3FF
86+ ble 1f
87 li r7,0x3FF
88 1: lis r0,0x0E00 /* depth=7 */
89 sldi r7,r7,7