]>
Commit | Line | Data |
---|---|---|
931f3697 GKH |
1 | From foo@baz Tue Oct 28 11:19:22 CST 2014 |
2 | From: "David S. Miller" <davem@davemloft.net> | |
3 | Date: Sat, 4 Oct 2014 21:05:14 -0700 | |
4 | Subject: sparc64: Fix reversed start/end in flush_tlb_kernel_range() | |
5 | ||
6 | From: "David S. Miller" <davem@davemloft.net> | |
7 | ||
8 | [ Upstream commit 473ad7f4fb005d1bb727e4ef27d370d28703a062 ] | |
9 | ||
10 | When we have to split up a flush request into multiple pieces | |
11 | (in order to avoid the firmware range) we don't specify the | |
12 | arguments in the right order for the second piece. | |
13 | ||
14 | Fix the order, or else we get hangs as the code tries to | |
15 | flush "a lot" of entries and we get lockups like this: | |
16 | ||
17 | [ 4422.981276] NMI watchdog: BUG: soft lockup - CPU#12 stuck for 23s! [expect:117032] | |
18 | [ 4422.996130] Modules linked in: ipv6 loop usb_storage igb ptp sg sr_mod ehci_pci ehci_hcd pps_core n2_rng rng_core | |
19 | [ 4423.016617] CPU: 12 PID: 117032 Comm: expect Not tainted 3.17.0-rc4+ #1608 | |
20 | [ 4423.030331] task: fff8003cc730e220 ti: fff8003d99d54000 task.ti: fff8003d99d54000 | |
21 | [ 4423.045282] TSTATE: 0000000011001602 TPC: 00000000004521e8 TNPC: 00000000004521ec Y: 00000000 Not tainted | |
22 | [ 4423.064905] TPC: <__flush_tlb_kernel_range+0x28/0x40> | |
23 | [ 4423.074964] g0: 000000000052fd10 g1: 00000001295a8000 g2: ffffff7176ffc000 g3: 0000000000002000 | |
24 | [ 4423.092324] g4: fff8003cc730e220 g5: fff8003dfedcc000 g6: fff8003d99d54000 g7: 0000000000000006 | |
25 | [ 4423.109687] o0: 0000000000000000 o1: 0000000000000000 o2: 0000000000000003 o3: 00000000f0000000 | |
26 | [ 4423.127058] o4: 0000000000000080 o5: 00000001295a8000 sp: fff8003d99d56d01 ret_pc: 000000000052ff54 | |
27 | [ 4423.145121] RPC: <__purge_vmap_area_lazy+0x314/0x3a0> | |
28 | [ 4423.155185] l0: 0000000000000000 l1: 0000000000000000 l2: 0000000000a38040 l3: 0000000000000000 | |
29 | [ 4423.172559] l4: fff8003dae8965e0 l5: ffffffffffffffff l6: 0000000000000000 l7: 00000000f7e2b138 | |
30 | [ 4423.189913] i0: fff8003d99d576a0 i1: fff8003d99d576a8 i2: fff8003d99d575e8 i3: 0000000000000000 | |
31 | [ 4423.207284] i4: 0000000000008008 i5: fff8003d99d575c8 i6: fff8003d99d56df1 i7: 0000000000530c24 | |
32 | [ 4423.224640] I7: <free_vmap_area_noflush+0x64/0x80> | |
33 | [ 4423.234193] Call Trace: | |
34 | [ 4423.239051] [0000000000530c24] free_vmap_area_noflush+0x64/0x80 | |
35 | [ 4423.251029] [0000000000531a7c] remove_vm_area+0x5c/0x80 | |
36 | [ 4423.261628] [0000000000531b80] __vunmap+0x20/0x120 | |
37 | [ 4423.271352] [000000000071cf18] n_tty_close+0x18/0x40 | |
38 | [ 4423.281423] [00000000007222b0] tty_ldisc_close+0x30/0x60 | |
39 | [ 4423.292183] [00000000007225a4] tty_ldisc_reinit+0x24/0xa0 | |
40 | [ 4423.303120] [0000000000722ab4] tty_ldisc_hangup+0xd4/0x1e0 | |
41 | [ 4423.314232] [0000000000719aa0] __tty_hangup+0x280/0x3c0 | |
42 | [ 4423.324835] [0000000000724cb4] pty_close+0x134/0x1a0 | |
43 | [ 4423.334905] [000000000071aa24] tty_release+0x104/0x500 | |
44 | [ 4423.345316] [00000000005511d0] __fput+0x90/0x1e0 | |
45 | [ 4423.354701] [000000000047fa54] task_work_run+0x94/0xe0 | |
46 | [ 4423.365126] [0000000000404b44] __handle_signal+0xc/0x2c | |
47 | ||
48 | Fixes: 4ca9a23765da ("sparc64: Guard against flushing openfirmware mappings.") | |
49 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
50 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
51 | --- | |
52 | arch/sparc/mm/init_64.c | 4 ++-- | |
53 | 1 file changed, 2 insertions(+), 2 deletions(-) | |
54 | ||
55 | --- a/arch/sparc/mm/init_64.c | |
56 | +++ b/arch/sparc/mm/init_64.c | |
57 | @@ -2725,8 +2725,8 @@ void flush_tlb_kernel_range(unsigned lon | |
58 | do_flush_tlb_kernel_range(start, LOW_OBP_ADDRESS); | |
59 | } | |
60 | if (end > HI_OBP_ADDRESS) { | |
61 | - flush_tsb_kernel_range(end, HI_OBP_ADDRESS); | |
62 | - do_flush_tlb_kernel_range(end, HI_OBP_ADDRESS); | |
63 | + flush_tsb_kernel_range(HI_OBP_ADDRESS, end); | |
64 | + do_flush_tlb_kernel_range(HI_OBP_ADDRESS, end); | |
65 | } | |
66 | } else { | |
67 | flush_tsb_kernel_range(start, end); |