| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #!/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
- # shellcheck source=lib/stat_output.sh
- . "$(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 stalled-cycles-frontend stalled-cycles-backend cycles instructions branches branch-misses)
- event_metric=("CPUs_utilized" "CPUs_utilized" "cs/sec" "migrations/sec" "faults/sec" "frontend_cycles_idle" "backend_cycles_idle" "GHz" "insn_per_cycle" "/sec" "branch_miss_rate")
- skip_metric=("tma_" "TopdownL1")
- cleanup() {
- rm -f "${stat_output}"
- trap - EXIT TERM INT
- }
- trap_cleanup() {
- cleanup
- exit 1
- }
- trap trap_cleanup EXIT TERM INT
- function commachecker()
- {
- local prefix=1
- local -i metric_only=0
- 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
- ;; "--per-cluster") prefix=3
- ;; "--metric-only") metric_only=1
- 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%#*}
- [ "$x" = "" ] && continue
- # Check metric only - if it has a non-empty result
- [ $metric_only -eq 1 ] && return 0
- # Skip metrics without event name
- y=${main_body#*#}
- for i in "${!skip_metric[@]}"; do
- [[ "$y" == *"${skip_metric[$i]}"* ]] && break
- done
- [[ "$y" == *"${skip_metric[$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}"
- if [ $metric_only -ne 1 ]
- then
- echo "Missing metric only output in:"
- cat "${stat_output}"
- fi
- 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"
- check_metric_only "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_cluster "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
|