| #!/bin/bash | |
| # perf stat events uniquifying | |
| # SPDX-License-Identifier: GPL-2.0 | |
| set -e | |
| err=0 | |
| stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX) | |
| cleanup() { | |
| rm -f "${stat_output}" | |
| trap - EXIT TERM INT | |
| } | |
| trap_cleanup() { | |
| echo "Unexpected signal in ${FUNCNAME[1]}" | |
| cleanup | |
| exit 1 | |
| } | |
| trap trap_cleanup EXIT TERM INT | |
| test_event_uniquifying() { | |
| echo "Uniquification of PMU sysfs events test" | |
| # Read events from perf list with and without -v. With -v the duplicate PMUs | |
| # aren't deduplicated. Note, json events are listed by perf list without a | |
| # PMU. | |
| read -ra pmu_events <<< "$(perf list --raw pmu)" | |
| read -ra pmu_v_events <<< "$(perf list -v --raw pmu)" | |
| # For all non-deduplicated events. | |
| for pmu_v_event in "${pmu_v_events[@]}"; do | |
| # If the event matches an event in the deduplicated events then it musn't | |
| # be an event with duplicate PMUs, continue the outer loop. | |
| for pmu_event in "${pmu_events[@]}"; do | |
| if [[ "$pmu_v_event" == "$pmu_event" ]]; then | |
| continue 2 | |
| fi | |
| done | |
| # Strip the suffix from the non-deduplicated event's PMU. | |
| event=$(echo "$pmu_v_event" | sed -E 's/_[0-9]+//') | |
| for pmu_event in "${pmu_events[@]}"; do | |
| if [[ "$event" == "$pmu_event" ]]; then | |
| echo "Testing event ${event} is uniquified to ${pmu_v_event}" | |
| if ! perf stat -e "$event" -A -o ${stat_output} -- true; then | |
| echo "Error running perf stat for event '$event' [Skip]" | |
| if [ $err = 0 ]; then | |
| err=2 | |
| fi | |
| continue | |
| fi | |
| # Ensure the non-deduplicated event appears in the output. | |
| if ! grep -q "${pmu_v_event}" "${stat_output}"; then | |
| echo "Uniquification of PMU sysfs events test [Failed]" | |
| cat "${stat_output}" | |
| err=1 | |
| fi | |
| break | |
| fi | |
| done | |
| done | |
| } | |
| test_event_uniquifying | |
| cleanup | |
| exit $err |