* [PATCH v3] perf test: Fix perf stat --bpf-counters on hybrid machines
@ 2026-03-19 6:45 Namhyung Kim
2026-03-22 22:05 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 7+ messages in thread
From: Namhyung Kim @ 2026-03-19 6:45 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.
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
v3) make sure to print numbers w/o thousand separators.
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..35463358b273ce1c 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) printf "%.0f", 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) printf "%.0f", 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) printf "%.0f", 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) printf "%.0f", 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] 7+ messages in thread
* Re: [PATCH v3] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-19 6:45 [PATCH v3] perf test: Fix perf stat --bpf-counters on hybrid machines Namhyung Kim
@ 2026-03-22 22:05 ` Arnaldo Carvalho de Melo
2026-03-23 20:15 ` Ian Rogers
0 siblings, 1 reply; 7+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-03-22 22:05 UTC (permalink / raw)
To: Namhyung Kim
Cc: Ian Rogers, James Clark, Jiri Olsa, Adrian Hunter, Peter Zijlstra,
Ingo Molnar, LKML, linux-perf-users
On Wed, Mar 18, 2026 at 11:45:13PM -0700, Namhyung Kim 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.
Still doesn't pass reliably for me, only once it did work:
⬢ [acme@toolbx perf-tools]$ git log --oneline -1
38415985abcdb64d (HEAD -> perf-tools, number/perf-tools, number/HEAD) perf test: Fix perf stat --bpf-counters on hybrid machines
⬢ [acme@toolbx perf-tools]$
logout
acme@x1:~/git/perf-tools$
acme@x1:~/git/perf-tools$
acme@x1:~/git/perf-tools$ sudo su -
root@x1:~# perf -v
perf version 7.0.rc4.g38415985abcd
root@x1:~# perf test 152
152: perf stat --bpf-counters test : FAILED!
root@x1:~# set -o vi
root@x1:~# perf test -v 152
152: perf stat --bpf-counters test : Ok
root@x1:~# perf test -v 152
--- start ---
test child forked, pid 1829364
Testing --bpf-counters The difference between 21947395146 and 16947118203 are greater than 20%.
---- end(-1) ----
152: perf stat --bpf-counters test : FAILED!
root@x1:~# perf test -v 152
--- start ---
test child forked, pid 1829401
Testing --bpf-counters [Success]
Testing bpf event modifier The difference between 22461906845 and 17190344465 are greater than 20%.
---- end(-1) ----
152: perf stat --bpf-counters test : FAILED!
root@x1:~# perf test -v 152
--- start ---
test child forked, pid 1829445
Testing --bpf-counters The difference between 24210793380 and 16852007232 are greater than 20%.
---- end(-1) ----
152: perf stat --bpf-counters test : FAILED!
root@x1:~# perf test -v 152
--- start ---
test child forked, pid 1829481
Testing --bpf-counters The difference between 24293201069 and 17225814972 are greater than 20%.
---- end(-1) ----
152: perf stat --bpf-counters test : FAILED!
root@x1:~# grep -m1 "model name" /proc/cpuinfo
model name : 13th Gen Intel(R) Core(TM) i7-1365U
root@x1:~#
acme@x1:~/git/perf-tools$ uname -a
Linux x1 6.17.12-300.fc43.x86_64 #1 SMP PREEMPT_DYNAMIC Sat Dec 13 05:06:24 UTC 2025 x86_64 GNU/Linux
acme@x1:~/git/perf-tools$
> Reviewed-by: Ian Rogers <irogers@google.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> v3) make sure to print numbers w/o thousand separators.
> 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..35463358b273ce1c 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) printf "%.0f", 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) printf "%.0f", 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) printf "%.0f", 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) printf "%.0f", 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] 7+ messages in thread
* Re: [PATCH v3] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-22 22:05 ` Arnaldo Carvalho de Melo
@ 2026-03-23 20:15 ` Ian Rogers
2026-03-23 20:24 ` [RFC PATCH v1] " Ian Rogers
0 siblings, 1 reply; 7+ messages in thread
From: Ian Rogers @ 2026-03-23 20:15 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Namhyung Kim, James Clark, Jiri Olsa, Adrian Hunter,
Peter Zijlstra, Ingo Molnar, LKML, linux-perf-users
On Sun, Mar 22, 2026 at 3:05 PM Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
>
> On Wed, Mar 18, 2026 at 11:45:13PM -0700, Namhyung Kim 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.
>
> Still doesn't pass reliably for me, only once it did work:
>
> ⬢ [acme@toolbx perf-tools]$ git log --oneline -1
> 38415985abcdb64d (HEAD -> perf-tools, number/perf-tools, number/HEAD) perf test: Fix perf stat --bpf-counters on hybrid machines
> ⬢ [acme@toolbx perf-tools]$
> logout
> acme@x1:~/git/perf-tools$
> acme@x1:~/git/perf-tools$
> acme@x1:~/git/perf-tools$ sudo su -
> root@x1:~# perf -v
> perf version 7.0.rc4.g38415985abcd
> root@x1:~# perf test 152
> 152: perf stat --bpf-counters test : FAILED!
> root@x1:~# set -o vi
> root@x1:~# perf test -v 152
> 152: perf stat --bpf-counters test : Ok
> root@x1:~# perf test -v 152
> --- start ---
> test child forked, pid 1829364
> Testing --bpf-counters The difference between 21947395146 and 16947118203 are greater than 20%.
> ---- end(-1) ----
> 152: perf stat --bpf-counters test : FAILED!
> root@x1:~# perf test -v 152
> --- start ---
> test child forked, pid 1829401
> Testing --bpf-counters [Success]
> Testing bpf event modifier The difference between 22461906845 and 17190344465 are greater than 20%.
> ---- end(-1) ----
> 152: perf stat --bpf-counters test : FAILED!
> root@x1:~# perf test -v 152
> --- start ---
> test child forked, pid 1829445
> Testing --bpf-counters The difference between 24210793380 and 16852007232 are greater than 20%.
> ---- end(-1) ----
> 152: perf stat --bpf-counters test : FAILED!
> root@x1:~# perf test -v 152
> --- start ---
> test child forked, pid 1829481
> Testing --bpf-counters The difference between 24293201069 and 17225814972 are greater than 20%.
> ---- end(-1) ----
> 152: perf stat --bpf-counters test : FAILED!
> root@x1:~# grep -m1 "model name" /proc/cpuinfo
> model name : 13th Gen Intel(R) Core(TM) i7-1365U
> root@x1:~#
>
> acme@x1:~/git/perf-tools$ uname -a
> Linux x1 6.17.12-300.fc43.x86_64 #1 SMP PREEMPT_DYNAMIC Sat Dec 13 05:06:24 UTC 2025 x86_64 GNU/Linux
> acme@x1:~/git/perf-tools$
So I think the real issue here is the multiplexing value, which I've
looked to fix with:
https://lore.kernel.org/lkml/20250716223924.825772-1-irogers@google.com/
I have a patch to switch to task-clock which is a software event with
a CPU mask of all online CPUs rather than the split seen on hybrid
machines. I'll send it in reply here.
Thanks,
Ian
> > Reviewed-by: Ian Rogers <irogers@google.com>
> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> > ---
> > v3) make sure to print numbers w/o thousand separators.
> > 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..35463358b273ce1c 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) printf "%.0f", 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) printf "%.0f", 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) printf "%.0f", 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) printf "%.0f", 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] 7+ messages in thread
* [RFC PATCH v1] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-23 20:15 ` Ian Rogers
@ 2026-03-23 20:24 ` Ian Rogers
2026-03-23 20:26 ` Ian Rogers
0 siblings, 1 reply; 7+ messages in thread
From: Ian Rogers @ 2026-03-23 20:24 UTC (permalink / raw)
To: irogers
Cc: acme, adrian.hunter, james.clark, jolsa, linux-kernel,
linux-perf-users, mingo, namhyung, 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.
Signed-off-by: Ian Rogers <irogers@google.com>
---
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
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [RFC PATCH v1] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-23 20:24 ` [RFC PATCH v1] " Ian Rogers
@ 2026-03-23 20:26 ` Ian Rogers
2026-03-25 7:04 ` Namhyung Kim
0 siblings, 1 reply; 7+ messages in thread
From: Ian Rogers @ 2026-03-23 20:26 UTC (permalink / raw)
To: irogers
Cc: acme, adrian.hunter, james.clark, jolsa, linux-kernel,
linux-perf-users, mingo, namhyung, peterz
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.
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
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC PATCH v1] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-23 20:26 ` Ian Rogers
@ 2026-03-25 7:04 ` Namhyung Kim
2026-03-25 17:16 ` [PATCH v2] " Ian Rogers
0 siblings, 1 reply; 7+ 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] 7+ messages in thread
* [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
2026-03-25 7:04 ` Namhyung Kim
@ 2026-03-25 17:16 ` Ian Rogers
0 siblings, 0 replies; 7+ 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] 7+ messages in thread
end of thread, other threads:[~2026-03-25 17:17 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-19 6:45 [PATCH v3] perf test: Fix perf stat --bpf-counters on hybrid machines Namhyung Kim
2026-03-22 22:05 ` Arnaldo Carvalho de Melo
2026-03-23 20:15 ` Ian Rogers
2026-03-23 20:24 ` [RFC PATCH v1] " Ian Rogers
2026-03-23 20:26 ` Ian Rogers
2026-03-25 7:04 ` Namhyung Kim
2026-03-25 17:16 ` [PATCH v2] " Ian Rogers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox