Message ID | 20210330021440.44280b7f@xhacker (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | riscv: kprobes/ftrace: Add recursion protection to the ftrace callback | expand |
On Tue, 30 Mar 2021 02:14:40 +0800 Jisheng Zhang <jszhang3@mail.ustc.edu.cn> wrote: > From: Jisheng Zhang <jszhang@kernel.org> > > Currently, the riscv's kprobes(powerred by ftrace) handler is > preemptible. Futher check indicates we miss something similar as the > commit c536aa1c5b17 ("kprobes/ftrace: Add recursion protection to the > ftrace callback"), so do similar modifications as the commit does. > > Fixes: 829adda597fe ("riscv: Add KPROBES_ON_FTRACE supported") > Signed-off-by: Jisheng Zhang <jszhang@kernel.org> Looks fine to me. Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> -- Steve
On Mon, 29 Mar 2021 11:14:40 PDT (-0700), jszhang3@mail.ustc.edu.cn wrote: > From: Jisheng Zhang <jszhang@kernel.org> > > Currently, the riscv's kprobes(powerred by ftrace) handler is > preemptible. Futher check indicates we miss something similar as the > commit c536aa1c5b17 ("kprobes/ftrace: Add recursion protection to the > ftrace callback"), so do similar modifications as the commit does. > > Fixes: 829adda597fe ("riscv: Add KPROBES_ON_FTRACE supported") > Signed-off-by: Jisheng Zhang <jszhang@kernel.org> > --- > arch/riscv/kernel/probes/ftrace.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/arch/riscv/kernel/probes/ftrace.c b/arch/riscv/kernel/probes/ftrace.c > index 17ca5e923bb0..aab85a82f419 100644 > --- a/arch/riscv/kernel/probes/ftrace.c > +++ b/arch/riscv/kernel/probes/ftrace.c > @@ -9,10 +9,16 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, > struct kprobe *p; > struct pt_regs *regs; > struct kprobe_ctlblk *kcb; > + int bit; > > + bit = ftrace_test_recursion_trylock(ip, parent_ip); > + if (bit < 0) > + return; > + > + preempt_disable_notrace(); > p = get_kprobe((kprobe_opcode_t *)ip); > if (unlikely(!p) || kprobe_disabled(p)) > - return; > + goto out; > > regs = ftrace_get_regs(fregs); > kcb = get_kprobe_ctlblk(); > @@ -45,6 +51,9 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, > */ > __this_cpu_write(current_kprobe, NULL); > } > +out: > + preempt_enable_notrace(); > + ftrace_test_recursion_unlock(bit); > } > NOKPROBE_SYMBOL(kprobe_ftrace_handler); Thanks, this is on fixes.
diff --git a/arch/riscv/kernel/probes/ftrace.c b/arch/riscv/kernel/probes/ftrace.c index 17ca5e923bb0..aab85a82f419 100644 --- a/arch/riscv/kernel/probes/ftrace.c +++ b/arch/riscv/kernel/probes/ftrace.c @@ -9,10 +9,16 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, struct kprobe *p; struct pt_regs *regs; struct kprobe_ctlblk *kcb; + int bit; + bit = ftrace_test_recursion_trylock(ip, parent_ip); + if (bit < 0) + return; + + preempt_disable_notrace(); p = get_kprobe((kprobe_opcode_t *)ip); if (unlikely(!p) || kprobe_disabled(p)) - return; + goto out; regs = ftrace_get_regs(fregs); kcb = get_kprobe_ctlblk(); @@ -45,6 +51,9 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, */ __this_cpu_write(current_kprobe, NULL); } +out: + preempt_enable_notrace(); + ftrace_test_recursion_unlock(bit); } NOKPROBE_SYMBOL(kprobe_ftrace_handler);