perf probe: Show correct error message about @symbol usage for uprobe
authorMasami Hiramatsu <mhiramat@kernel.org>
Fri, 28 Jul 2023 14:19:30 +0000 (23:19 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 3 Aug 2023 20:01:27 +0000 (17:01 -0300)
Since @symbol variable access is not supported by uprobe event, it must be
correctly warn user instead of kernel version update.

Committer testing:

With/without the patch:

  [root@quaco ~]# perf probe -x ~/bin/perf -L sigtrap_handler
  <sigtrap_handler@/home/acme/git/perf-tools-next/tools/perf/tests/sigtrap.c:0>
        0  sigtrap_handler(int signum __maybe_unused, siginfo_t *info, void *ucontext __maybe_unused)
        1  {
        2         if (!__atomic_fetch_add(&ctx.signal_count, 1, __ATOMIC_RELAXED))
        3                 ctx.first_siginfo = *info;
        4         __atomic_fetch_sub(&ctx.tids_want_signal, syscall(SYS_gettid), __ATOMIC_RELAXED);
        5  }

           static void *test_thread(void *arg)
           {

  [root@quaco ~]# perf probe -x ~/bin/perf sigtrap_handler:4 "ctx.signal_count"

Without the patch:

  [root@quaco ~]# perf probe -x ~/bin/perf sigtrap_handler:4 "ctx.signal_count"
  Failed to write event: Invalid argument
  Please upgrade your kernel to at least 3.14 to have access to feature @ctx
    Error: Failed to add events.
  [root@quaco ~]#

With the patch:

  [root@quaco ~]#
  Failed to write event: Invalid argument
  @ctx accesses a variable by symbol name, but that is not supported for user application probe.
    Error: Failed to add events.
  [root@quaco ~]#

Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Closes: https://lore.kernel.org/all/ZLWDEjvFjrrEJODp@kernel.org/
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Link: https://lore.kernel.org/r/169055397023.67089.12693645664676964310.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/probe-event.c

index 16822a8..2d056f0 100644 (file)
@@ -2800,13 +2800,18 @@ static void warn_uprobe_event_compat(struct probe_trace_event *tev)
        if (!tev->uprobes || tev->nargs == 0 || !buf)
                goto out;
 
-       for (i = 0; i < tev->nargs; i++)
-               if (strglobmatch(tev->args[i].value, "[$@+-]*")) {
-                       pr_warning("Please upgrade your kernel to at least "
-                                  "3.14 to have access to feature %s\n",
+       for (i = 0; i < tev->nargs; i++) {
+               if (strchr(tev->args[i].value, '@')) {
+                       pr_warning("%s accesses a variable by symbol name, but that is not supported for user application probe.\n",
+                                  tev->args[i].value);
+                       break;
+               }
+               if (strglobmatch(tev->args[i].value, "[$+-]*")) {
+                       pr_warning("Please upgrade your kernel to at least 3.14 to have access to feature %s\n",
                                   tev->args[i].value);
                        break;
                }
+       }
 out:
        free(buf);
 }