-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Kan Liang
authored and
Arnaldo Carvalho de Melo
committed
Jun 16, 2023
1 parent
fc51fc8
commit 99a04a4
Showing
1 changed file
with
108 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |