Re: [PATCHES v3 0/2] perf tools: Add cached probe type detection for evsel

From: Arnaldo Melo

Date: Wed Jun 17 2026 - 19:00:06 EST




On June 17, 2026 7:48:15 PM GMT-03:00, Namhyung Kim <namhyung@xxxxxxxxxx> wrote:
>On Tue, Jun 16, 2026 at 03:25:44PM -0300, Arnaldo Carvalho de Melo wrote:
>> Hi,
>>
>> Checking whether an evsel is a kprobe or uprobe currently requires
>> walking the PMU list via evsel__find_pmu() on every call. This is
>> wasteful when the same evsel is checked repeatedly in hot paths like
>> trace__fprintf_tp_fields().
>>
>> Patch 1 adds evsel__is_kprobe(), evsel__is_uprobe(), and
>> evsel__is_probe() helpers that resolve the probe type on first call
>> and cache the result in a 3-bit field that fits in existing struct
>> padding.
>>
>> Detection covers both PMU-based probes (kprobe/uprobe PMU, detected
>> by PMU name) and ftrace-based dynamic probes (kprobes/uprobes/fprobes
>> created via tracefs, which report as PMU "tracepoint"). Ftrace probes
>> are detected by the __probe_ip field that the kernel adds to all
>> dynamic probe formats — this is authoritative regardless of the
>> group/system name the user chose.
>>
>> Patch 2 is the first user: it guards the __probe_ip field name
>> comparison in perf trace with evsel__is_probe(), so the strcmp is
>> skipped entirely for the common case of non-probe tracepoint events.
>>
>> Patch 3 adds inline stubs for evsel__field() and evsel__common_field()
>> when libtraceevent is absent. These were previously declared
>> unconditionally but defined only inside #ifdef HAVE_LIBTRACEEVENT,
>> which was harmless until patch 1 added a call from always-compiled
>> code in evsel.c.
>>
>> Build-tested with gcc and clang.
>>
>> Changes in v3:
>> - Add patch 3: no-libtraceevent stubs for evsel__field() and
>> evsel__common_field(). Without this, NO_LIBTRACEEVENT=1 builds
>> fail to link because evsel__resolve_probe_type() calls
>> evsel__field() unconditionally (sashiko-bot).
>>
>> Changes in v2 (patch 1 only):
>> - Detect ftrace-based dynamic probes (kprobes/uprobes/fprobes created
>> via tracefs) that report PMU "tracepoint" instead of "kprobe"/
>> "uprobe". Check for the __probe_ip field presence in the tracepoint
>> format. Without this, evsel__is_probe() returned false for ftrace
>> probes, breaking __probe_ip suppression in perf trace for probes
>> created via 'perf probe' (sashiko-bot).
>> - Widen probe_type bitfield from 2 to 3 bits for PROBE__FTRACE.
>>
>> Arnaldo Carvalho de Melo (3):
>> perf evsel: Add lazy-initialized probe type detection helpers
>> perf trace: Guard __probe_ip suppression with evsel__is_probe()
>> perf evsel: Add no-libtraceevent stubs for evsel__field() and evsel__common_field()
>
>It seems you squashed patch 3 into 1. :)


I noticed it but accepted it at the end, I guess part of the process of using AI to speed up the process :-/

- Arnaldo


>
>Thanks,
>Namhyung
>
>>
>> tools/perf/builtin-trace.c | 2 +-
>> tools/perf/util/evsel.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
>> tools/perf/util/evsel.h | 19 +++++++++++++++++
>> 3 files changed, 73 insertions(+), 1 deletion(-)
>>
>> Cc: Aaron Tomlin <atomlin@xxxxxxxxxxx>
>> Cc: Ian Rogers <irogers@xxxxxxxxxx>
>> Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
>>
>> Developed with AI assistance (Claude/sashiko), tagged in commits.

- Arnaldo