]>
Commit | Line | Data |
---|---|---|
bd7abca0 GKH |
1 | From c8adfeccee01ce3de6a7d14fcd4e3be02e27f03c Mon Sep 17 00:00:00 2001 |
2 | From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com> | |
3 | Date: Mon, 1 Oct 2012 14:59:13 +0000 | |
4 | Subject: powerpc: Fix VMX fix for memcpy case | |
5 | ||
6 | From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com> | |
7 | ||
8 | commit c8adfeccee01ce3de6a7d14fcd4e3be02e27f03c upstream. | |
9 | ||
10 | In 2fae7cdb60240e2e2d9b378afbf6d9fcce8a3890 ("powerpc: Fix VMX in | |
11 | interrupt check in POWER7 copy loops"), Anton inadvertently | |
12 | introduced a regression for memcpy on POWER7 machines. copyuser and | |
13 | memcpy diverge slightly in their use of cr1 (copyuser doesn't use it, | |
14 | but memcpy does) and you end up clobbering that register with your fix. | |
15 | That 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 | |
27 | GPR00: 00000000ffffffc0 c000001f1fef7a10 c00000000164edc0 c000000f9b9a8120 | |
28 | GPR04: c000000f9b9a8124 0000000000001438 0000000000000060 03ffffff064657ee | |
29 | GPR08: 0000000080000000 0000000000000010 0000000000000020 0000000000000030 | |
30 | GPR12: 0000000028028022 c00000000ff25400 0000000000000001 0000000000000000 | |
31 | GPR16: 0000000000000000 7fffffffffffffff c0000000016b2180 c00000000156a500 | |
32 | GPR20: c000000f968c7a90 c0000000131c31d8 c000001f1fef4000 c000000001561d00 | |
33 | GPR24: 000000000000000a 0000000000000000 0000000000000001 0000000000000012 | |
34 | GPR28: 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 | ||
66 | I believe the right fix is to make memcpy match usercopy and not use | |
67 | cr1. | |
68 | ||
69 | Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com> | |
70 | Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> | |
71 | Signed-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 |