[PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines

Namhyung Kim posted 1 patch 2 weeks, 5 days ago
There is a newer version of this series
tools/perf/tests/shell/stat_bpf_counters.sh | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
[PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
Posted by Namhyung Kim 2 weeks, 5 days ago
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
Re: [PATCH v2] perf test: Fix perf stat --bpf-counters on hybrid machines
Posted by Ian Rogers 2 weeks, 5 days ago
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
>