perf test: Add test case for the standard 'perf stat' output
Add a new test case to verify the standard 'perf stat' output with different options. Reviewed-by: Ian Rogers <irogers@google.com> Signed-off-by: Kan Liang <kan.liang@linux.intel.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Ahmad Yasin <ahmad.yasin@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: https://lore.kernel.org/r/20230616031420.3751973-5-kan.liang@linux.intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
fc51fc87b1
Коммит
99a04a48f2
|
@ -0,0 +1,108 @@
|
|||
#!/bin/bash
|
||||
# perf stat STD output linter
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Tests various perf stat STD output commands for
|
||||
# default event and metricgroup
|
||||
|
||||
set -e
|
||||
|
||||
. $(dirname $0)/lib/stat_output.sh
|
||||
|
||||
stat_output=$(mktemp /tmp/__perf_test.stat_output.std.XXXXX)
|
||||
|
||||
event_name=(cpu-clock task-clock context-switches cpu-migrations page-faults cycles instructions branches branch-misses stalled-cycles-frontend stalled-cycles-backend)
|
||||
event_metric=("CPUs utilized" "CPUs utilized" "/sec" "/sec" "/sec" "GHz" "insn per cycle" "/sec" "of all branches" "frontend cycles idle" "backend cycles idle")
|
||||
|
||||
metricgroup_name=(TopdownL1 TopdownL2)
|
||||
|
||||
cleanup() {
|
||||
rm -f "${stat_output}"
|
||||
|
||||
trap - EXIT TERM INT
|
||||
}
|
||||
|
||||
trap_cleanup() {
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
trap trap_cleanup EXIT TERM INT
|
||||
|
||||
function commachecker()
|
||||
{
|
||||
local -i cnt=0
|
||||
local prefix=1
|
||||
|
||||
case "$1"
|
||||
in "--interval") prefix=2
|
||||
;; "--per-thread") prefix=2
|
||||
;; "--system-wide-no-aggr") prefix=2
|
||||
;; "--per-core") prefix=3
|
||||
;; "--per-socket") prefix=3
|
||||
;; "--per-node") prefix=3
|
||||
;; "--per-die") prefix=3
|
||||
;; "--per-cache") prefix=3
|
||||
esac
|
||||
|
||||
while read line
|
||||
do
|
||||
# Ignore initial "started on" comment.
|
||||
x=${line:0:1}
|
||||
[ "$x" = "#" ] && continue
|
||||
# Ignore initial blank line.
|
||||
[ "$line" = "" ] && continue
|
||||
# Ignore "Performance counter stats"
|
||||
x=${line:0:25}
|
||||
[ "$x" = "Performance counter stats" ] && continue
|
||||
# Ignore "seconds time elapsed" and break
|
||||
[[ "$line" == *"time elapsed"* ]] && break
|
||||
|
||||
main_body=$(echo $line | cut -d' ' -f$prefix-)
|
||||
x=${main_body%#*}
|
||||
# Check default metricgroup
|
||||
y=$(echo $x | tr -d ' ')
|
||||
[ "$y" = "" ] && continue
|
||||
for i in "${!metricgroup_name[@]}"; do
|
||||
[[ "$y" == *"${metricgroup_name[$i]}"* ]] && break
|
||||
done
|
||||
[[ "$y" == *"${metricgroup_name[$i]}"* ]] && continue
|
||||
|
||||
# Check default event
|
||||
for i in "${!event_name[@]}"; do
|
||||
[[ "$x" == *"${event_name[$i]}"* ]] && break
|
||||
done
|
||||
|
||||
[[ ! "$x" == *"${event_name[$i]}"* ]] && {
|
||||
echo "Unknown event name in $line" 1>&2
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# Check event metric if it exists
|
||||
[[ ! "$main_body" == *"#"* ]] && continue
|
||||
[[ ! "$main_body" == *"${event_metric[$i]}"* ]] && {
|
||||
echo "wrong event metric. expected ${event_metric[$i]} in $line" 1>&2
|
||||
exit 1;
|
||||
}
|
||||
done < "${stat_output}"
|
||||
return 0
|
||||
}
|
||||
|
||||
perf_cmd="-o ${stat_output}"
|
||||
|
||||
skip_test=$(check_for_topology)
|
||||
check_no_args "STD" "$perf_cmd"
|
||||
check_system_wide "STD" "$perf_cmd"
|
||||
check_interval "STD" "$perf_cmd"
|
||||
check_per_thread "STD" "$perf_cmd"
|
||||
check_per_node "STD" "$perf_cmd"
|
||||
if [ $skip_test -ne 1 ]
|
||||
then
|
||||
check_system_wide_no_aggr "STD" "$perf_cmd"
|
||||
check_per_core "STD" "$perf_cmd"
|
||||
check_per_cache_instance "STD" "$perf_cmd"
|
||||
check_per_die "STD" "$perf_cmd"
|
||||
check_per_socket "STD" "$perf_cmd"
|
||||
else
|
||||
echo "[Skip] Skipping tests for system_wide_no_aggr, per_core, per_die and per_socket since socket id exposed via topology is invalid"
|
||||
fi
|
||||
cleanup
|
||||
exit 0
|
Загрузка…
Ссылка в новой задаче