1 #!/usr/bin/env bash 2 # SPDX-License-Identifier: BSD-3-Clause 3 # Copyright (C) 2023 Intel Corporation 4 # All rights reserved. 5 6 _pmdir=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")") 7 _pmrootdir=$(readlink -f "$_pmdir/../../../") 8 9 retag() { 10 [[ -s $TEST_TAG_FILE ]] || return 0 11 # If we got signalled but the tag didn't change, just bail 12 [[ $(< "$TEST_TAG_FILE") == "$TEST_TAG" ]] && return 0 13 TEST_TAG=$(< "$TEST_TAG_FILE") 14 } 15 16 start_monitor_resources() { 17 local monitor 18 19 for monitor in "${MONITOR_RESOURCES[@]}"; do 20 ${SUDO[MONITOR_RESOURCES_SUDO["$monitor"]]} \ 21 "$_pmdir/$monitor" -d "$PM_OUTPUTDIR" \ 22 -l -p "monitor.${0##*/}.$(date +%s)" & 23 done 24 # Give our monitors some time to setup their traps 25 sleep 1 26 } 27 28 stop_monitor_resources() { 29 signal_monitor_resources TERM 30 } 31 32 update_tag_monitor_resources() { 33 local tag=${1:-N/A} 34 35 echo "$tag" > "$TEST_TAG_FILE" 36 signal_monitor_resources USR1 37 } 38 39 signal_monitor_resources() { 40 local monitor pid pids signal=${1:-15} 41 42 for monitor in "${MONITOR_RESOURCES[@]}"; do 43 if [[ -e $PM_OUTPUTDIR/$monitor.pid ]]; then 44 pid=$(< "$PM_OUTPUTDIR/$monitor.pid") 45 else 46 continue 47 fi 48 49 if ! ${SUDO[MONITOR_RESOURCES_SUDO["$monitor"]]} \ 50 kill "-$signal" "$pid"; then 51 rm -f "$PM_OUTPUTDIR/$monitor.pid" 52 fi 2> /dev/null 53 done 54 } 55 56 save_pm_pid() { 57 echo "$$" > "$PM_OUTPUTDIR/${0##*/}.pid" 58 } 59 60 rm_pm_pid() { 61 rm -f "$PM_OUTPUTDIR/${0##*/}.pid" 62 } 63 64 TEST_TAG=${TEST_TAG:-N/A} 65 TEST_TAG_FILE=${TEST_TAG_FILE:-"$_pmrootdir/.run_test_name"} 66 # autotest's $output_dir has a prio 67 PM_OUTPUTDIR=${output_dir:-/tmp}/power 68 PM_OS=$(uname -s) 69 70 declare -A MONITOR_RESOURCES_SUDO=() 71 MONITOR_RESOURCES_SUDO["collect-bmc-pm"]=1 72 MONITOR_RESOURCES_SUDO["collect-cpu-load"]=0 73 MONITOR_RESOURCES_SUDO["collect-cpu-temp"]=0 74 MONITOR_RESOURCES_SUDO["collect-vmstat"]=0 75 76 SUDO[0]="" SUDO[1]="sudo -E" 77 78 MONITOR_RESOURCES=(collect-cpu-load collect-vmstat) 79 if [[ $PM_OS == FreeBSD ]]; then 80 MONITOR_RESOURCES=(collect-vmstat) 81 elif [[ $PM_OS == Linux && $(< /sys/class/dmi/id/chassis_vendor) != QEMU && ! -e /.dockerenv ]]; then 82 # These are dedicated for the PHY platforms. Skip VMs and systems which identifies as 83 # a docker containers (latter is specific to our CI's use-case). 84 MONITOR_RESOURCES+=(collect-cpu-temp) 85 MONITOR_RESOURCES+=(collect-bmc-pm) 86 fi 87 88 if [[ ! -d $PM_OUTPUTDIR ]]; then 89 mkdir -p "$PM_OUTPUTDIR" 90 chmod 777 "$PM_OUTPUTDIR" 91 fi 92