Messages in this thread | | | Date | Thu, 26 Apr 2012 19:12:41 +0900 | From | Masami Hiramatsu <> | Subject | Re: [PATCH 6/6][RFC] kprobes: Allow probe on ftrace reserved text (but move it) |
| |
(2012/04/26 11:29), Steven Rostedt wrote: > From: Steven Rostedt <srostedt@redhat.com> > > If a probe is placed on a ftrace nop (or ftrace_caller), simply move the > probe to the next instruction instead of rejecting it. This will allow > kprobes not to be affected by ftrace using the -mfentry gcc option which > will put the ftrace nop at the beginning of the function. As a very common > case for kprobes is to add a probe to the very beginning of a function > we need a way to handle the case when ftrace takes the first instruction.
Hmm, I think you'd better introduce a flag(KPROBE_FLAG_MOVED) for adjustment of probed IP address. Caller or handler can fixup its IP or kprobes itself can do it.
> > Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > Signed-off-by: Steven Rostedt <rostedt@goodmis.org> > --- > kernel/kprobes.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > index c62b854..560d80e 100644 > --- a/kernel/kprobes.c > +++ b/kernel/kprobes.c > @@ -1319,10 +1319,20 @@ int __kprobes register_kprobe(struct kprobe *p) > struct kprobe *old_p; > struct module *probed_mod; > kprobe_opcode_t *addr; > + unsigned long ftrace_addr; > > addr = kprobe_addr(p); > if (IS_ERR(addr)) > return PTR_ERR(addr); > + > + /* > + * If the address is located on a ftrace nop, set the > + * breakpoint to the following instruction. > + */ > + ftrace_addr = ftrace_location((unsigned long)addr); > + if (unlikely(ftrace_addr)) > + addr = (kprobe_opcode_t *)(ftrace_addr + MCOUNT_INSN_SIZE);
And also, you may need to use ftrace_text_reserved() here, or need a void ftrace_location() function for CONFIG_DYNAMIC_FTRACE=n.
> + > p->addr = addr; > > ret = check_kprobe_rereg(p); > @@ -1333,7 +1343,6 @@ int __kprobes register_kprobe(struct kprobe *p) > preempt_disable(); > if (!kernel_text_address((unsigned long) p->addr) || > in_kprobes_functions((unsigned long) p->addr) || > - ftrace_text_reserved(p->addr, p->addr) || > jump_label_text_reserved(p->addr, p->addr)) { > ret = -EINVAL; > goto cannot_probe;
Thanks,
-- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu.pt@hitachi.com
| |