[PATCH 1/2] perf test: Fix LBR test by ignoring idle task

From: Namhyung Kim
Date: Fri May 09 2025 - 17:30:28 EST


I found 'perf record LBR tests' failing due to empty branch stacks.

$ perf test -v LBR
...
LBR system wide any branch test
Lowering default frequency rate from 4000 to 1000.
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
[ perf record: Woken up 8 times to write data ]
[ perf record: Captured and wrote 3.142 MB /tmp/__perf_test.perf.data.dgSBl (3572 samples) ]
LBR system wide any branch test: 3572 samples
LBR system wide any branch test [Failed empty br stack ratio exceed 2%: 3%]
LBR system wide any call test
Lowering default frequency rate from 4000 to 1000.
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
[ perf record: Woken up 8 times to write data ]
[ perf record: Captured and wrote 3.337 MB /tmp/__perf_test.perf.data.dgSBl (3967 samples) ]
LBR system wide any call test: 3967 samples
LBR system wide any call test [Failed empty br stack ratio exceed 2%: 9%]
...

The failing cases were in system-wide mode and I realized that the
samples were from the idle tasks (swapper). I suspect going to/from
idle state may affect the LBR contents.

If we can skip empty branch stacks from the idle tasks, the failure
should go away. I can see the following output in perf report -D.

$ perf report -D | grep -m5 -A3 'branch stack: nr:0'
...
--
... branch stack: nr:0
... thread: swapper:0
...... dso: /proc/kcore

--
... branch stack: nr:0
... thread: swapper:0
...... dso: /proc/kcore

--
... branch stack: nr:0
... thread: DefaultEventMan:10282
...... dso: /proc/kcore

--
... branch stack: nr:0
... thread: swapper:0
...... dso: /proc/kcore

--
... branch stack: nr:0
... thread: swapper:0
...... dso: /proc/kcore

$ perf report -D | grep -c 'branch stack: nr:0'
145

$ perf report -D | grep -A3 'branch stack: nr:0' | grep thread | grep -c swapper
i36

$ perf report -D | grep -A3 'branch stack: nr:0' | grep thread | grep -cv swapper
9

Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/tests/shell/record_lbr.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/tests/shell/record_lbr.sh b/tools/perf/tests/shell/record_lbr.sh
index 8d750ee631f877fd..afad02d0180e023c 100755
--- a/tools/perf/tests/shell/record_lbr.sh
+++ b/tools/perf/tests/shell/record_lbr.sh
@@ -93,7 +93,7 @@ lbr_test() {
return
fi

- zero_nr=$(echo "$out" | grep -c 'branch stack: nr:0' || true)
+ zero_nr=$(echo "$out" | grep -A3 'branch stack: nr:0' | grep thread | grep -cv swapper || true)
r=$(($zero_nr * 100 / $bs_nr))
if [ $r -gt $threshold ]; then
echo "$test [Failed empty br stack ratio exceed $threshold%: $r%]"
--
2.49.0.1015.ga840276032-goog