* [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