[PATCH v11 00/19] perf: Use e_machine and lazily compute symbols

From: Ian Rogers

Date: Tue Jun 02 2026 - 02:26:06 EST


Add a helper to perf_env to compute the e_machine if it is EM_NONE.
Derive the value from the arch string if available. Similarly derive
the arch string from the ELF machine if available, for consistency.
This means perf's arch (machine type) is no longer determined by uname
but set to match that of the perf ELF executable.

Migrate code away from strcmp on env->arch to using the e_machine
comparisons that are more accurate and not prone to uname and other
naming differences. While cleaning this up, also clean up the
capstone initialization code to cover more architectures and to set
the big endian flag based on ELF header information.

Introduce a mutex in perf_env to safely protect lazy metadata setup,
such as os_release or e_machine resolution, preventing concurrent
initialization data races and memory leaks during multi-threaded
profiling or symbol loading.

Switch the idle computation to the point of use and lazily compute it,
rather than computing it for every symbol. The current only user is
`perf top`. At the point of use the perf_env is available and this can
be used to make sure the idle function computation correctly accounts
for architecture-specific and kernel-version-specific patterns.
To prevent concurrent updates to shared symbol bitfield flags, migrate
bitfield variables in struct symbol to C11 atomic flags.

Ian Rogers (19):
perf env: Add perf_env__e_machine helper and use in perf_env__arch
perf tests topology: Switch env->arch use to env->e_machine
perf env, dso, thread: Add _endian variants for e_machine helpers
perf capstone: Determine architecture from e_machine
perf print_insn: Use e_machine for fallback IP length check
perf symbol: Avoid use of machine__is
perf machine: Use perf_env e_machine rather than arch
perf sample-raw: Use perf_env e_machine rather than arch
perf sort: Use perf_env e_machine rather than arch
perf arch common: Use perf_env e_machine rather than arch
perf header: In print_pmu_caps use perf_env e_machine
perf c2c: Use perf_env e_machine rather than arch
perf lock-contention: Use perf_env e_machine rather than arch
perf env: Refactor perf_env__arch_strerrno
perf env: Remove unused perf_env__raw_arch
perf env: Add mutex to protect lazy environment initialization
perf env: Add helper to lazily compute the os_release
perf symbol: Add setters for bitfields sharing a byte to avoid
concurrent update issues
perf symbol: Lazily compute idle

tools/perf/arch/common.c | 92 +++--
tools/perf/builtin-c2c.c | 40 +-
tools/perf/builtin-inject.c | 10 +-
tools/perf/builtin-kwork.c | 2 +-
tools/perf/builtin-report.c | 2 +-
tools/perf/builtin-sched.c | 4 +-
tools/perf/builtin-top.c | 7 +-
tools/perf/builtin-trace.c | 7 +-
tools/perf/tests/symbols.c | 2 +-
tools/perf/tests/topology.c | 8 +-
tools/perf/tests/vmlinux-kallsyms.c | 2 +-
tools/perf/trace/beauty/Build | 1 +
tools/perf/trace/beauty/arch_errno_names.sh | 41 +-
tools/perf/ui/browsers/annotate.c | 2 +-
tools/perf/ui/browsers/map.c | 4 +-
tools/perf/util/annotate.c | 5 +-
tools/perf/util/auxtrace.c | 6 +-
tools/perf/util/callchain.c | 4 +-
tools/perf/util/capstone.c | 132 ++++---
tools/perf/util/data-convert-bt.c | 2 +-
tools/perf/util/data-convert-json.c | 6 +-
tools/perf/util/dlfilter.c | 2 +-
tools/perf/util/dso.c | 19 +-
tools/perf/util/dso.h | 14 +-
tools/perf/util/env.c | 374 ++++++++++++++----
tools/perf/util/env.h | 14 +-
tools/perf/util/evsel_fprintf.c | 6 +-
tools/perf/util/header.c | 55 ++-
tools/perf/util/intel-pt.c | 2 +-
tools/perf/util/libdw.c | 2 +-
tools/perf/util/lock-contention.c | 6 +-
tools/perf/util/machine.c | 37 +-
tools/perf/util/machine.h | 2 -
tools/perf/util/print_insn.c | 23 +-
tools/perf/util/print_insn.h | 2 +
tools/perf/util/probe-event.c | 4 +-
tools/perf/util/sample-raw.c | 21 +-
tools/perf/util/sample-raw.h | 6 +-
.../util/scripting-engines/trace-event-perl.c | 2 +-
.../scripting-engines/trace-event-python.c | 4 +-
tools/perf/util/session.c | 26 +-
tools/perf/util/sort.c | 66 ++--
tools/perf/util/srcline.c | 10 +-
tools/perf/util/symbol-elf.c | 5 +-
tools/perf/util/symbol.c | 238 ++++++++---
tools/perf/util/symbol.h | 80 +++-
tools/perf/util/symbol_fprintf.c | 4 +-
tools/perf/util/thread.c | 58 ++-
tools/perf/util/thread.h | 23 +-
49 files changed, 1064 insertions(+), 420 deletions(-)

--
2.54.0.929.g9b7fa37559-goog