]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf test: Fix perf stat --bpf-counters on hybrid machines
authorNamhyung Kim <namhyung@kernel.org>
Thu, 19 Mar 2026 06:45:13 +0000 (23:45 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Wed, 1 Apr 2026 21:50:53 +0000 (14:50 -0700)
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>
tools/perf/tests/shell/stat_bpf_counters.sh

index f43e28a136d3c9bc841e654c8630e72d83ac7cd0..35463358b273ce1c653151e9fd43c10934ccfaa9 100755 (executable)
@@ -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]"