perf test: Allow tolerance for leader sampling test

There is a known issue that the leader sampling is inconsistent, since
throttle only affect leader, not the slave. The detail is in [1].

To maintain test coverage, this patch sets a tolerance rate of 80% to
accommodate the throttled samples and prevent test failures due to
throttling.

[1] lore.kernel.org/20250328182752.769662-1-ctshao@google.com

Suggested-by: Ian Rogers <irogers@google.com>
Suggested-by: Thomas Richter <tmricht@linux.ibm.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Chun-Tse Shao <ctshao@google.com>
Co-developed-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Link: https://lore.kernel.org/r/20250430140611.599078-1-tmricht@linux.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Chun-Tse Shao 2025-05-15 12:55:51 -03:00 committed by Arnaldo Carvalho de Melo
parent cb422594d6
commit 1c5721ca89

View File

@ -240,22 +240,43 @@ test_leader_sampling() {
err=1
return
fi
perf script -i "${perfdata}" | grep brstack > $script_output
# Check if the two instruction counts are equal in each record.
# However, the throttling code doesn't consider event grouping. During throttling, only the
# leader is stopped, causing the slave's counts significantly higher. To temporarily solve this,
# let's set the tolerance rate to 80%.
# TODO: Revert the code for tolerance once the throttling mechanism is fixed.
index=0
perf script -i "${perfdata}" > "${script_output}"
valid_counts=0
invalid_counts=0
tolerance_rate=0.8
while IFS= read -r line
do
# Check if the two instruction counts are equal in each record
cycles=$(echo $line | awk '{for(i=1;i<=NF;i++) if($i=="cycles:") print $(i-1)}')
if [ $(($index%2)) -ne 0 ] && [ ${cycles}x != ${prev_cycles}x ]
then
echo "Leader sampling [Failed inconsistent cycles count]"
err=1
return
invalid_counts=$(($invalid_counts+1))
else
valid_counts=$(($valid_counts+1))
fi
index=$(($index+1))
prev_cycles=$cycles
done < "${script_output}"
echo "Basic leader sampling test [Success]"
total_counts=$(bc <<< "$invalid_counts+$valid_counts")
if (( $(bc <<< "$total_counts <= 0") ))
then
echo "Leader sampling [No sample generated]"
err=1
return
fi
isok=$(bc <<< "scale=2; if (($invalid_counts/$total_counts) < (1-$tolerance_rate)) { 0 } else { 1 };")
if [ $isok -eq 1 ]
then
echo "Leader sampling [Failed inconsistent cycles count]"
err=1
else
echo "Basic leader sampling test [Success]"
fi
}
test_topdown_leader_sampling() {