Patch "powerpc/jprobes: Disable preemption when triggered through ftrace" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
powerpc/jprobes: Disable preemption when triggered through ftrace
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
powerpc-jprobes-disable-preemption-when-triggered-through-ftrace.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6baea433bc84cd148af1c524389a8d756f67412eMon Sep 17 00:00:00 2001
From: "Naveen N. Rao" <[email protected]>
Date: Fri, 22 Sep 2017 14:40:47 +0530
Subject: powerpc/jprobes: Disable preemption when triggered through ftrace
From: Naveen N. Rao <[email protected]>
commit 6baea433bc84cd148af1c524389a8d756f67412e upstream.
KPROBES_SANITY_TEST throws the below splat when CONFIG_PREEMPT is enabled:
Kprobe smoke test: started
DEBUG_LOCKS_WARN_ON(val > preempt_count())
------------[ cut here ]------------
WARNING: CPU: 19 PID: 1 at kernel/sched/core.c:3094 preempt_count_sub+0xcc/0x140
Modules linked in:
CPU: 19 PID: 1 Comm: swapper/0 Not tainted 4.13.0-rc7-nnr+ #97
task: c0000000fea80000 task.stack: c0000000feb00000
NIP: c00000000011d3dc LR: c00000000011d3d8 CTR: c000000000a090d0
REGS: c0000000feb03400 TRAP: 0700 Not tainted (4.13.0-rc7-nnr+)
MSR: 8000000000021033 <SF,ME,IR,DR,RI,LE> CR: 28000282 XER: 00000000
CFAR: c00000000015aa18 SOFTE: 0
<snip>
NIP preempt_count_sub+0xcc/0x140
LR preempt_count_sub+0xc8/0x140
Call Trace:
preempt_count_sub+0xc8/0x140 (unreliable)
kprobe_handler+0x228/0x4b0
program_check_exception+0x58/0x3b0
program_check_common+0x16c/0x170
--- interrupt: 0 at kprobe_target+0x8/0x20
LR = init_test_probes+0x248/0x7d0
kp+0x0/0x80 (unreliable)
livepatch_handler+0x38/0x74
init_kprobes+0x1d8/0x208
do_one_initcall+0x68/0x1d0
kernel_init_freeable+0x298/0x374
kernel_init+0x24/0x160
ret_from_kernel_thread+0x5c/0x70
Instruction dump:
419effdc 3d22001b 39299240 81290000 2f890000 409effc8 3c82ffcb 3c62ffcb
3884bc68 3863bc18 4803d5fd 60000000 <0fe00000> 4bffffa8 60000000 60000000
---[ end trace 432dd46b4ce3d29f ]---
Kprobe smoke test: passed successfullyThe issue is that we aren't disabling preemption in kprobe_ftrace_handler(). Disable it.
--- arch/powerpc/kernel/kprobes-ftrace.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
arch/powerpc/kernel/kprobes-ftrace.c +11 -4
@@ -65,6 +65,7 @@ void kprobe_ftrace_handler(unsigned long/* Disable irq for emulating a breakpoint and avoiding preempt */ local_irq_save (flags);hard_irq_disable (); +preempt_disable (); p =get_kprobe ((kprobe_opcode_t *)nip);if (unlikely (!p) ||kprobe_disabled (p))
@@ -86,12 +87,18 @@ void kprobe_ftrace_handler(unsigned long kcb->kprobe_status =KPROBE_HIT_ACTIVE ;if (!p->pre_handler || !p->pre_handler (p, regs))__skip_singlestep (p, regs, kcb, orig_nip); -/* -* If pre_handler returns !0, it sets regs->nip and -* resets current kprobe. -*/ +else { +/* +* If pre_handler returns !0, it sets regs->nip and +* resets current kprobe. In this case, we still need +* to restore irq, but not preemption. +*/ +local_irq_restore (flags); +return ; + } } end: +preempt_enable_no_resched ();local_irq_restore (flags); }NOKPROBE_SYMBOL (kprobe_ftrace_handler);
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/kprobes-use-synchronize_rcu_tasks-for-optprobe-with-config_preempt-y.patch queue-4.14/powerpc-kprobes-disable-preemption-before-invoking-probe-handler-for-optprobes.patch queue-4.14/powerpc-jprobes-disable-preemption-when-triggered-through-ftrace.patch