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 ${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 28stop_monitor_resources() { 29 signal_monitor_resources TERM 30} 31 32update_tag_monitor_resources() { 33 local tag=${1:-N/A} 34 35 echo "$tag" > "$TEST_TAG_FILE" 36 signal_monitor_resources USR1 37} 38 39signal_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 56save_pm_pid() { 57 echo "$$" > "$PM_OUTPUTDIR/${0##*/}.pid" 58} 59 60rm_pm_pid() { 61 rm -f "$PM_OUTPUTDIR/${0##*/}.pid" 62} 63 64TEST_TAG=${TEST_TAG:-N/A} 65TEST_TAG_FILE=${TEST_TAG_FILE:-"$_pmrootdir/.run_test_name"} 66# autotest's $output_dir has a prio 67PM_OUTPUTDIR=${output_dir:-/tmp}/power 68PM_OS=$(uname -s) 69 70declare -A MONITOR_RESOURCES_SUDO=() 71MONITOR_RESOURCES_SUDO["collect-bmc-pm"]=1 72MONITOR_RESOURCES_SUDO["collect-cpu-load"]=0 73MONITOR_RESOURCES_SUDO["collect-cpu-temp"]=0 74MONITOR_RESOURCES_SUDO["collect-vmstat"]=0 75 76SUDO[0]="" SUDO[1]="sudo -E" 77 78MONITOR_RESOURCES=(collect-cpu-load collect-vmstat) 79if [[ $PM_OS == FreeBSD ]]; then 80 MONITOR_RESOURCES=(collect-vmstat) 81elif [[ $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) 86fi 87 88if [[ ! -d $PM_OUTPUTDIR ]]; then 89 mkdir -p "$PM_OUTPUTDIR" 90 chmod 777 "$PM_OUTPUTDIR" 91fi 92