Re: [RFC PATCH v1] perf test: Fix perf stat --bpf-counters on hybrid machines
From: Ian Rogers
Date: Mon Mar 23 2026 - 16:35:20 EST
On Mon, Mar 23, 2026 at 1:24 PM Ian Rogers <irogers@xxxxxxxxxx> wrote:
>
> Events on hardware PMUs may open on >1 hardware PMU on hybrid
> machines. Unfortunately multiplexing introduces a scaling issue as
> reported in:
> https://lore.kernel.org/lkml/20250716223924.825772-1-irogers@xxxxxxxxxx/
>
> Switch to using task-clock which as a software event runs on all CPUs
> and has a single PMU.
>
> Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
With hindsight, maybe the better thing to do is Namhyung's patch plus
the "--no-scale" option to `perf stat` to sidestep the scaling issue.
It'd be great to make this test not "(exclusive)", it shouldn't be
necessary. You can test for flakiness with the '-r' option to `perf
test` which takes a repeat count.
Thanks,
Ian
> ---
> tools/perf/tests/shell/stat_bpf_counters.sh | 35 +++++++++++----------
> 1 file changed, 18 insertions(+), 17 deletions(-)
>
> diff --git a/tools/perf/tests/shell/stat_bpf_counters.sh b/tools/perf/tests/shell/stat_bpf_counters.sh
> index f43e28a136d3..58f7dc9692ac 100755
> --- a/tools/perf/tests/shell/stat_bpf_counters.sh
> +++ b/tools/perf/tests/shell/stat_bpf_counters.sh
> @@ -5,6 +5,7 @@
> set -e
>
> workload="perf test -w sqrtloop"
> +event=task-clock
>
> # check whether $2 is within +/- 20% of $1
> compare_number()
> @@ -25,15 +26,15 @@ compare_number()
>
> check_counts()
> {
> - base_instructions=$1
> - bpf_instructions=$2
> + base_count=$(echo "$1"|sed -e 's/[^0-9]*\([0-9]*\).*/\1/')
> + bpf_count=$(echo "$2"|sed -e 's/[^0-9]*\([0-9]*\).*/\1/')
>
> - if [ "$base_instructions" = "<not" ]; then
> - echo "Skipping: instructions event not counted"
> + if [ "$base_count" = "<not" ]; then
> + echo "Skipping: $event event not counted"
> exit 2
> fi
> - if [ "$bpf_instructions" = "<not" ]; then
> - echo "Failed: instructions not counted with --bpf-counters"
> + if [ "$bpf_count" = "<not" ]; then
> + echo "Failed: $event not counted with --bpf-counters"
> exit 1
> fi
> }
> @@ -41,29 +42,29 @@ check_counts()
> test_bpf_counters()
> {
> printf "Testing --bpf-counters "
> - base_instructions=$(perf stat --no-big-num -e instructions -- $workload 2>&1 | awk '/instructions/ {print $1}')
> - bpf_instructions=$(perf stat --no-big-num --bpf-counters -e instructions -- $workload 2>&1 | awk '/instructions/ {print $1}')
> - check_counts $base_instructions $bpf_instructions
> - compare_number $base_instructions $bpf_instructions
> + base_count=$(perf stat --no-big-num -e "$event" -- $workload 2>&1 | awk "/$event/ {print \$1}")
> + bpf_count=$(perf stat --no-big-num --bpf-counters -e "$event" -- $workload 2>&1 | awk "/$event/ {print \$1}")
> + check_counts "$base_count" "$bpf_count"
> + compare_number "$base_count" "$bpf_count"
> echo "[Success]"
> }
>
> test_bpf_modifier()
> {
> printf "Testing bpf event modifier "
> - stat_output=$(perf stat --no-big-num -e instructions/name=base_instructions/,instructions/name=bpf_instructions/b -- $workload 2>&1)
> - base_instructions=$(echo "$stat_output"| awk '/base_instructions/ {print $1}')
> - bpf_instructions=$(echo "$stat_output"| awk '/bpf_instructions/ {print $1}')
> - check_counts $base_instructions $bpf_instructions
> - compare_number $base_instructions $bpf_instructions
> + stat_output=$(perf stat --no-big-num -e "$event/name=base_$event/,$event/name=bpf_$event/b" -- $workload 2>&1)
> + base_count=$(echo "$stat_output"| awk "/base_$event/ {print \$1}")
> + bpf_count=$(echo "$stat_output"| awk "/bpf_$event/ {print \$1}")
> + check_counts "$base_count" "$bpf_count"
> + compare_number "$base_count" "$bpf_count"
> echo "[Success]"
> }
>
> # skip if --bpf-counters is not supported
> -if ! perf stat -e instructions --bpf-counters true > /dev/null 2>&1; then
> +if ! perf stat -e $event --bpf-counters true > /dev/null 2>&1; then
> if [ "$1" = "-v" ]; then
> echo "Skipping: --bpf-counters not supported"
> - perf --no-pager stat -e instructions --bpf-counters true || true
> + perf --no-pager stat -e $event --bpf-counters true || true
> fi
> exit 2
> fi
> --
> 2.53.0.1018.g2bb0e51243-goog
>