1#!/bin/bash 2# perf script perl tests 3# SPDX-License-Identifier: GPL-2.0 4 5set -e 6 7# set PERF_EXEC_PATH to find scripts in the source directory 8perfdir=$(dirname "$0")/../.. 9if [ -e "$perfdir/scripts/perl/Perf-Trace-Util" ]; then 10 export PERF_EXEC_PATH=$perfdir 11fi 12 13 14perfdata=$(mktemp /tmp/__perf_test_script_perl.perf.data.XXXXX) 15generated_script=$(mktemp /tmp/__perf_test_script.XXXXX.pl) 16 17cleanup() { 18 rm -f "${perfdata}" 19 rm -f "${generated_script}" 20 trap - EXIT TERM INT 21} 22 23trap_cleanup() { 24 echo "Unexpected signal in ${FUNCNAME[1]}" 25 cleanup 26 exit 1 27} 28trap trap_cleanup TERM INT 29trap cleanup EXIT 30 31check_perl_support() { 32 if perf check feature -q libperl; then 33 return 0 34 fi 35 echo "perf script perl test [Skipped: no libperl support]" 36 return 2 37} 38 39test_script() { 40 local event_name=$1 41 local expected_output=$2 42 local record_opts=$3 43 44 echo "Testing event: $event_name" 45 46 # Try to record. If this fails, it might be permissions or lack of support. 47 # We return 2 to indicate "skip this event" rather than "fail test". 48 if ! perf record -o "${perfdata}" -e "$event_name" $record_opts -- perf test -w thloop > /dev/null 2>&1; then 49 echo "perf script perl test [Skipped: failed to record $event_name]" 50 return 2 51 fi 52 53 echo "Generating perl script..." 54 if ! perf script -i "${perfdata}" -g "${generated_script}"; then 55 echo "perf script perl test [Failed: script generation for $event_name]" 56 return 1 57 fi 58 59 if [ ! -f "${generated_script}" ]; then 60 echo "perf script perl test [Failed: script not generated for $event_name]" 61 return 1 62 fi 63 64 echo "Executing perl script..." 65 output=$(perf script -i "${perfdata}" -s "${generated_script}" 2>&1) 66 67 if echo "$output" | grep -q "$expected_output"; then 68 echo "perf script perl test [Success: $event_name triggered $expected_output]" 69 return 0 70 else 71 echo "perf script perl test [Failed: $event_name did not trigger $expected_output]" 72 echo "Output was:" 73 echo "$output" | head -n 20 74 return 1 75 fi 76} 77 78check_perl_support || exit 2 79 80# Try tracepoint first 81test_script "sched:sched_switch" "sched::sched_switch" "-c 1" && res=0 || res=$? 82 83if [ $res -eq 0 ]; then 84 exit 0 85elif [ $res -eq 1 ]; then 86 exit 1 87fi 88 89# If tracepoint skipped (res=2), try task-clock 90# For generic events like task-clock, the generated script uses process_event() 91# which dumps data using Data::Dumper. We check for "$VAR1" which is standard Dumper output. 92test_script "task-clock" "\$VAR1" "-c 100" && res=0 || res=$? 93 94if [ $res -eq 0 ]; then 95 exit 0 96elif [ $res -eq 1 ]; then 97 exit 1 98fi 99 100# If both skipped 101echo "perf script perl test [Skipped: Could not record tracepoint or task-clock]" 102exit 2 103