]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.4.133/arm-8769-1-kprobes-fix-to-use-get_kprobe_ctlblk-after-irq-disabed.patch
Fixes for 4.19
[thirdparty/kernel/stable-queue.git] / releases / 4.4.133 / arm-8769-1-kprobes-fix-to-use-get_kprobe_ctlblk-after-irq-disabed.patch
1 From 69af7e23a6870df2ea6fa79ca16493d59b3eebeb Mon Sep 17 00:00:00 2001
2 From: Masami Hiramatsu <mhiramat@kernel.org>
3 Date: Sun, 13 May 2018 05:03:54 +0100
4 Subject: ARM: 8769/1: kprobes: Fix to use get_kprobe_ctlblk after irq-disabed
5
6 From: Masami Hiramatsu <mhiramat@kernel.org>
7
8 commit 69af7e23a6870df2ea6fa79ca16493d59b3eebeb upstream.
9
10 Since get_kprobe_ctlblk() uses smp_processor_id() to access
11 per-cpu variable, it hits smp_processor_id sanity check as below.
12
13 [ 7.006928] BUG: using smp_processor_id() in preemptible [00000000] code: swapper/0/1
14 [ 7.007859] caller is debug_smp_processor_id+0x20/0x24
15 [ 7.008438] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.16.0-rc1-00192-g4eb17253e4b5 #1
16 [ 7.008890] Hardware name: Generic DT based system
17 [ 7.009917] [<c0313f0c>] (unwind_backtrace) from [<c030e6d8>] (show_stack+0x20/0x24)
18 [ 7.010473] [<c030e6d8>] (show_stack) from [<c0c64694>] (dump_stack+0x84/0x98)
19 [ 7.010990] [<c0c64694>] (dump_stack) from [<c071ca5c>] (check_preemption_disabled+0x138/0x13c)
20 [ 7.011592] [<c071ca5c>] (check_preemption_disabled) from [<c071ca80>] (debug_smp_processor_id+0x20/0x24)
21 [ 7.012214] [<c071ca80>] (debug_smp_processor_id) from [<c03335e0>] (optimized_callback+0x2c/0xe4)
22 [ 7.013077] [<c03335e0>] (optimized_callback) from [<bf0021b0>] (0xbf0021b0)
23
24 To fix this issue, call get_kprobe_ctlblk() right after
25 irq-disabled since that disables preemption.
26
27 Fixes: 0dc016dbd820 ("ARM: kprobes: enable OPTPROBES for ARM 32")
28 Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
29 Cc: stable@vger.kernel.org
30 Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
31 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
32
33 ---
34 arch/arm/probes/kprobes/opt-arm.c | 3 ++-
35 1 file changed, 2 insertions(+), 1 deletion(-)
36
37 --- a/arch/arm/probes/kprobes/opt-arm.c
38 +++ b/arch/arm/probes/kprobes/opt-arm.c
39 @@ -165,13 +165,14 @@ optimized_callback(struct optimized_kpro
40 {
41 unsigned long flags;
42 struct kprobe *p = &op->kp;
43 - struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
44 + struct kprobe_ctlblk *kcb;
45
46 /* Save skipped registers */
47 regs->ARM_pc = (unsigned long)op->kp.addr;
48 regs->ARM_ORIG_r0 = ~0UL;
49
50 local_irq_save(flags);
51 + kcb = get_kprobe_ctlblk();
52
53 if (kprobe_running()) {
54 kprobes_inc_nmissed_count(&op->kp);