* [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
@ 2026-03-18 7:15 Namhyung Kim
2026-03-18 16:47 ` Ian Rogers
0 siblings, 1 reply; 4+ messages in thread
From: Namhyung Kim @ 2026-03-18 7:15 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Ian Rogers, James Clark
Cc: Jiri Olsa, Adrian Hunter, Peter Zijlstra, Ingo Molnar, LKML,
linux-perf-users
The test constantly fails on my Intel hybrid machine. The issue was it
has two events in the output even if I only gave it one event.
$ perf stat -e instructions -- perf test -w sqrtloop
Performance counter stats for 'perf test -w sqrtloop':
910,856,421 cpu_atom/instructions/ (28.05%)
14,852,865,997 cpu_core/instructions/ (96.79%)
1.014313341 seconds time elapsed
1.004114000 seconds user
0.008174000 seconds sys
Let's modify the awk script to add the values for each line and print
the total. The variable 'i' has a number of input lines that have valid
output and variable 'c' has the sum of actual counter values. That way
it should work on any platforms.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
v2) handle '<not counted>' and '<not supported>'.
tools/perf/tests/shell/stat_bpf_counters.sh | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/tools/perf/tests/shell/stat_bpf_counters.sh b/tools/perf/tests/shell/stat_bpf_counters.sh
index f43e28a136d3c9bc..8b42585f45025d5c 100755
--- a/tools/perf/tests/shell/stat_bpf_counters.sh
+++ b/tools/perf/tests/shell/stat_bpf_counters.sh
@@ -41,8 +41,14 @@ 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}')
+ base_instructions=$(perf stat --no-big-num -e instructions -- $workload 2>&1 | \
+ awk -v i=0 -v c=0 '/instructions/ { \
+ if ($1 != "<not") { i++; c += $1 } \
+ } END { if (i > 0) print c; else print "<not" }')
+ bpf_instructions=$(perf stat --no-big-num --bpf-counters -e instructions -- $workload 2>&1 | \
+ awk -v i=0 -v c=0 '/instructions/ { \
+ if ($1 != "<not") { i++; c += $1 } \
+ } END { if (i > 0) print c; else print "<not" }')
check_counts $base_instructions $bpf_instructions
compare_number $base_instructions $bpf_instructions
echo "[Success]"
@@ -52,8 +58,14 @@ 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}')
+ base_instructions=$(echo "$stat_output"| \
+ awk -v i=0 -v c=0 '/base_instructions/ { \
+ if ($1 != "<not") { i++; c += $1 } \
+ } END { if (i > 0) print c; else print "<not" }')
+ bpf_instructions=$(echo "$stat_output"| \
+ awk -v i=0 -v c=0 '/bpf_instructions/ { \
+ if ($1 != "<not") { i++; c += $1 } \
+ } END { if (i > 0) print c; else print "<not" }')
check_counts $base_instructions $bpf_instructions
compare_number $base_instructions $bpf_instructions
echo "[Success]"
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-18 7:15 [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines Namhyung Kim
@ 2026-03-18 16:47 ` Ian Rogers
0 siblings, 0 replies; 4+ messages in thread
From: Ian Rogers @ 2026-03-18 16:47 UTC (permalink / raw)
To: Namhyung Kim
Cc: Arnaldo Carvalho de Melo, James Clark, Jiri Olsa, Adrian Hunter,
Peter Zijlstra, Ingo Molnar, LKML, linux-perf-users
On Wed, Mar 18, 2026 at 12:15 AM Namhyung Kim <namhyung@kernel.org> wrote:
>
> The test constantly fails on my Intel hybrid machine. The issue was it
> has two events in the output even if I only gave it one event.
>
> $ perf stat -e instructions -- perf test -w sqrtloop
>
> Performance counter stats for 'perf test -w sqrtloop':
>
> 910,856,421 cpu_atom/instructions/ (28.05%)
> 14,852,865,997 cpu_core/instructions/ (96.79%)
>
> 1.014313341 seconds time elapsed
>
> 1.004114000 seconds user
> 0.008174000 seconds sys
>
> Let's modify the awk script to add the values for each line and print
> the total. The variable 'i' has a number of input lines that have valid
> output and variable 'c' has the sum of actual counter values. That way
> it should work on any platforms.
>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> v2) handle '<not counted>' and '<not supported>'.
Reviewed-by: Ian Rogers <irogers@google.com>
Thanks!
Ian
> tools/perf/tests/shell/stat_bpf_counters.sh | 20 ++++++++++++++++----
> 1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/tests/shell/stat_bpf_counters.sh b/tools/perf/tests/shell/stat_bpf_counters.sh
> index f43e28a136d3c9bc..8b42585f45025d5c 100755
> --- a/tools/perf/tests/shell/stat_bpf_counters.sh
> +++ b/tools/perf/tests/shell/stat_bpf_counters.sh
> @@ -41,8 +41,14 @@ 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}')
> + base_instructions=$(perf stat --no-big-num -e instructions -- $workload 2>&1 | \
> + awk -v i=0 -v c=0 '/instructions/ { \
> + if ($1 != "<not") { i++; c += $1 } \
> + } END { if (i > 0) print c; else print "<not" }')
> + bpf_instructions=$(perf stat --no-big-num --bpf-counters -e instructions -- $workload 2>&1 | \
> + awk -v i=0 -v c=0 '/instructions/ { \
> + if ($1 != "<not") { i++; c += $1 } \
> + } END { if (i > 0) print c; else print "<not" }')
> check_counts $base_instructions $bpf_instructions
> compare_number $base_instructions $bpf_instructions
> echo "[Success]"
> @@ -52,8 +58,14 @@ 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}')
> + base_instructions=$(echo "$stat_output"| \
> + awk -v i=0 -v c=0 '/base_instructions/ { \
> + if ($1 != "<not") { i++; c += $1 } \
> + } END { if (i > 0) print c; else print "<not" }')
> + bpf_instructions=$(echo "$stat_output"| \
> + awk -v i=0 -v c=0 '/bpf_instructions/ { \
> + if ($1 != "<not") { i++; c += $1 } \
> + } END { if (i > 0) print c; else print "<not" }')
> check_counts $base_instructions $bpf_instructions
> compare_number $base_instructions $bpf_instructions
> echo "[Success]"
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC PATCH v1] perf test: Fix perf stat --bpf-counters on hybrid machines
@ 2026-03-25 7:04 Namhyung Kim
2026-03-25 17:16 ` [PATCH v2] " Ian Rogers
0 siblings, 1 reply; 4+ messages in thread
From: Namhyung Kim @ 2026-03-25 7:04 UTC (permalink / raw)
To: Ian Rogers
Cc: acme, adrian.hunter, james.clark, jolsa, linux-kernel,
linux-perf-users, mingo, peterz
On Mon, Mar 23, 2026 at 01:26:11PM -0700, Ian Rogers wrote:
> On Mon, Mar 23, 2026 at 1:24 PM Ian Rogers <irogers@google.com> 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@google.com/
> >
> > 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@google.com>
>
> 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.
I think your fix is simpler and better. :)
Acked-by: Namhyung Kim <namhyung@kernel.org>
Thanks,
Namhyung
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-25 7:04 [RFC PATCH v1] " Namhyung Kim
@ 2026-03-25 17:16 ` Ian Rogers
2026-04-03 19:20 ` Falcon, Thomas
0 siblings, 1 reply; 4+ messages in thread
From: Ian Rogers @ 2026-03-25 17:16 UTC (permalink / raw)
To: namhyung
Cc: acme, adrian.hunter, irogers, james.clark, jolsa, linux-kernel,
linux-perf-users, mingo, peterz
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@google.com/
Switch to using task-clock which as a software event runs on all CPUs
and has a single PMU.
For when hybrid event scaling is fixed, incorporate support for
combining hybrid counts as posted by Namhyung Kim in:
https://lore.kernel.org/lkml/20260319064513.9269-1-namhyung@kernel.org/
Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
---
v1: https://lore.kernel.org/lkml/20260323202409.194123-1-irogers@google.com/
---
tools/perf/tests/shell/stat_bpf_counters.sh | 55 ++++++++++++++-------
1 file changed, 38 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..f8c24ccc7830 100755
--- a/tools/perf/tests/shell/stat_bpf_counters.sh
+++ b/tools/perf/tests/shell/stat_bpf_counters.sh
@@ -5,6 +5,24 @@
set -e
workload="perf test -w sqrtloop"
+event=task-clock
+
+extract_count()
+{
+ local target_event="$1"
+
+ awk -v target="$target_event" -v i=0 -v c=0 '
+ $0 ~ target {
+ i++;
+ c += $1
+ }
+ END {
+ if (i > 0)
+ printf "%.0f\n", c;
+ else
+ print "<not counted>"
+ }'
+}
# check whether $2 is within +/- 20% of $1
compare_number()
@@ -25,15 +43,15 @@ compare_number()
check_counts()
{
- base_instructions=$1
- bpf_instructions=$2
+ base_count=$1
+ bpf_count=$2
- if [ "$base_instructions" = "<not" ]; then
- echo "Skipping: instructions event not counted"
+ if [ "$base_count" = "<not counted>" ]; 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 counted>" ]; then
+ echo "Failed: $event not counted with --bpf-counters"
exit 1
fi
}
@@ -41,29 +59,32 @@ 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 \
+ | extract_count "$event")
+ bpf_count=$(perf stat --no-big-num --bpf-counters -e "$event" -- $workload 2>&1 \
+ | extract_count "$event")
+ 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" | extract_count "base_$event")
+ bpf_count=$(echo "$stat_output"| extract_count "bpf_$event")
+ 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
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-25 17:16 ` [PATCH v2] " Ian Rogers
@ 2026-04-03 19:20 ` Falcon, Thomas
0 siblings, 0 replies; 4+ messages in thread
From: Falcon, Thomas @ 2026-04-03 19:20 UTC (permalink / raw)
To: namhyung@kernel.org, Rogers, Ian
Cc: james.clark@linaro.org, mingo@kernel.org, peterz@infradead.org,
acme@kernel.org, linux-perf-users@vger.kernel.org,
linux-kernel@vger.kernel.org, Hunter, Adrian, jolsa@kernel.org
On Wed, 2026-03-25 at 10:16 -0700, Ian Rogers 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@google.com/
>
> Switch to using task-clock which as a software event runs on all CPUs
> and has a single PMU.
>
> For when hybrid event scaling is fixed, incorporate support for
> combining hybrid counts as posted by Namhyung Kim in:
> https://lore.kernel.org/lkml/20260319064513.9269-1-namhyung@kernel.org/
>
> Signed-off-by: Ian Rogers <irogers@google.com>
> Acked-by: Namhyung Kim <namhyung@kernel.org>
$ sudo ./perf test "perf stat --bpf-counters test" -vvv
Before:
152: perf stat --bpf-counters test:
--- start ---
test child forked, pid 444406
Testing --bpf-counters The difference between 400418163 and 11886805947
are greater than 20%.
---- end(-1) ----
152: perf stat --bpf-counters test :
FAILED!
After:
152: perf stat --bpf-counters test:
--- start ---
test child forked, pid 466896
Testing --bpf-counters [Success]
Testing bpf event modifier [Success]
---- end(0) ----
152: perf stat --bpf-counters test :
Ok
Tested-by: Thomas Falcon <thomas.falcon@intel.com>
Thanks,
Tom
> ---
> v1:
> https://lore.kernel.org/lkml/20260323202409.194123-1-irogers@google.com/
> ---
> tools/perf/tests/shell/stat_bpf_counters.sh | 55 ++++++++++++++-----
> --
> 1 file changed, 38 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..f8c24ccc7830 100755
> --- a/tools/perf/tests/shell/stat_bpf_counters.sh
> +++ b/tools/perf/tests/shell/stat_bpf_counters.sh
> @@ -5,6 +5,24 @@
> set -e
>
> workload="perf test -w sqrtloop"
> +event=task-clock
> +
> +extract_count()
> +{
> + local target_event="$1"
> +
> + awk -v target="$target_event" -v i=0 -v c=0 '
> + $0 ~ target {
> + i++;
> + c += $1
> + }
> + END {
> + if (i > 0)
> + printf "%.0f\n", c;
> + else
> + print "<not counted>"
> + }'
> +}
>
> # check whether $2 is within +/- 20% of $1
> compare_number()
> @@ -25,15 +43,15 @@ compare_number()
>
> check_counts()
> {
> - base_instructions=$1
> - bpf_instructions=$2
> + base_count=$1
> + bpf_count=$2
>
> - if [ "$base_instructions" = "<not" ]; then
> - echo "Skipping: instructions event not counted"
> + if [ "$base_count" = "<not counted>" ]; 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 counted>" ]; then
> + echo "Failed: $event not counted with --bpf-
> counters"
> exit 1
> fi
> }
> @@ -41,29 +59,32 @@ 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 \
> + | extract_count "$event")
> + bpf_count=$(perf stat --no-big-num --bpf-counters -e
> "$event" -- $workload 2>&1 \
> + | extract_count "$event")
> + 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_instructio
> ns/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" | extract_count
> "base_$event")
> + bpf_count=$(echo "$stat_output"| extract_count
> "bpf_$event")
> + 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
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-04-03 19:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-18 7:15 [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines Namhyung Kim
2026-03-18 16:47 ` Ian Rogers
-- strict thread matches above, loose matches on Subject: below --
2026-03-25 7:04 [RFC PATCH v1] " Namhyung Kim
2026-03-25 17:16 ` [PATCH v2] " Ian Rogers
2026-04-03 19:20 ` Falcon, Thomas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox