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