Re: [PATCH v14 00/32] perf tools: Add evsel to perf_sample

From: Ian Rogers

Date: Wed May 20 2026 - 17:59:56 EST


On Wed, May 20, 2026 at 2:15 PM Arnaldo Carvalho de Melo
<acme@xxxxxxxxxx> wrote:
>
> On Wed, May 20, 2026 at 06:13:33PM -0300, Arnaldo Carvalho de Melo wrote:
> > On Wed, May 20, 2026 at 02:01:03PM -0700, Ian Rogers wrote:
> > > On Wed, May 20, 2026 at 1:55 PM Arnaldo Carvalho de Melo
> > > <acme@xxxxxxxxxx> wrote:
> > > >
> > > > On Wed, May 20, 2026 at 05:51:36PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > On Wed, May 20, 2026 at 05:49:57PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > > On Wed, May 20, 2026 at 01:40:48PM -0700, Ian Rogers wrote:
> > > > > > > On Wed, May 20, 2026 at 12:46 PM Arnaldo Carvalho de Melo
> > > > > > > <acme@xxxxxxxxxx> wrote:
> > > > > > > >
> > > > > > > > On Wed, May 20, 2026 at 04:15:30PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > > > > > > On Wed, May 20, 2026 at 12:05:06PM -0700, Ian Rogers wrote:
> > > > > > > > > > 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) because all uses of the evsel need to be fixed
> > > > > > > > > > up. Since the perf_sample now carries its own resolved evsel pointer,
> > > > > > > > > > passing evsel separately is redundant and error-prone (allowing
> > > > > > > > > > parameter divergence bugs).
> > > > > > > > > >
> > > > > > > > > > This series cleans up the redundant evsel parameter across all perf
> > > > > > > > > > tool subcommands and APIs, ensuring that tools uniformly retrieve
> > > > > > > > > > event attributes directly from the sample itself. This simplifies
> > > > > > > > > > function signatures and improves API consistency.
> > > > > > > > > >
> > > > > > > > > > Additionally, this series incorporates subsequent memory safety
> > > > > > > > > > improvements, robust bounds checking, and memory leak corrections
> > > > > > > > > > prompted by address sanitizers and Sashiko code reviews.
> > > > > > > > > >
> > > > > > > > > > The original combined RFC patch:
> > > > > > > > > > https://lore.kernel.org/lkml/20260126071822.447368-1-irogers@xxxxxxxxxx/
> > > > > > > > > > was split up per reviewer requests.
> > > > > > > > > >
> > > > > > > > > > v14:
> > > > > > > > > > - Incorporate Acked-by tags from Namhyung Kim.
> > > > > > > > > > - Re-polish and expand commit descriptions to provide thorough explanations
> > > > > > > > > > of the changes and their rationale.
> > > > > > > > >
> > > > > > > > > Thanks, tentatively applying it to perf-tools-next, for v7.2.
> > > > > > > >
> > > > > > > > Had to apply a minor fixup for a conflict with anoter patch series from
> > > > > > > > you, the LBR one.
> > > > > > >
> > > > > > > Sorry for that and thanks for dealing with the conflict! Any chance
> > > > > > > you could push to tmp.perf-tools-next? I have some other series that
> > > > > > > will conflict and it would be nice to rebase those changes there.
> > > > > >
> > > > > > I just removed the last two patches, the ones for kwork, as:
> > > > > >
> > > > > > + make ARCH= CROSS_COMPILE= EXTRA_CFLAGS= NO_LIBELF=1 -C tools/perf O=/tmp/build/perf
> > > > > > make: Entering directory '/git/perf-7.1.0-rc2/tools/perf'
> > > > > > BUILD: Doing 'make -j32' parallel build
> > > > > > Makefile.config:647: Warning: Disabled BPF skeletons as libelf is required by bpftool
> > > > > > Makefile.config:745: Disabling post unwind, no support found.
> > > > > > Makefile.config:856: Missing python setuptools, the python binding won't be built, please install python3-setuptools or equivalent
> > > > > > Makefile.config:1045: No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[el]/libbabeltrace-ctf-dev
> > > > > > Makefile.config:1110: libpfm4 not found, disables libpfm4 support. Please install libpfm-devel or libpfm4-dev
> > > > > > Makefile.config:1135: Rust is not found. Test workloads with rust are disabled.
> > > > > >
> > > > > > Auto-detecting system features:
> > > > > > ... libdw: [ on ]
> > > > > > ... glibc: [ on ]
> > > > > > ... libelf: [ on ]
> > > > > > ... libnuma: [ on ]
> > > > > > ... numa_num_possible_cpus: [ on ]
> > > > > > ... libpython: [ on ]
> > > > > > ... libcapstone: [ on ]
> > > > > > ... llvm-perf: [ on ]
> > > > > > ... zlib: [ on ]
> > > > > > ... lzma: [ on ]
> > > > > > ... bpf: [ on ]
> > > > > > ... libaio: [ on ]
> > > > > > ... libzstd: [ on ]
> > > > > > ... libopenssl: [ on ]
> > > > > > ... rust: [ OFF ]
> > > > > >
> > > > > > CC /tmp/build/perf/dlfilters/dlfilter-test-api-v0.o
> > > > > > <SNIP>
> > > > > > LINK /tmp/build/perf/perf
> > > > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `work_pop_atom':
> > > > > > builtin-kwork.c:(.text+0x59c92): undefined reference to `work_exit'
> > > > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `work_push_atom.constprop.0':
> > > > > > builtin-kwork.c:(.text+0x5aba8): undefined reference to `work_exit'
> > > > > > /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `cmd_kwork':
> > > > > > (.text+0x5bb4b): undefined reference to `work_exit'
> > > > > > /usr/bin/ld: (.text+0x5bbae): undefined reference to `work_exit'
> > > > > > /usr/bin/ld: (.text+0x5c3b2): undefined reference to `work_exit'
> > > > > > collect2: error: ld returned 1 exit status
> > > > > > make[2]: *** [Makefile.perf:586: /tmp/build/perf/perf] Error 1
> > > > > > make[1]: *** [Makefile.perf:289: sub-make] Error 2
> > > > > > make: *** [Makefile:76: all] Error 2
> > > > > > make: Leaving directory '/git/perf-7.1.0-rc2/tools/perf'
> > > > > > + exit 1
> > > > > > toolsbuilder@five:~$
> > > > > >
> > > > > >
> > > > > > I'm doing some more tests, just a moment and I'll push what I have to
> > > > > > tmp.perf-tools-next.
> > > > >
> > > > > Also:
> > > > >
> > > > > toolsbuilder@five:~$ cat dm.log/almalinux\:8
> > > > > <SNIP>
> > > > > OLLECT_GCC=gcc
> > > > > COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
> > > > > OFFLOAD_TARGET_NAMES=nvptx-none
> > > > > OFFLOAD_TARGET_DEFAULT=1
> > > > > Target: x86_64-redhat-linux
> > > > > Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugs.almalinux.org/ --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
> > > > > Thread model: posix
> > > > > gcc version 8.5.0 20210514 (Red Hat 8.5.0-28) (GCC)
> > > > > + make ARCH= CROSS_COMPILE= EXTRA_CFLAGS= -C tools/perf O=/tmp/build/perf
> > > > > make: Entering directory '/git/perf-7.1.0-rc2/tools/perf'
> > > > > BUILD: Doing 'make -j32' parallel build
> > > > > Makefile.config:1045: No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[el]/libbabeltrace-ctf-dev
> > > > > Makefile.config:1061: No libcapstone found, disables disasm engine support for 'perf script', please install libcapstone-dev/capstone-devel
> > > > > Makefile.config:1110: libpfm4 not found, disables libpfm4 support. Please install libpfm-devel or libpfm4-dev
> > > > > Makefile.config:1135: Rust is not found. Test workloads with rust are disabled.
> > > > >
> > > > > Auto-detecting system features:
> > > > > ... libdw: [ on ]
> > > > > ... glibc: [ on ]
> > > > > ... libelf: [ on ]
> > > > > ... libnuma: [ on ]
> > > > > ... numa_num_possible_cpus: [ on ]
> > > > > ... libpython: [ on ]
> > > > > ... libcapstone: [ OFF ]
> > > > > ... llvm-perf: [ on ]
> > > > > ... zlib: [ on ]
> > > > > ... lzma: [ on ]
> > > > > ... bpf: [ on ]
> > > > > ... libaio: [ on ]
> > > > > ... libzstd: [ on ]
> > > > > ... libopenssl: [ on ]
> > > > > ... rust: [ OFF ]
> > > > >
> > > > > CC /tmp/build/perf/dlfilters/dlfilter-test-api-v0.o
> > > > > CC /tmp/build/perf/dlfilters/dlfilter-test-api-v2.o
> > > > > <SNIP>
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/cache.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/counter.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/floating-point.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/frontend.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/memory.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/other.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/pipeline.json
> > > > > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/virtual-memory.json
> > > > > GEN /tmp/build/perf/pmu-events/test-empty-pmu-events.c
> > > > > Traceback (most recent call last):
> > > > > File "pmu-events/jevents.py", line 1524, in <module>
> > > > > main()
> > > > > File "pmu-events/jevents.py", line 1487, in main
> > > > > with concurrent.futures.ProcessPoolExecutor(initializer=_init_worker, initargs=(_arch_std_events,)) as executor:
> > > > > TypeError: __init__() got an unexpected keyword argument 'initializer'
> > > > > make[3]: *** [pmu-events/Build:176: /tmp/build/perf/pmu-events/test-empty-pmu-events.c] Error 1
> > > > > make[3]: *** Deleting file '/tmp/build/perf/pmu-events/test-empty-pmu-events.c'
> > > > > make[2]: *** [Makefile.perf:554: /tmp/build/perf/pmu-events/pmu-events-in.o] Error 2
> > > > > make[2]: *** Waiting for unfinished jobs....
> > > >
> > > > But:
> > > >
> > > > toolsbuilder@five:~$ export BUILD_TARBALL=http://192.168.86.5/perf/perf-7.1.0-rc2.tar.xz
> > > > toolsbuilder@five:~$ time dm
> > > > 1 8.77 almalinux:8 : FAIL gcc version 8.5.0 20210514 (Red Hat 8.5.0-28) (GCC)
> > > > 2 84.96 almalinux:9 : Ok gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-11) , clang version 20.1.8 (AlmaLinux OS Foundation 20.1.8-3.el9) flex 2.6.4
> > > > 3: 103.23 almalinux:9-i386 : Ok gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3) , clang version 17.0.6 (AlmaLinux OS Foundation 17.0.6-5.el9) flex 2.6.4
> > > > 4 90.91 almalinux:10 : Ok gcc (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2) , clang version 20.1.8 (AlmaLinux OS Foundation 20.1.8-1.el10.alma.1) flex 2.6.4
> > > > 5 118.21 alpine:3.16 : Ok gcc (Alpine 11.2.1_git20220219) 11.2.1 20220219 , Alpine clang version 13.0.1 flex 2.6.4
> > > > ...
> > >
> > > You can drop the parallelize jevent.py changes and I'll follow up.
> > > Sorry for the breakage.
> >
> > It was just that almalinux:8 so far, its an old system, so I'm keeping
> > it to see what other systems fail, if any.
> >
> > So far:
> >
> > toolsbuilder@five:~$ export BUILD_TARBALL=http://192.168.86.5/perf/perf-7.1.0-rc2.tar.xz
> > toolsbuilder@five:~$ time dm
> > 1 8.77 almalinux:8 : FAIL gcc version 8.5.0 20210514 (Red Hat 8.5.0-28) (GCC)
> > 2 84.96 almalinux:9 : Ok gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-11) , clang version 20.1.8 (AlmaLinux OS Foundation 20.1.8-3.el9) flex 2.6.4
> > 3: almalinux:9-i386WARNING: image platform (linux/386) does not match the expected platform (linux/amd64)
> > WARNING: image platform (linux/386) does not match the expected platform (linux/amd64)
> > 103.23 almalinux:9-i386 : Ok gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3) , clang version 17.0.6 (AlmaLinux OS Foundation 17.0.6-5.el9) flex 2.6.4
> > 4 90.91 almalinux:10 : Ok gcc (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2) , clang version 20.1.8 (AlmaLinux OS Foundation 20.1.8-1.el10.alma.1) flex 2.6.4
> > 5 118.21 alpine:3.16 : Ok gcc (Alpine 11.2.1_git20220219) 11.2.1 20220219 , Alpine clang version 13.0.1 flex 2.6.4
> > 6 106.13 alpine:3.17 : Ok gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924 , Alpine clang version 15.0.7 flex 2.6.4
> > 7 102.80 alpine:3.18 : Ok gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924 , Alpine clang version 16.0.6 flex 2.6.4
> > 8 114.48 alpine:3.19 : Ok gcc (Alpine 13.2.1_git20231014) 13.2.1 20231014 , Alpine clang version 17.0.5 flex 2.6.4
> > 9 109.53 alpine:3.20 : Ok gcc (Alpine 13.2.1_git20240309) 13.2.1 20240309 , Alpine clang version 17.0.6 flex 2.6.4
> > 10 116.20 alpine:3.22 : Ok gcc (Alpine 14.2.0) 14.2.0 , Alpine clang version 20.1.8 flex 2.6.4
> > 11 109.83 alpine:3.23 : Ok gcc (Alpine 15.2.0) 15.2.0 , Alpine clang version 21.1.2 flex 2.6.4
> > 12 119.23 alpine:edge : Ok gcc (Alpine 14.2.0) 14.2.0 , Alpine clang version 19.1.4 flex 2.6.4
> > 13 93.22 amazonlinux:2023 : Ok gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-5) , clang version 15.0.7 (AWS 15.0.7-3.amzn2023.0.4) flex 2.6.4
> > 14 93.40 amazonlinux:devel : Ok gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4) , clang version 15.0.6 (Amazon Linux 15.0.6-3.amzn2023.0.2) flex 2.6.4
> > 15 102.98 archlinux:base : Ok gcc (GCC) 15.2.1 20250813 , clang version 20.1.8 flex 2.6.4
> > 16 9.58 centos:stream : FAIL gcc version 8.5.0 20210514 (Red Hat 8.5.0-21) (GCC)
> > 17: clearlinux:latest
> >
> > COPY /tmp/build/perf/ <- pmu-events/arch/x86/westmereex/virtual-memory.json
> > GEN /tmp/build/perf/pmu-events/test-empty-pmu-events.c
> > Traceback (most recent call last):
> > File "pmu-events/jevents.py", line 1524, in <module>
> > main()
> > File "pmu-events/jevents.py", line 1487, in main
> > with concurrent.futures.ProcessPoolExecutor(initializer=_init_worker, initargs=(_arch_std_events,)) as executor:
> > TypeError: __init__() got an unexpected keyword argument 'initializer'
> > make[3]: *** [pmu-events/Build:176: /tmp/build/perf/pmu-events/test-empty-pmu-events.c] Error 1
> > make[3]: *** Deleting file '/tmp/build/perf/pmu-events/test-empty-pmu-events.c'
> > make[2]: *** [Makefile.perf:554: /tmp/build/perf/pmu-events/pmu-events-in.o] Error 2
> > make[2]: *** Waiting for unfinished jobs....
> >
> > Auto-detecting system features:
> > ... clang-bpf-co-re: [ on ]
> > ... llvm: [ on ]
> > ... libcap: [ on ]
> > ... libbfd: [ on ]
> >
> > MKDIR /tmp/build/perf/util/bpf_skel/.tmp/bootstrap/libbpf/include/bpf
> >
> >
> > centos:stream is the bleeding edge, so I'll drop that as you suggested,
> > ok.

Sgtm. I'm confused though, something old and something new broke?
In the "Minimal requirements to compile the Kernel"
(https://www.kernel.org/doc/html/latest/process/changes.html) they
state Python must be version 3.9, so it'd be nice to set that as the
baseline wrt APIs. We could probably automate that in the build and
make the build NO_PYTHON if the version is older than 3.9.

> So I removed these, i.e. from the parallelize onwards:
>
> 28 O T May 18 Ian Rogers ( 43) │ ├─>[PATCH v7 14/14] perf build: Convert llvm-config shell queries to simply expanded variables
> 29 O T May 18 Ian Rogers ( 62) │ ├─>[PATCH v7 13/14] perf pmu-events: Convert recursive shell assignments and macros to Make built-ins
> 30 O T May 18 Ian Rogers ( 47) │ ├─>[PATCH v7 12/14] perf build: Prefix SCRIPTS with output directory to fix continuous rebuilds
> 31 O T May 18 Ian Rogers ( 97) │ ├─>[PATCH v7 11/14] perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py
>

Could we keep 12, 13 and 14? They are independent changes and offer
significant build performance improvements.

Thanks,
Ian