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 9retag() { 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 16start_monitor_resources() { 17 local monitor 18 19 for monitor in "${MONITOR_RESOURCES[@]}"; do 20 # collect-bmc-pm requires root privileges 21 sudo -E "$_pmdir/$monitor" -d "$PM_OUTPUTDIR" \ 22 -l -p "monitor.${0##*/}.$(date +%s)" & 23 MONITOR_RESOURCES_PIDS["$monitor"]=$! 24 done 25 # Give our monitors some time to setup their traps 26 sleep 1 27} 28 29stop_monitor_resources() { 30 signal_monitor_resources TERM 31} 32 33update_tag_monitor_resources() { 34 local tag=${1:-N/A} 35 36 echo "$tag" > "$TEST_TAG_FILE" 37 signal_monitor_resources USR1 38} 39 40signal_monitor_resources() { 41 local monitor pid pids signal=${1:-15} 42 43 for monitor in "${MONITOR_RESOURCES[@]}"; do 44 if [[ -e $PM_OUTPUTDIR/$monitor.pid ]]; then 45 pid=$(< "$PM_OUTPUTDIR/$monitor.pid") 46 elif [[ -n ${MONITOR_RESOURCES_PIDS["$monitor"]} ]]; then 47 pid=${MONITOR_RESOURCES_PIDS["$monitor"]} 48 else 49 continue 50 fi 51 52 if ! sudo kill "-$signal" "$pid"; then 53 rm -f "$PM_OUTPUTDIR/$monitor.pid" 54 unset -v "MONITOR_RESOURCES_PIDS[$monitor]" 55 fi 2> /dev/null 56 done 57} 58 59save_pm_pid() { 60 echo "$$" > "$PM_OUTPUTDIR/${0##*/}.pid" 61} 62 63rm_pm_pid() { 64 rm -f "$PM_OUTPUTDIR/${0##*/}.pid" 65} 66 67TEST_TAG=${TEST_TAG:-N/A} 68TEST_TAG_FILE=${TEST_TAG_FILE:-"$_pmrootdir/.run_test_name"} 69# autotest's $output_dir has a prio 70PM_OUTPUTDIR=${output_dir:-/tmp}/power 71PM_OS=$(uname -s) 72 73MONITOR_RESOURCES=(collect-cpu-load collect-vmstat) 74if [[ $PM_OS == FreeBSD ]]; then 75 MONITOR_RESOURCES=(collect-vmstat) 76elif [[ $PM_OS == Linux && $(< /sys/class/dmi/id/chassis_vendor) != QEMU && ! -e /.dockerenv ]]; then 77 # These are dedicated for the PHY platforms. Skip VMs and systems which identifies as 78 # a docker containers (latter is specific to our CI's use-case). 79 MONITOR_RESOURCES+=(collect-cpu-temp) 80 MONITOR_RESOURCES+=(collect-bmc-pm) 81fi 82# For tracking - each monitor should handle its own .pid file 83declare -A MONITOR_RESOURCES_PIDS=() 84 85mkdir -p "$PM_OUTPUTDIR" 86