]> git.baikalelectronics.ru Git - kernel.git/commitdiff
tracing: Auto generate event name when creating a group of events
authorLinyu Yuan <quic_linyyuan@quicinc.com>
Mon, 27 Jun 2022 02:19:07 +0000 (10:19 +0800)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Sun, 24 Jul 2022 23:11:17 +0000 (19:11 -0400)
Currently when creating a specific group of trace events,
take kprobe event as example, the user must use the following format:
p:GRP/EVENT [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS],
which means user must enter EVENT name, one example is:

  echo 'p:usb_gadget/config_usb_cfg_link config_usb_cfg_link $arg1' >> kprobe_events

It is not simple if there are too many entries because the event name is
the same as symbol name.

This change allows user to specify no EVENT name, format changed as:

   p:GRP/ [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]

It will generate event name automatically and one example is:

  echo 'p:usb_gadget/ config_usb_cfg_link $arg1' >> kprobe_events.

Link: https://lore.kernel.org/all/1656296348-16111-4-git-send-email-quic_linyyuan@quicinc.com/
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Reviewed-by: Tom Zanussi <zanussi@kernel.org>
Signed-off-by: Linyu Yuan <quic_linyyuan@quicinc.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Documentation/trace/kprobetrace.rst
Documentation/trace/uprobetracer.rst
kernel/trace/trace.c
kernel/trace/trace_dynevent.c
kernel/trace/trace_eprobe.c
kernel/trace/trace_kprobe.c
kernel/trace/trace_probe.c
kernel/trace/trace_uprobe.c

index b175d88f31ebb89c1e2c212f46695213ebc5e9b1..4274cc6a2f94f16347d84282690971b23f5a6ae9 100644 (file)
@@ -28,10 +28,10 @@ Synopsis of kprobe_events
 -------------------------
 ::
 
-  p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS] : Set a probe
-  r[MAXACTIVE][:[GRP/]EVENT] [MOD:]SYM[+0] [FETCHARGS] : Set a return probe
-  p:[GRP/]EVENT] [MOD:]SYM[+0]%return [FETCHARGS]      : Set a return probe
-  -:[GRP/]EVENT                                                : Clear a probe
+  p[:[GRP/][EVENT]] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS]       : Set a probe
+  r[MAXACTIVE][:[GRP/][EVENT]] [MOD:]SYM[+0] [FETCHARGS]       : Set a return probe
+  p[:[GRP/][EVENT]] [MOD:]SYM[+0]%return [FETCHARGS]   : Set a return probe
+  -:[GRP/][EVENT]                                              : Clear a probe
 
  GRP           : Group name. If omitted, use "kprobes" for it.
  EVENT         : Event name. If omitted, the event name is generated
index a8e5938f609e29b35a1dce1e5722f976339340d7..3a1797d707f4cfe4b42bdbcf1a47107e69471a73 100644 (file)
@@ -26,10 +26,10 @@ Synopsis of uprobe_tracer
 -------------------------
 ::
 
