xref: /spdk/scripts/perf/pm/common (revision a874c8d0cdd3ce461df7a0d79dd7c6309ff4a1b5)
18d588fbcSMichal Berger#!/usr/bin/env bash
28d588fbcSMichal Berger#  SPDX-License-Identifier: BSD-3-Clause
38d588fbcSMichal Berger#  Copyright (C) 2023 Intel Corporation
48d588fbcSMichal Berger#  All rights reserved.
58d588fbcSMichal Berger
68d588fbcSMichal Berger_pmdir=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
78d588fbcSMichal Berger_pmrootdir=$(readlink -f "$_pmdir/../../../")
88d588fbcSMichal Berger
98d588fbcSMichal Bergerretag() {
108d588fbcSMichal Berger	[[ -s $TEST_TAG_FILE ]] || return 0
118d588fbcSMichal Berger	# If we got signalled but the tag didn't change, just bail
128d588fbcSMichal Berger	[[ $(< "$TEST_TAG_FILE") == "$TEST_TAG" ]] && return 0
138d588fbcSMichal Berger	TEST_TAG=$(< "$TEST_TAG_FILE")
148d588fbcSMichal Berger}
158d588fbcSMichal Berger
16d5fe62b2SMichal Bergerstart_monitor_resources() {
17d5fe62b2SMichal Berger	local monitor
18d5fe62b2SMichal Berger
19d5fe62b2SMichal Berger	for monitor in "${MONITOR_RESOURCES[@]}"; do
20*a874c8d0SMichal Berger		${SUDO[MONITOR_RESOURCES_SUDO["$monitor"]]} \
21*a874c8d0SMichal Berger			"$_pmdir/$monitor" -d "$PM_OUTPUTDIR" \
22d5fe62b2SMichal Berger			-l -p "monitor.${0##*/}.$(date +%s)" &
23d5fe62b2SMichal Berger	done
24d5fe62b2SMichal Berger	# Give our monitors some time to setup their traps
25d5fe62b2SMichal Berger	sleep 1
26d5fe62b2SMichal Berger}
27d5fe62b2SMichal Berger
28d5fe62b2SMichal Bergerstop_monitor_resources() {
29d5fe62b2SMichal Berger	signal_monitor_resources TERM
30d5fe62b2SMichal Berger}
31d5fe62b2SMichal Berger
32d5fe62b2SMichal Bergerupdate_tag_monitor_resources() {
33d5fe62b2SMichal Berger	local tag=${1:-N/A}
34d5fe62b2SMichal Berger
35d5fe62b2SMichal Berger	echo "$tag" > "$TEST_TAG_FILE"
36d5fe62b2SMichal Berger	signal_monitor_resources USR1
37d5fe62b2SMichal Berger}
38d5fe62b2SMichal Berger
39d5fe62b2SMichal Bergersignal_monitor_resources() {
40d5fe62b2SMichal Berger	local monitor pid pids signal=${1:-15}
41d5fe62b2SMichal Berger
42d5fe62b2SMichal Berger	for monitor in "${MONITOR_RESOURCES[@]}"; do
43d5fe62b2SMichal Berger		if [[ -e $PM_OUTPUTDIR/$monitor.pid ]]; then
44d5fe62b2SMichal Berger			pid=$(< "$PM_OUTPUTDIR/$monitor.pid")
45d5fe62b2SMichal Berger		else
46d5fe62b2SMichal Berger			continue
47d5fe62b2SMichal Berger		fi
48d5fe62b2SMichal Berger
49*a874c8d0SMichal Berger		if ! ${SUDO[MONITOR_RESOURCES_SUDO["$monitor"]]} \
50*a874c8d0SMichal Berger			kill "-$signal" "$pid"; then
51d5fe62b2SMichal Berger			rm -f "$PM_OUTPUTDIR/$monitor.pid"
52d5fe62b2SMichal Berger		fi 2> /dev/null
53d5fe62b2SMichal Berger	done
54d5fe62b2SMichal Berger}
55d5fe62b2SMichal Berger
56d5fe62b2SMichal Bergersave_pm_pid() {
57d5fe62b2SMichal Berger	echo "$$" > "$PM_OUTPUTDIR/${0##*/}.pid"
58d5fe62b2SMichal Berger}
59d5fe62b2SMichal Berger
60d5fe62b2SMichal Bergerrm_pm_pid() {
61d5fe62b2SMichal Berger	rm -f "$PM_OUTPUTDIR/${0##*/}.pid"
62d5fe62b2SMichal Berger}
63d5fe62b2SMichal Berger
648d588fbcSMichal BergerTEST_TAG=${TEST_TAG:-N/A}
658d588fbcSMichal BergerTEST_TAG_FILE=${TEST_TAG_FILE:-"$_pmrootdir/.run_test_name"}
66d5fe62b2SMichal Berger# autotest's $output_dir has a prio
67d5fe62b2SMichal BergerPM_OUTPUTDIR=${output_dir:-/tmp}/power
6806243cb0SMichal BergerPM_OS=$(uname -s)
69d5fe62b2SMichal Berger
70*a874c8d0SMichal Bergerdeclare -A MONITOR_RESOURCES_SUDO=()
71*a874c8d0SMichal BergerMONITOR_RESOURCES_SUDO["collect-bmc-pm"]=1
72*a874c8d0SMichal BergerMONITOR_RESOURCES_SUDO["collect-cpu-load"]=0
73*a874c8d0SMichal BergerMONITOR_RESOURCES_SUDO["collect-cpu-temp"]=0
74*a874c8d0SMichal BergerMONITOR_RESOURCES_SUDO["collect-vmstat"]=0
75*a874c8d0SMichal Berger
76*a874c8d0SMichal BergerSUDO[0]="" SUDO[1]="sudo -E"
77*a874c8d0SMichal Berger
78d5fe62b2SMichal BergerMONITOR_RESOURCES=(collect-cpu-load collect-vmstat)
7906243cb0SMichal Bergerif [[ $PM_OS == FreeBSD ]]; then
8006243cb0SMichal Berger	MONITOR_RESOURCES=(collect-vmstat)
8106243cb0SMichal Bergerelif [[ $PM_OS == Linux && $(< /sys/class/dmi/id/chassis_vendor) != QEMU && ! -e /.dockerenv ]]; then
82d5fe62b2SMichal Berger	# These are dedicated for the PHY platforms. Skip VMs and systems which identifies as
83d5fe62b2SMichal Berger	# a docker containers (latter is specific to our CI's use-case).
84d5fe62b2SMichal Berger	MONITOR_RESOURCES+=(collect-cpu-temp)
85d5fe62b2SMichal Berger	MONITOR_RESOURCES+=(collect-bmc-pm)
86d5fe62b2SMichal Bergerfi
87d5fe62b2SMichal Berger
88*a874c8d0SMichal Bergerif [[ ! -d $PM_OUTPUTDIR ]]; then
89d5fe62b2SMichal Berger	mkdir -p "$PM_OUTPUTDIR"
90*a874c8d0SMichal Berger	chmod 777 "$PM_OUTPUTDIR"
91*a874c8d0SMichal Bergerfi
92