18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
58c2ecf20Sopenharmony_ciksft_skip=4
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cistress_fork()
88c2ecf20Sopenharmony_ci{
98c2ecf20Sopenharmony_ci	while true ; do
108c2ecf20Sopenharmony_ci		/usr/bin/true
118c2ecf20Sopenharmony_ci		sleep 0.01
128c2ecf20Sopenharmony_ci	done
138c2ecf20Sopenharmony_ci}
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistress_subsys()
168c2ecf20Sopenharmony_ci{
178c2ecf20Sopenharmony_ci	local verb=+
188c2ecf20Sopenharmony_ci	while true ; do
198c2ecf20Sopenharmony_ci		echo $verb$subsys_ctrl >$sysfs/cgroup.subtree_control
208c2ecf20Sopenharmony_ci		[ $verb = "+" ] && verb=- || verb=+
218c2ecf20Sopenharmony_ci		# incommensurable period with other stresses
228c2ecf20Sopenharmony_ci		sleep 0.011
238c2ecf20Sopenharmony_ci	done
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ciinit_and_check()
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	sysfs=`mount -t cgroup2 | head -1 | awk '{ print $3 }'`
298c2ecf20Sopenharmony_ci	if [ ! -d "$sysfs" ]; then
308c2ecf20Sopenharmony_ci		echo "Skipping: cgroup2 is not mounted" >&2
318c2ecf20Sopenharmony_ci		exit $ksft_skip
328c2ecf20Sopenharmony_ci	fi
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	if ! echo +$subsys_ctrl >$sysfs/cgroup.subtree_control ; then
358c2ecf20Sopenharmony_ci		echo "Skipping: cannot enable $subsys_ctrl in $sysfs" >&2
368c2ecf20Sopenharmony_ci		exit $ksft_skip
378c2ecf20Sopenharmony_ci	fi
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	if ! echo -$subsys_ctrl >$sysfs/cgroup.subtree_control ; then
408c2ecf20Sopenharmony_ci		echo "Skipping: cannot disable $subsys_ctrl in $sysfs" >&2
418c2ecf20Sopenharmony_ci		exit $ksft_skip
428c2ecf20Sopenharmony_ci	fi
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cideclare -a stresses
468c2ecf20Sopenharmony_cideclare -a stress_pids
478c2ecf20Sopenharmony_ciduration=5
488c2ecf20Sopenharmony_circ=0
498c2ecf20Sopenharmony_cisubsys_ctrl=cpuset
508c2ecf20Sopenharmony_cisysfs=
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciwhile getopts c:d:hs: opt; do
538c2ecf20Sopenharmony_ci	case $opt in
548c2ecf20Sopenharmony_ci	c)
558c2ecf20Sopenharmony_ci		subsys_ctrl=$OPTARG
568c2ecf20Sopenharmony_ci		;;
578c2ecf20Sopenharmony_ci	d)
588c2ecf20Sopenharmony_ci		duration=$OPTARG
598c2ecf20Sopenharmony_ci		;;
608c2ecf20Sopenharmony_ci	h)
618c2ecf20Sopenharmony_ci		echo "Usage $0 [ -s stress ] ... [ -d duration ] [-c controller] cmd args .."
628c2ecf20Sopenharmony_ci		echo -e "\t default duration $duration seconds"
638c2ecf20Sopenharmony_ci		echo -e "\t default controller $subsys_ctrl"
648c2ecf20Sopenharmony_ci		exit
658c2ecf20Sopenharmony_ci		;;
668c2ecf20Sopenharmony_ci	s)
678c2ecf20Sopenharmony_ci		func=stress_$OPTARG
688c2ecf20Sopenharmony_ci		if [ "x$(type -t $func)" != "xfunction" ] ; then
698c2ecf20Sopenharmony_ci			echo "Unknown stress $OPTARG"
708c2ecf20Sopenharmony_ci			exit 1
718c2ecf20Sopenharmony_ci		fi
728c2ecf20Sopenharmony_ci		stresses+=($func)
738c2ecf20Sopenharmony_ci		;;
748c2ecf20Sopenharmony_ci	esac
758c2ecf20Sopenharmony_cidone
768c2ecf20Sopenharmony_cishift $((OPTIND - 1))
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ciinit_and_check
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cifor s in ${stresses[*]} ; do
818c2ecf20Sopenharmony_ci	$s &
828c2ecf20Sopenharmony_ci	stress_pids+=($!)
838c2ecf20Sopenharmony_cidone
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_citime=0
878c2ecf20Sopenharmony_cistart=$(date +%s)
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ciwhile [ $time -lt $duration ] ; do
908c2ecf20Sopenharmony_ci	$*
918c2ecf20Sopenharmony_ci	rc=$?
928c2ecf20Sopenharmony_ci	[ $rc -eq 0 ] || break
938c2ecf20Sopenharmony_ci	time=$(($(date +%s) - $start))
948c2ecf20Sopenharmony_cidone
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_cifor pid in ${stress_pids[*]} ; do
978c2ecf20Sopenharmony_ci	kill -SIGTERM $pid
988c2ecf20Sopenharmony_ci	wait $pid
998c2ecf20Sopenharmony_cidone
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ciexit $rc
102