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