159c811f0SMichal Berger#!/usr/bin/env bash 259c811f0SMichal Berger# SPDX-License-Identifier: BSD-3-Clause 359c811f0SMichal Berger# Copyright (C) 2023 Intel Corporation 459c811f0SMichal Berger# All rights reserved. 559c811f0SMichal Berger 659c811f0SMichal Bergershopt -s nullglob extglob 759c811f0SMichal Berger 859c811f0SMichal Bergerpmdir=$(readlink -f "$(dirname "$0")") 959c811f0SMichal Bergerrootdir=$(readlink -f "$pmdir/../../../") 1059c811f0SMichal Bergersource "$rootdir/test/scheduler/common.sh" 118d588fbcSMichal Bergersource "$pmdir/common" 1259c811f0SMichal Berger 1359c811f0SMichal Bergerhelp() { 1459c811f0SMichal Berger cat <<- HELP 1559c811f0SMichal Berger 16d5fe62b2SMichal Berger Usage: $0 [-h] [-c count] [-d dir] [-l] [-p prefix] [cpu0 cpu1 ...] 1759c811f0SMichal Berger 1859c811f0SMichal Berger -h - Print this message. 1959c811f0SMichal Berger -c - Execute count times. 0 is the default and it means to run 2059c811f0SMichal Berger indefinitely. 2159c811f0SMichal Berger -d - Directory where results should be saved. Default is /tmp. 22d5fe62b2SMichal Berger -l - Save output of the script to a log file (dir/${0##*/}.pm.log). 2359c811f0SMichal Berger -p - Add prefix to saved files. 2436eea926SMichal Berger -t - How long to wait before each load read. Default is 1s. 2559c811f0SMichal Berger 2659c811f0SMichal Berger cpu - Valid cpu id (e.g. 0) to monitor. 2759c811f0SMichal Berger 28*34edd9f1SKamil Godzwon When started, ${0##*/} will enter loop to continuously monitor cpu 2959c811f0SMichal Berger load. Each iteration will be logged to stderr and a log file 3059c811f0SMichal Berger (dir/${0##*/}.pm.log). 3159c811f0SMichal Berger 3259c811f0SMichal Berger HELP 3359c811f0SMichal Berger} 3459c811f0SMichal Berger 35d5fe62b2SMichal Bergercleanup() { 36d5fe62b2SMichal Berger rm_pm_pid 37d5fe62b2SMichal Berger} 38d5fe62b2SMichal Berger 3959c811f0SMichal Berger# get_cpu_time() uses these, so put some stubs in place 4059c811f0SMichal Bergerxtrace_disable() { :; } 4159c811f0SMichal Bergerxtrace_restore() { :; } 4259c811f0SMichal Berger 4359c811f0SMichal Berger_get_cpu_time() { 44d5fe62b2SMichal Berger get_cpu_time "$@" 4559c811f0SMichal Berger} 4659c811f0SMichal Berger 4759c811f0SMichal Bergercount=0 4836eea926SMichal Bergerinterval=1 49d5fe62b2SMichal Bergerlog_to_file=no 5059c811f0SMichal Bergerprefix="" 5159c811f0SMichal Berger 52d5fe62b2SMichal Bergerwhile getopts c:d:hlp:t: opt; do 5359c811f0SMichal Berger case "$opt" in 5459c811f0SMichal Berger c) count=$OPTARG ;; 55d5fe62b2SMichal Berger d) PM_OUTPUTDIR=$OPTARG ;; 5659c811f0SMichal Berger h) 5759c811f0SMichal Berger help 5859c811f0SMichal Berger exit 0 5959c811f0SMichal Berger ;; 60d5fe62b2SMichal Berger l) log_to_file=yes ;; 6159c811f0SMichal Berger p) prefix=$OPTARG ;; 6236eea926SMichal Berger t) interval=$OPTARG ;; 6359c811f0SMichal Berger *) ;; 6459c811f0SMichal Berger esac 6559c811f0SMichal Bergerdone 6659c811f0SMichal Bergershift $((OPTIND - 1)) 6759c811f0SMichal Berger 6859c811f0SMichal Bergerdeclare -r log_file=${prefix:+${prefix}_}${0##*/}.pm.log 6959c811f0SMichal Berger 70d5fe62b2SMichal Bergermkdir -p "$PM_OUTPUTDIR" 71d5fe62b2SMichal Bergerif [[ $log_to_file == yes ]]; then 72d5fe62b2SMichal Berger printf 'Redirecting to %s\n' "$PM_OUTPUTDIR/$log_file" >&2 73d5fe62b2SMichal Berger exec > "$PM_OUTPUTDIR/$log_file" 2>&1 74d5fe62b2SMichal Bergerfi 7559c811f0SMichal Berger 7659c811f0SMichal Bergercpus=("$@") 7759c811f0SMichal Berger((${#cpus[@]} > 0)) || cpus=($(get_online_cpus)) 7859c811f0SMichal Berger 79d5fe62b2SMichal Bergersave_pm_pid 80d5fe62b2SMichal Bergertrap 'cleanup' EXIT 818d588fbcSMichal Bergertrap 'retag' USR1 828d588fbcSMichal Berger 8336eea926SMichal Berger_get_cpu_time "$count" "" 1 "$interval" "${cpus[@]}" 84