#!/bin/bash # DRM PMU # SPDX-License-Identifier: GPL-2.0 set -e output=$(mktemp /tmp/perf.drm_pmu.XXXXXX.txt) cleanup() { rm -f "${output}" trap - EXIT TERM INT } trap_cleanup() { echo "Unexpected signal in ${FUNCNAME[1]}" cleanup exit 1 } trap trap_cleanup EXIT TERM INT # Array to store file descriptors and device names declare -A device_fds # Open all devices and store file descriptors. Opening the device will create a # /proc/$$/fdinfo file containing the DRM statistics. fd_count=3 # Start with file descriptor 3 for device in /dev/dri/* do if [[ ! -c "$device" ]] then continue fi major=$(stat -c "%Hr" "$device") if [[ "$major" != 226 ]] then continue fi echo "Opening $device" eval "exec $fd_count<\"$device\"" echo "fdinfo for: $device (FD: $fd_count)" cat "/proc/$$/fdinfo/$fd_count" echo device_fds["$device"]="$fd_count" fd_count=$((fd_count + 1)) done if [[ ${#device_fds[@]} -eq 0 ]] then echo "No DRM devices found [Skip]" cleanup exit 2 fi # For each DRM event err=0 for p in $(perf list --raw-dump drm-) do echo -n "Testing perf stat of $p. " perf stat -e "$p" --pid=$$ true > "$output" 2>&1 if ! grep -q "$p" "$output" then echo "Missing DRM event in: [Failed]" cat "$output" err=1 else echo "[OK]" fi done # Close all file descriptors for fd in "${device_fds[@]}"; do eval "exec $fd<&-" done # Finished cleanup exit $err