On 14/01/2026 12:14 pm, James Clark wrote:
On 13/01/2026 10:13 pm, Arnaldo Carvalho de Melo wrote:
On Mon, Dec 22, 2025 at 03:14:27PM +0000, James Clark wrote:
Make the evsel argument first to match the other evsel__* functions and remove the redundant pmu argument, which can be accessed via evsel.
I haven't checked if this is the exactly where this takes place but should be in this series, 32-bit build is broken:
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) 21.72 almalinux:9-i386 : FAIL gcc version 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC) 1378 | perf_pmu__format_pack(&bits, val, vp, /*zero=*/ true); | ^~~~~ | | | u64 * {aka long long unsigned int *} In file included from util/evsel.h:14, from util/evsel.c:38: util/pmu.h:282:43: note: expected ‘long unsigned int *’ but argument is of type ‘u64 *’ {aka ‘long long unsigned int *’} 282 | void perf_pmu__format_pack(unsigned long *format, __u64 value, __u64 *v, | ~~~~~~~~~~~~~~~^~~~~~
What I have is in perf-tools-next/tmp.perf-tools-next BTW, I'll try and fix this tomorrow if you don't do it first. :-)
Taking a look, but I'm wondering if this is already not working properly. There are existing "unsigned long"s in pmu.c that operate on the config bits which is what I copied.
On this target an unsigned long is 32bits but struct perf_event_attr-
configs are __u64. So it looks like it might leave the top bits unset
sometimes.
I'll look at a fix for that which should fix the compilation error at the same time.
False alarm, I was confusing a pointer to a single unsigned long with what are actually DECLARE_BITMAP()s. So they're two longs in this case for 64 bits.
I'll send a fix for the compilation issue and double check the patches to make sure that misunderstanding hasn't caused any issues.
Another question is, do we actually care about this platform?
There are some more build problems in other containers/distros, I'll be reporting as replies to the patches that looks related
- Arnaldo
Signed-off-by: James Clark james.clark@linaro.org
tools/perf/arch/arm/util/cs-etm.c | 9 +++------ tools/perf/arch/arm64/util/arm-spe.c | 2 +- tools/perf/arch/x86/util/intel-pt.c | 3 +-- tools/perf/util/evsel.h | 4 ++-- tools/perf/util/pmu.c | 6 +++--- 5 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/tools/perf/arch/arm/util/cs-etm.c b/tools/perf/arch/arm/ util/cs-etm.c index ea891d12f8f4..c28208361d91 100644 --- a/tools/perf/arch/arm/util/cs-etm.c +++ b/tools/perf/arch/arm/util/cs-etm.c @@ -441,10 +441,8 @@ static int cs_etm_recording_options(struct auxtrace_record *itr, * when a context switch happened. */ if (!perf_cpu_map__is_any_cpu_or_is_empty(cpus)) { - evsel__set_config_if_unset(cs_etm_pmu, cs_etm_evsel, - "timestamp", 1); - evsel__set_config_if_unset(cs_etm_pmu, cs_etm_evsel, - "contextid", 1); + evsel__set_config_if_unset(cs_etm_evsel, "timestamp", 1); + evsel__set_config_if_unset(cs_etm_evsel, "contextid", 1); } /* @@ -453,8 +451,7 @@ static int cs_etm_recording_options(struct auxtrace_record *itr, * timestamp tracing. */ if (opts->sample_time_set) - evsel__set_config_if_unset(cs_etm_pmu, cs_etm_evsel, - "timestamp", 1); + evsel__set_config_if_unset(cs_etm_evsel, "timestamp", 1); /* Add dummy event to keep tracking */ err = parse_event(evlist, "dummy:u"); diff --git a/tools/perf/arch/arm64/util/arm-spe.c b/tools/perf/arch/ arm64/util/arm-spe.c index d5ec1408d0ae..51014f8bff97 100644 --- a/tools/perf/arch/arm64/util/arm-spe.c +++ b/tools/perf/arch/arm64/util/arm-spe.c @@ -274,7 +274,7 @@ static void arm_spe_setup_evsel(struct evsel *evsel, struct perf_cpu_map *cpus) */ if (!perf_cpu_map__is_any_cpu_or_is_empty(cpus)) { evsel__set_sample_bit(evsel, CPU); - evsel__set_config_if_unset(evsel->pmu, evsel, "ts_enable", 1); + evsel__set_config_if_unset(evsel, "ts_enable", 1); } /* diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/ x86/util/intel-pt.c index b394ad9cc635..c131a727774f 100644 --- a/tools/perf/arch/x86/util/intel-pt.c +++ b/tools/perf/arch/x86/util/intel-pt.c @@ -664,8 +664,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr, return 0; if (opts->auxtrace_sample_mode) - evsel__set_config_if_unset(intel_pt_pmu, intel_pt_evsel, - "psb_period", 0); + evsel__set_config_if_unset(intel_pt_evsel, "psb_period", 0); err = intel_pt_validate_config(intel_pt_pmu, intel_pt_evsel); if (err) diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index a08130ff2e47..2cf87bc67df7 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -575,8 +575,8 @@ void evsel__uniquify_counter(struct evsel *counter); ((((src) >> (pos)) & ((1ull << (size)) - 1)) << (63 - ((pos) + (size) - 1))) u64 evsel__bitfield_swap_branch_flags(u64 value); -void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel, - const char *config_name, u64 val); +void evsel__set_config_if_unset(struct evsel *evsel, const char *config_name, + u64 val); bool evsel__is_offcpu_event(struct evsel *evsel); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 956ea273c2c7..e87c12946d71 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1382,8 +1382,8 @@ bool evsel__is_aux_event(const struct evsel *evsel) * something to true, pass 1 for val rather than a pre shifted value. */ #define field_prep(_mask, _val) (((_val) << (ffsll(_mask) - 1)) & (_mask)) -void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel, - const char *config_name, u64 val) +void evsel__set_config_if_unset(struct evsel *evsel, const char *config_name, + u64 val) { u64 user_bits = 0, bits; struct evsel_config_term *term = evsel__get_config_term(evsel, CFG_CHG); @@ -1391,7 +1391,7 @@ void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel, if (term) user_bits = term->val.cfg_chg; - bits = perf_pmu__format_bits(pmu, config_name); + bits = perf_pmu__format_bits(evsel->pmu, config_name); /* Do nothing if the user changed the value */ if (bits & user_bits)
-- 2.34.1