]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf trace: Fix noise and signed formatting of __probe_ip in bare dynamic probes
authorAaron Tomlin <atomlin@atomlin.com>
Fri, 12 Jun 2026 22:56:10 +0000 (18:56 -0400)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 15 Jun 2026 17:33:49 +0000 (14:33 -0300)
When a dynamic probe is created without explicitly requested arguments
via perf probe --add, the Ftrace subsystem automatically appends
"__probe_ip" to the tracepoint format to record the instruction pointer.

Currently, perf trace prints this implicit field by default.
Furthermore, because the formatting logic defaults to a standard signed
integer representation, the kernel space memory address is erroneously
displayed as a meaningless negative integer.

    ❯ sudo ./perf trace --event probe:proc_sys_open --max-events 1
         0.000 ps/1316543 probe:proc_sys_open(__probe_ip: -1406056956)

This patch addresses the user experience by combining two refinements:
    1. "__probe_ip" is now hidden from the standard output, as its
       presence adds no contextual value for a bare probe.

    2. If the user explicitly requests verbose output (--verbose),
       "__probe_ip" is intercepted and properly formatted as a hexadecimal
       kernel address, restoring its utility for debugging inline
       function hits.

    ❯ sudo ./perf trace --event probe:proc_sys_open --max-events 1
         0.000 ps/1314074 probe:proc_sys_open()

    ❯ sudo ./perf trace --verbose --event probe:proc_sys_open --max-events 1
    Using CPUID GenuineIntel-6-8E-C
    mmap size 528384B
         0.000 ps/1314366 probe:proc_sys_open(__probe_ip: 0xffffffffac314604)

Reviewed-by: James Clark <james.clark@linaro.org>
Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Daniel Vacek <neelx@suse.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sean Ashe <sean@ashe.io>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-trace.c

index 377f0a18b00e3aa874b4691f2be2cd0b88397d29..a8492da23a9cc178db5f8e09e382d1a3a084d406 100644 (file)
@@ -3261,6 +3261,27 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sample *
                if (val == 0 && !trace->show_zeros && !arg->show_zero && arg->strtoul != STUL_BTF_TYPE)
                        continue;
 
+               /*
+                * __probe_ip is implicitly added to bare dynamic probes.
+                * Suppress it by default to avoid cluttering the output.
+                * If verbose mode is enabled, ensure it is formatted as a
+                * hexadecimal memory address rather than a signed integer.
+                */
+               if (!strcmp(field->name, "__probe_ip")) {
+                       if (!verbose)
+                               continue;
+
+                       printed += scnprintf(bf + printed, size - printed,
+                                            "%s", printed ? ", " : "");
+                       if (trace->show_arg_names)
+                               printed += scnprintf(bf + printed, size - printed,
+                                                    "%s: ", field->name);
+
+                       printed += scnprintf(bf + printed, size - printed, "%#016llx",
+                                            (unsigned long long)val);
+                       continue;
+               }
+
                printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
 
                if (trace->show_arg_names)