On Tue, 1 Sep 2020 16:57:10 +0900 Masami Hiramatsu <mhiramat@xxxxxxxxxx> wrote: > Support perf-style return probe ("SYMBOL%return") in kprobe events. > This will allow boot-time tracing user to define a return probe event. > Hmm, I think I should add this for uprobe event too. I'll update the series. Thank you, > Signed-off-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx> > --- > kernel/trace/trace_kprobe.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c > index aefb6065b508..391361b67c8f 100644 > --- a/kernel/trace/trace_kprobe.c > +++ b/kernel/trace/trace_kprobe.c > @@ -709,6 +709,18 @@ static inline void sanitize_event_name(char *name) > *name = '_'; > } > > +static inline bool split_return_suffix(char *symbol) > +{ > + char *p = strchr(symbol, '%'); > + > + if (p && !strcmp(p, "%return")) { > + *p = '\0'; > + return true; > + } > + > + return false; > +} > + > static int trace_kprobe_create(int argc, const char *argv[]) > { > /* > @@ -717,6 +729,9 @@ static int trace_kprobe_create(int argc, const char *argv[]) > * p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS] > * - Add kretprobe: > * r[MAXACTIVE][:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS] > + * Or > + * p:[GRP/]EVENT] [MOD:]KSYM[+0]%return [FETCHARGS] > + * > * Fetch args: > * $retval : fetch return value > * $stack : fetch stack address > @@ -746,7 +761,6 @@ static int trace_kprobe_create(int argc, const char *argv[]) > switch (argv[0][0]) { > case 'r': > is_return = true; > - flags |= TPARG_FL_RETURN; > break; > case 'p': > break; > @@ -804,12 +818,17 @@ static int trace_kprobe_create(int argc, const char *argv[]) > symbol = kstrdup(argv[1], GFP_KERNEL); > if (!symbol) > return -ENOMEM; > + > + is_return = split_return_suffix(symbol) || is_return; > + > /* TODO: support .init module functions */ > ret = traceprobe_split_symbol_offset(symbol, &offset); > if (ret || offset < 0 || offset > UINT_MAX) { > trace_probe_log_err(0, BAD_PROBE_ADDR); > goto parse_error; > } > + if (is_return) > + flags |= TPARG_FL_RETURN; > if (kprobe_on_func_entry(NULL, symbol, offset)) > flags |= TPARG_FL_FENTRY; > if (offset && is_return && !(flags & TPARG_FL_FENTRY)) { > -- Masami Hiramatsu <mhiramat@xxxxxxxxxx>