xref: /spdk/scripts/perf/pm/common (revision 95d6c9fac17572b107042103439aafd696d60b0e)
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