1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2023 Intel Corporation 4# All rights reserved. 5 6shopt -s nullglob extglob 7 8pmdir=$(readlink -f "$(dirname "$0")") 9rootdir=$(readlink -f "$pmdir/../../../") 10source "$rootdir/test/scheduler/common.sh" 11source "$pmdir/common" 12 13help() { 14 cat <<- HELP 15 16 Usage: $0 [-h] [-c count] [-d dir] [-l] [-p prefix] [cpu0 cpu1 ...] 17 18 -h - Print this message. 19 -c - Execute count times. 0 is the default and it means to run 20 indefinitely. 21 -d - Directory where results should be saved. Default is /tmp. 22 -l - Save output of the script to a log file (dir/${0##*/}.pm.log). 23 -p - Add prefix to saved files. 24 -t - How long to wait before each load read. Default is 1s. 25 26 cpu - Valid cpu id (e.g. 0) to monitor. 27 28 When started, ${0##*/} will enter loop to continuously monitor cpu 29 load. Each iteration will be logged to stderr and a log file 30 (dir/${0##*/}.pm.log). 31 32 HELP 33} 34 35cleanup() { 36 rm_pm_pid 37} 38 39# get_cpu_time() uses these, so put some stubs in place 40xtrace_disable() { :; } 41xtrace_restore() { :; } 42 43_get_cpu_time() { 44 get_cpu_time "$@" 45} 46 47count=0 48interval=1 49log_to_file=no 50prefix="" 51 52while getopts c:d:hlp:t: opt; do 53 case "$opt" in 54 c) count=$OPTARG ;; 55 d) PM_OUTPUTDIR=$OPTARG ;; 56 h) 57 help 58 exit 0 59 ;; 60 l) log_to_file=yes ;; 61 p) prefix=$OPTARG ;; 62 t) interval=$OPTARG ;; 63 *) ;; 64 esac 65done 66shift $((OPTIND - 1)) 67 68declare -r log_file=${prefix:+${prefix}_}${0##*/}.pm.log 69 70mkdir -p "$PM_OUTPUTDIR" 71if [[ $log_to_file == yes ]]; then 72 printf 'Redirecting to %s\n' "$PM_OUTPUTDIR/$log_file" >&2 73 exec > "$PM_OUTPUTDIR/$log_file" 2>&1 74fi 75 76cpus=("$@") 77((${#cpus[@]} > 0)) || cpus=($(get_online_cpus)) 78 79save_pm_pid 80trap 'cleanup' EXIT 81trap 'retag' USR1 82 83_get_cpu_time "$count" "" 1 "$interval" "${cpus[@]}" 84