#!/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