[PATCH v3 00/25] perf tool: Add evsel to perf_sample

Ian Rogers
2026-03-20T08:08:38Z

Nearly all perf code ends up passing an evsel with the perf_sample,
which is problematic if you want to rewrite the evsel such as with
off-CPU processing - all uses of the evsel need fixing up. Previously
I'd mailed this patch as an RFC with everything combined:
https://lore.kernel.org/lkml/20260126071822.447368-1-irogers@google.com/
and there was a request to break it up.

I've started the series by adding documentation to struct
perf_sample. Next I fixed missing perf_sample__init/exit largely from
the recent perf inject callchain rewriting work. The 3rd patch adds
the evsel to struct perf_sample and ensures it is correctly
initialized. The next 22 patches avoid passing the evsel along with
sample for different parts of the perf tool, along with some minor
tweaks like constification and not determining the evsel if it is
present in the sample.

v3: Fix various sashiko review comments particularly about unintended
behavior changes.

v2: Add review feedback on the first 2 patches from Namhyung, fix a
missed evsel assignment running event2evsel in builtin-inject.
https://lore.kernel.org/lkml/20260319232334.287517-1-irogers@google.com/

v1: https://lore.kernel.org/lkml/20260209174032.4142096-1-irogers@google.com/

Ian Rogers (25):
perf sample: Document struct perf_sample
perf sample: Make sure perf_sample__init/exit are used
perf sample: Add evsel to struct perf_sample
perf tool: Remove evsel from tool APIs that pass the sample
perf kvm: Don't pass evsel with sample
perf evsel: Refactor evsel__intval to perf_sample__intval
perf trace: Don't pass evsel with sample
perf callchain: Don't pass evsel and sample
perf lock: Only pass sample to handlers
perf lock: Constify trace_lock_handler variables
perf hist: Remove evsel parameter from inc samples functions
perf db-export: Remove evsel from struct export_sample
perf hist: Remove evsel from struct hist_entry_iter
perf report: Directly use sample->evsel to avoid computing from
sample->id
perf annotate: Don't pass evsel to add_sample
perf inject: Don't pass evsel with sample
perf kmem: Don't pass evsel with sample
perf kwork: Don't pass evsel with sample
perf sched: Don't pass evsel with sample
perf timechart: Don't pass evsel with sample
perf trace: Don't pass evsel with sample
perf evlist: Try to avoid computing evsel from sample
perf script: Don't pass evsel with sample
perf s390-sample-raw: Don't pass evsel with sample
perf evsel: Don't pass evsel with sample

tools/perf/builtin-annotate.c | 28 ++-
tools/perf/builtin-c2c.c | 6 +-
tools/perf/builtin-diff.c | 5 +-
tools/perf/builtin-inject.c | 83 ++++----
tools/perf/builtin-kmem.c | 69 ++++---
tools/perf/builtin-kvm.c | 22 +-
tools/perf/builtin-kwork.c | 104 ++++------
tools/perf/builtin-lock.c | 117 +++++------
tools/perf/builtin-mem.c | 1 -
tools/perf/builtin-record.c | 3 +-
tools/perf/builtin-report.c | 38 ++--
tools/perf/builtin-sched.c | 188 ++++++++----------
tools/perf/builtin-script.c | 26 ++-
tools/perf/builtin-timechart.c | 129 ++++++------
tools/perf/builtin-top.c | 19 +-
tools/perf/builtin-trace.c | 103 +++++-----
tools/perf/tests/hists_cumulate.c | 3 +-
tools/perf/tests/hists_filter.c | 2 +-
tools/perf/tests/hists_output.c | 3 +-
tools/perf/tests/mmap-basic.c | 4 +-
tools/perf/tests/openat-syscall-tp-fields.c | 2 +-
tools/perf/tests/switch-tracking.c | 9 +-
tools/perf/util/annotate.c | 19 +-
tools/perf/util/annotate.h | 6 +-
tools/perf/util/build-id.c | 3 +-
tools/perf/util/build-id.h | 7 +-
tools/perf/util/callchain.c | 9 +-
tools/perf/util/callchain.h | 5 +-
tools/perf/util/data-convert-bt.c | 2 +-
tools/perf/util/data-convert-json.c | 5 +-
tools/perf/util/db-export.c | 13 +-
tools/perf/util/db-export.h | 3 +-
tools/perf/util/evlist.c | 5 +-
tools/perf/util/evsel.c | 72 ++++---
tools/perf/util/evsel.h | 12 +-
tools/perf/util/hist.c | 26 +--
tools/perf/util/hist.h | 3 +-
tools/perf/util/intel-pt.c | 2 +-
tools/perf/util/intel-tpebs.c | 3 +-
tools/perf/util/jitdump.c | 2 +-
.../perf/util/kvm-stat-arch/kvm-stat-arm64.c | 19 +-
.../util/kvm-stat-arch/kvm-stat-loongarch.c | 17 +-
.../util/kvm-stat-arch/kvm-stat-powerpc.c | 17 +-
.../perf/util/kvm-stat-arch/kvm-stat-riscv.c | 17 +-
tools/perf/util/kvm-stat-arch/kvm-stat-s390.c | 20 +-
tools/perf/util/kvm-stat-arch/kvm-stat-x86.c | 70 +++----
tools/perf/util/kvm-stat.c | 19 +-
tools/perf/util/kvm-stat.h | 18 +-
tools/perf/util/kwork.h | 9 +-
tools/perf/util/machine.c | 14 +-
tools/perf/util/machine.h | 3 -
tools/perf/util/powerpc-vpadtl.c | 10 +-
tools/perf/util/s390-sample-raw.c | 15 +-
tools/perf/util/sample.c | 11 +-
tools/perf/util/sample.h | 119 ++++++++++-
.../util/scripting-engines/trace-event-perl.c | 23 +--
.../scripting-engines/trace-event-python.c | 47 ++---
tools/perf/util/session.c | 74 ++++---
tools/perf/util/synthetic-events.c | 9 +-
tools/perf/util/synthetic-events.h | 2 -
tools/perf/util/tool.c | 4 +-
tools/perf/util/tool.h | 4 +-
tools/perf/util/trace-event-scripting.c | 5 +-
tools/perf/util/trace-event.h | 3 -
64 files changed, 861 insertions(+), 849 deletions(-)

--
2.53.0.959.g497ff81fa9-goog