tracing/uprobes: Support perf-style return probe
authorMasami Hiramatsu <mhiramat@kernel.org>
Thu, 10 Sep 2020 08:55:46 +0000 (17:55 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Tue, 22 Sep 2020 01:06:03 +0000 (21:06 -0400)
Support perf-style return probe ("SYMBOL%return") for uprobe events
as same as kprobe events does.

Link: https://lkml.kernel.org/r/159972814601.428528.7641183316212425445.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/trace/trace.c
kernel/trace/trace_uprobe.c

index ca6da46..c35fcd2 100644 (file)
@@ -5125,7 +5125,7 @@ static const char readme_msg[] =
   "place (kretprobe): [<module>:]<symbol>[+<offset>]%return|<memaddr>\n"
 #endif
 #ifdef CONFIG_UPROBE_EVENTS
-  "   place (uprobe): <path>:<offset>[(ref_ctr_offset)]\n"
+  "   place (uprobe): <path>:<offset>[%return][(ref_ctr_offset)]\n"
 #endif
        "\t     args: <name>=fetcharg[:type]\n"
        "\t fetcharg: %<register>, @<address>, @<symbol>[+|-<offset>],\n"
index 56729c6..3cf7128 100644 (file)
@@ -528,7 +528,7 @@ end:
 
 /*
  * Argument syntax:
- *  - Add uprobe: p|r[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS]
+ *  - Add uprobe: p|r[:[GRP/]EVENT] PATH:OFFSET[%return][(REF)] [FETCHARGS]
  */
 static int trace_uprobe_create(int argc, const char **argv)
 {
@@ -617,6 +617,19 @@ static int trace_uprobe_create(int argc, const char **argv)
                }
        }
 
+       /* Check if there is %return suffix */
+       tmp = strchr(arg, '%');
+       if (tmp) {
+               if (!strcmp(tmp, "%return")) {
+                       *tmp = '\0';
+                       is_return = true;
+               } else {
+                       trace_probe_log_err(tmp - filename, BAD_ADDR_SUFFIX);
+                       ret = -EINVAL;
+                       goto fail_address_parse;
+               }
+       }
+
        /* Parse uprobe offset. */
        ret = kstrtoul(arg, 0, &offset);
        if (ret) {