On Tue, 20 Aug 2019 09:01:30 +0900 Masami Hiramatsu wrote: > > Hi Jisheng,
Hi, > > On Mon, 19 Aug 2019 11:36:09 +0000 > Jisheng Zhang <jisheng.zh...@synaptics.com> wrote: > > > For KPROBES_ON_FTRACE case, we need to adjust the kprobe's addr > > correspondingly. > > No, I think you have misunderstood what the ftrace_call_adjust() does. > Ftrace's rec->ip is already adjusted when initializing it. Kprobes > checks the list after initialized (adjusted). So you don't need to > adjust it again. This is not to adjust the ftarce's rec->ip, but to adjust the struct kprobe addr member. Because check_kprobe_address_safe()=>arch_check_ftrace_location will check the kprobe's addr with ftrace's rec->ip. Since ftrace's rec->ip is already adjusted, there will be mismatch if we don't adjust kprobe's addr correspondingly. However, this patch is wrong. I should not update the kprobe's addr for non-ftrace-entry. Will fix this in next version. Thanks > > BTW, this type of hidden adjustment should be avoided by design. > If you find user specifies wrong address, return error instead of > adjust it silently. > > Thank you, > > > > > Signed-off-by: Jisheng Zhang <jisheng.zh...@synaptics.com> > > --- > > kernel/kprobes.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > > index 9873fc627d61..f8400753a8a9 100644 > > --- a/kernel/kprobes.c > > +++ b/kernel/kprobes.c > > @@ -1560,6 +1560,9 @@ int register_kprobe(struct kprobe *p) > > addr = kprobe_addr(p); > > if (IS_ERR(addr)) > > return PTR_ERR(addr); > > +#ifdef CONFIG_KPROBES_ON_FTRACE > > + addr = (kprobe_opcode_t *)ftrace_call_adjust((unsigned long)addr); > > +#endif > > p->addr = addr; > > > > ret = check_kprobe_rereg(p); > > -- > > 2.23.0.rc1 > > > > > -- > Masami Hiramatsu <mhira...@kernel.org>