-  p[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a uprobe
-  r[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a return uprobe (uretprobe)
-  p[:[GRP/]EVENT] PATH:OFFSET%return [FETCHARGS] : Set a return uprobe (uretprobe)
-  -:[GRP/]EVENT                           : Clear uprobe or uretprobe event
+  p[:[GRP/][EVENT]] PATH:OFFSET [FETCHARGS] : Set a uprobe
+  r[:[GRP/][EVENT]] PATH:OFFSET [FETCHARGS] : Set a return uprobe (uretprobe)
+  p[:[GRP/][EVENT]] PATH:OFFSET%return [FETCHARGS] : Set a return uprobe (uretprobe)
+  -:[GRP/][EVENT]                           : Clear uprobe or uretprobe event
 
   GRP           : Group name. If omitted, "uprobes" is the default value.
   EVENT         : Event name. If omitted, the event name is generated based
index b8dd546270750e17c3e7d447bf8b180b02ad0016..7eb5bce625006d91e776dd53a33c9eb3f96f87fc 100644 (file)
@@ -5569,13 +5569,13 @@ static const char readme_msg[] =
 #endif
 #if defined(CONFIG_KPROBE_EVENTS) || defined(CONFIG_UPROBE_EVENTS)
        "\t  accepts: event-definitions (one definition per line)\n"
-       "\t   Format: p[:[<group>/]<event>] <place> [<args>]\n"
-       "\t           r[maxactive][:[<group>/]<event>] <place> [<args>]\n"
+       "\t   Format: p[:[<group>/][<event>]] <place> [<args>]\n"
+       "\t           r[maxactive][:[<group>/][<event>]] <place> [<args>]\n"
 #ifdef CONFIG_HIST_TRIGGERS
        "\t           s:[synthetic/]<event> <field> [<field>]\n"
 #endif
-       "\t           e[:[<group>/]<event>] <attached-group>.<attached-event> [<args>]\n"
-       "\t           -:[<group>/]<event>\n"
+       "\t           e[:[<group>/][<event>]] <attached-group>.<attached-event> [<args>]\n"
+       "\t           -:[<group>/][<event>]\n"
 #ifdef CONFIG_KPROBE_EVENTS
        "\t    place: [<module>:]<symbol>[+<offset>]|<memaddr>\n"
   "place (kretprobe): [<module>:]<symbol>[+<offset>]%return|<memaddr>\n"
index 076b447a1b88944b382ae6ec8d98b6d58b280388..154996684fb548db7b2060682e87d94c6836e5a2 100644 (file)
@@ -101,7 +101,7 @@ int dyn_event_release(const char *raw_command, struct dyn_event_operations *type
                event = p + 1;
                *p = '\0';
        }
-       if (event[0] == '\0') {
+       if (!system && event[0] == '\0') {
                ret = -EINVAL;
                goto out;
        }
index 8979cb9ec37a55b88dfdc0ba9972cffbfcda69fa..a30f21499e81203fc2693ec547517e888f43a011 100644 (file)
@@ -125,6 +125,7 @@ static bool eprobe_dyn_event_match(const char *system, const char *event,
         * We match the following:
         *  event only                  - match all eprobes with event name
         *  system and event only       - match all system/event probes
+        *  system only                 - match all system probes
         *
         * The below has the above satisfied with more arguments:
         *
@@ -143,7 +144,7 @@ static bool eprobe_dyn_event_match(const char *system, const char *event,
                return false;
 
        /* Must match the event name */
-       if (strcmp(trace_probe_name(&ep->tp), event) != 0)
+       if (event[0] != '\0' && strcmp(trace_probe_name(&ep->tp), event) != 0)
                return false;
 
        /* No arguments match all */
@@ -848,7 +849,7 @@ static int __trace_eprobe_create(int argc, const char *argv[])
 {
        /*
         * Argument syntax:
-        *      e[:[GRP/]ENAME] SYSTEM.EVENT [FETCHARGS]
+        *      e[:[GRP/][ENAME]] SYSTEM.EVENT [FETCHARGS]
         * Fetch args:
         *  <name>=$<field>[:TYPE]
         */
@@ -858,6 +859,7 @@ static int __trace_eprobe_create(int argc, const char *argv[])
        struct trace_eprobe *ep = NULL;
        char buf1[MAX_EVENT_NAME_LEN];
        char buf2[MAX_EVENT_NAME_LEN];
+       char gbuf[MAX_EVENT_NAME_LEN];
        int ret = 0;
        int i;
 
@@ -869,25 +871,24 @@ static int __trace_eprobe_create(int argc, const char *argv[])
        event = strchr(&argv[0][1], ':');
        if (event) {
                event++;
-               ret = traceprobe_parse_event_name(&event, &group, buf1,
+               ret = traceprobe_parse_event_name(&event, &group, gbuf,
                                                  event - argv[0]);
                if (ret)
                        goto parse_error;
-       } else {
-               strscpy(buf1, argv[1], MAX_EVENT_NAME_LEN);
-               sanitize_event_name(buf1);
-               event = buf1;
        }
-       if (!is_good_name(event) || !is_good_name(group))
-               goto parse_error;
 
        trace_probe_log_set_index(1);
        sys_event = argv[1];
-       ret = traceprobe_parse_event_name(&sys_event, &sys_name, buf2,
-                                         sys_event - argv[1]);
-       if (ret || !sys_name)
+       ret = traceprobe_parse_event_name(&sys_event, &sys_name, buf2, 0);
+       if (!sys_event || !sys_name)
                goto parse_error;
 
+       if (!event) {
+               strscpy(buf1, argv[1], MAX_EVENT_NAME_LEN);
+               sanitize_event_name(buf1);
+               event = buf1;
+       }
+
        mutex_lock(&event_mutex);
        event_call = find_and_get_event(sys_name, sys_event);
        ep = alloc_event_probe(group, event, event_call, argc - 2);
index a245ea673715d24408c77d06c6f64f04bb60de2a..23f7f0ec4f4cf372b829a77d971b06a49a8c949d 100644 (file)
@@ -163,7 +163,8 @@ static bool trace_kprobe_match(const char *system, const char *event,
 {
        struct trace_kprobe *tk = to_trace_kprobe(ev);
 
-       return strcmp(trace_probe_name(&tk->tp), event) == 0 &&
+       return (event[0] == '\0' ||
+               strcmp(trace_probe_name(&tk->tp), event) == 0) &&
            (!system || strcmp(trace_probe_group_name(&tk->tp), system) == 0) &&
            trace_kprobe_match_command_head(tk, argc, argv);
 }
@@ -708,11 +709,11 @@ static int __trace_kprobe_create(int argc, const char *argv[])
        /*
         * Argument syntax:
         *  - Add kprobe:
-        *      p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
+        *      p[:[GRP/][EVENT]] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
         *  - Add kretprobe:
-        *      r[MAXACTIVE][:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
+        *      r[MAXACTIVE][:[GRP/][EVENT]] [MOD:]KSYM[+0] [FETCHARGS]
         *    Or
-        *      p:[GRP/]EVENT] [MOD:]KSYM[+0]%return [FETCHARGS]
+        *      p[:[GRP/][EVENT]] [MOD:]KSYM[+0]%return [FETCHARGS]
         *
         * Fetch args:
         *  $retval     : fetch return value
@@ -739,6 +740,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
        long offset = 0;
        void *addr = NULL;
        char buf[MAX_EVENT_NAME_LEN];
+       char gbuf[MAX_EVENT_NAME_LEN];
        unsigned int flags = TPARG_FL_KERNEL;
 
        switch (argv[0][0]) {
@@ -833,11 +835,13 @@ static int __trace_kprobe_create(int argc, const char *argv[])
 
        trace_probe_log_set_index(0);
        if (event) {
-               ret = traceprobe_parse_event_name(&event, &group, buf,
+               ret = traceprobe_parse_event_name(&event, &group, gbuf,
                                                  event - argv[0]);
                if (ret)
                        goto parse_error;
-       } else {
+       }
+
+       if (!event) {
                /* Make a new event name */
                if (symbol)
                        snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
index 80863c6508e5e94c48ce39f0746c5858663a87d0..850a88abd33ba20c921e85380f171af008a5c89c 100644 (file)
@@ -257,6 +257,10 @@ int traceprobe_parse_event_name(const char **pevent, const char **pgroup,
        }
        len = strlen(event);
        if (len == 0) {
+               if (slash) {
+                       *pevent = NULL;
+                       return 0;
+               }
                trace_probe_log_err(offset, NO_EVENT_NAME);
                return -EINVAL;
        } else if (len > MAX_EVENT_NAME_LEN) {
index c3dc4f859a6bcb6132488945ac1e65b66b21931d..a3fec28961d62a6a5433f854e233c9cb7bfb9e11 100644 (file)
@@ -312,7 +312,8 @@ static bool trace_uprobe_match(const char *system, const char *event,
 {
        struct trace_uprobe *tu = to_trace_uprobe(ev);
 
-       return strcmp(trace_probe_name(&tu->tp), event) == 0 &&
+       return (event[0] == '\0' ||
+               strcmp(trace_probe_name(&tu->tp), event) == 0) &&
           (!system || strcmp(trace_probe_group_name(&tu->tp), system) == 0) &&
           trace_uprobe_match_command_head(tu, argc, argv);
 }
@@ -532,7 +533,7 @@ end:
 
 /*
  * Argument syntax:
- *  - Add uprobe: p|r[:[GRP/]EVENT] PATH:OFFSET[%return][(REF)] [FETCHARGS]
+ *  - Add uprobe: p|r[:[GRP/][EVENT]] PATH:OFFSET[%return][(REF)] [FETCHARGS]
  */
 static int __trace_uprobe_create(int argc, const char **argv)
 {
@@ -540,6 +541,7 @@ static int __trace_uprobe_create(int argc, const char **argv)
        const char *event = NULL, *group = UPROBE_EVENT_SYSTEM;
        char *arg, *filename, *rctr, *rctr_end, *tmp;
        char buf[MAX_EVENT_NAME_LEN];
+       char gbuf[MAX_EVENT_NAME_LEN];
        enum probe_print_type ptype;
        struct path path;
        unsigned long offset, ref_ctr_offset;
@@ -644,11 +646,13 @@ static int __trace_uprobe_create(int argc, const char **argv)
        /* setup a probe */
        trace_probe_log_set_index(0);
        if (event) {
-               ret = traceprobe_parse_event_name(&event, &group, buf,
+               ret = traceprobe_parse_event_name(&event, &group, gbuf,
                                                  event - argv[0]);
                if (ret)
                        goto fail_address_parse;
-       } else {
+       }
+
+       if (!event) {
                char *tail;
                char *ptr;