1# SPDX-License-Identifier: GPL-2.0 2 3PERF_RECORD_LOGS=() 4 5perf_record_with_retry() { 6 local perfdata="$1" 7 local check_cmd="$2" 8 local testprog_base="$3" 9 shift 3 10 11 local logfile 12 logfile=$(mktemp /tmp/__perf_record_retry.XXXXXX) 13 PERF_RECORD_LOGS+=("$logfile") 14 15 # Save the e flag state and disable it 16 local save_e 17 if [[ $- == *e* ]]; then 18 save_e="set -e" 19 else 20 save_e="set +e" 21 fi 22 set +e 23 24 local duration 25 local first_run=true 26 local ret=1 27 local cmd_prefix="perf record" 28 if [ -n "${PERF_RECORD_CMD}" ]; then 29 cmd_prefix="${PERF_RECORD_CMD}" 30 fi 31 32 for duration in 0.01 0.1 0.3 1.0 2.0; do 33 rm -f "${perfdata}".old 34 ${cmd_prefix} "$@" -o "${perfdata}" ${testprog_base} ${duration} > "$logfile" 2>&1 35 local record_exit=$? 36 37 if [ "$first_run" = true ] && [ $record_exit -ne 0 ]; then 38 ret=2 39 break 40 fi 41 first_run=false 42 43 if [ -e "${perfdata}" ] && eval "${check_cmd}"; then 44 ret=0 45 break 46 fi 47 done 48 49 eval "$save_e" 50 return $ret 51} 52 53perf_record_cleanup() { 54 for logfile in "${PERF_RECORD_LOGS[@]}"; do 55 rm -f "$logfile" 56 done 57 PERF_RECORD_LOGS=() 58} 59