[PATCH: Fix for_each_set_bit(u64) build on 32-bit arches, was perf intel-pt: Add support for PERF_RECORD_AUX_OUTPUT_HW_ID

From: Arnaldo Carvalho de Melo
Date: Mon Oct 25 2021 - 12:52:49 EST


Em Wed, Oct 20, 2021 at 02:25:43PM -0300, Arnaldo Carvalho de Melo escreveu:
> 29 8.60 debian:experimental-x-mipsel : FAIL gcc version 11.2.0 (Debian 11.2.0-9)
> util/intel-pt.c: In function 'intel_pt_synth_pebs_sample':
> util/intel-pt.c:2146:33: error: passing argument 1 of 'find_first_bit' from incompatible pointer type [-Werror=incompatible-pointer-types]
> 2146 | for_each_set_bit(hw_id, &items->applicable_counters, INTEL_PT_MAX_PEBS) {
> /git/perf-5.15.0-rc4/tools/include/linux/bitops.h:37:38: note: in definition of macro 'for_each_set_bit'
> 37 | for ((bit) = find_first_bit((addr), (size)); \
> | ^~~~
> In file included from /git/perf-5.15.0-rc4/tools/include/asm-generic/bitops.h:21,
> from /git/perf-5.15.0-rc4/tools/include/linux/bitops.h:34,
> from /git/perf-5.15.0-rc4/tools/include/linux/bitmap.h:6,
> from util/header.h:10,
> from util/session.h:7,
> from util/intel-pt.c:16:
> /git/perf-5.15.0-rc4/tools/include/asm-generic/bitops/find.h:109:51: note: expected 'const long unsigned int *' but argument is of type 'const uint64_t *' {aka 'const long long unsigned int *'}
>
> Adrian, this is on:
>
> commit 803a3c9233990e1adac8ea2421e3759c2d380cf8
> Author: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> Date: Tue Sep 7 19:39:03 2021 +0300
>
> perf intel-pt: Add support for PERF_RECORD_AUX_OUTPUT_HW_ID
>
> Originally, software only supported redirecting at most one PEBS event to
> Intel PT (PEBS-via-PT) because it was not able to differentiate one event
> from another. To overcome that, add support for the
> PERF_RECORD_AUX_OUTPUT_HW_ID side-band event.
>
> Reviewed-by: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx>
> Reviewed-by: Andi Kleen <ak@xxxxxxxxxxxxxxx>
>
>
> That is still just on tmp.perf/core, so we can fix it, probably its just
> making that uint64_t into a unsigned long, will check later if you don't
> beat me to it.

Do as other code in perf does, e.g. arch/x86/events/intel/ds.c, dealing
with PEBS.

I'm adding this to that patch to fix the build on 32-bit.

- Arnaldo


diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index 1073c56a512cdc6e..c9542fada8fb6f9b 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -2143,7 +2143,7 @@ static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq)
return intel_pt_synth_single_pebs_sample(ptq);
}

- for_each_set_bit(hw_id, &items->applicable_counters, INTEL_PT_MAX_PEBS) {
+ for_each_set_bit(hw_id, (unsigned long *)&items->applicable_counters, INTEL_PT_MAX_PEBS) {
pe = &ptq->pebs[hw_id];
if (!pe->evsel) {
if (!pt->single_pebs)