162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
562306a36Sopenharmony_ciksft_skip=4
662306a36Sopenharmony_ci
762306a36Sopenharmony_cistress_fork()
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci	while true ; do
1062306a36Sopenharmony_ci		/usr/bin/true
1162306a36Sopenharmony_ci		sleep 0.01
1262306a36Sopenharmony_ci	done
1362306a36Sopenharmony_ci}
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistress_subsys()
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	local verb=+
1862306a36Sopenharmony_ci	while true ; do
1962306a36Sopenharmony_ci		echo $verb$subsys_ctrl >$sysfs/cgroup.subtree_control
2062306a36Sopenharmony_ci		[ $verb = "+" ] && verb=- || verb=+
2162306a36Sopenharmony_ci		# incommensurable period with other stresses
2262306a36Sopenharmony_ci		sleep 0.011
2362306a36Sopenharmony_ci	done
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ciinit_and_check()
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	sysfs=`mount -t cgroup2 | head -1 | awk '{ print $3 }'`
2962306a36Sopenharmony_ci	if [ ! -d "$sysfs" ]; then
3062306a36Sopenharmony_ci		echo "Skipping: cgroup2 is not mounted" >&2
3162306a36Sopenharmony_ci		exit $ksft_skip
3262306a36Sopenharmony_ci	fi
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if ! echo +$subsys_ctrl >$sysfs/cgroup.subtree_control ; then
3562306a36Sopenharmony_ci		echo "Skipping: cannot enable $subsys_ctrl in $sysfs" >&2
3662306a36Sopenharmony_ci		exit $ksft_skip
3762306a36Sopenharmony_ci	fi
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	if ! echo -$subsys_ctrl >$sysfs/cgroup.subtree_control ; then
4062306a36Sopenharmony_ci		echo "Skipping: cannot disable $subsys_ctrl in $sysfs" >&2
4162306a36Sopenharmony_ci		exit $ksft_skip
4262306a36Sopenharmony_ci	fi
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cideclare -a stresses
4662306a36Sopenharmony_cideclare -a stress_pids
4762306a36Sopenharmony_ciduration=5
4862306a36Sopenharmony_circ=0
4962306a36Sopenharmony_cisubsys_ctrl=cpuset
5062306a36Sopenharmony_cisysfs=
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciwhile getopts c:d:hs: opt; do
5362306a36Sopenharmony_ci	case $opt in
5462306a36Sopenharmony_ci	c)
5562306a36Sopenharmony_ci		subsys_ctrl=$OPTARG
5662306a36Sopenharmony_ci		;;
5762306a36Sopenharmony_ci	d)
5862306a36Sopenharmony_ci		duration=$OPTARG
5962306a36Sopenharmony_ci		;;
6062306a36Sopenharmony_ci	h)
6162306a36Sopenharmony_ci		echo "Usage $0 [ -s stress ] ... [ -d duration ] [-c controller] cmd args .."
6262306a36Sopenharmony_ci		echo -e "\t default duration $duration seconds"
6362306a36Sopenharmony_ci		echo -e "\t default controller $subsys_ctrl"
6462306a36Sopenharmony_ci		exit
6562306a36Sopenharmony_ci		;;
6662306a36Sopenharmony_ci	s)
6762306a36Sopenharmony_ci		func=stress_$OPTARG
6862306a36Sopenharmony_ci		if [ "x$(type -t $func)" != "xfunction" ] ; then
6962306a36Sopenharmony_ci			echo "Unknown stress $OPTARG"
7062306a36Sopenharmony_ci			exit 1
7162306a36Sopenharmony_ci		fi
7262306a36Sopenharmony_ci		stresses+=($func)
7362306a36Sopenharmony_ci		;;
7462306a36Sopenharmony_ci	esac
7562306a36Sopenharmony_cidone
7662306a36Sopenharmony_cishift $((OPTIND - 1))
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciinit_and_check
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cifor s in ${stresses[*]} ; do
8162306a36Sopenharmony_ci	$s &
8262306a36Sopenharmony_ci	stress_pids+=($!)
8362306a36Sopenharmony_cidone
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_citime=0
8762306a36Sopenharmony_cistart=$(date +%s)
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciwhile [ $time -lt $duration ] ; do
9062306a36Sopenharmony_ci	$*
9162306a36Sopenharmony_ci	rc=$?
9262306a36Sopenharmony_ci	[ $rc -eq 0 ] || break
9362306a36Sopenharmony_ci	time=$(($(date +%s) - $start))
9462306a36Sopenharmony_cidone
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cifor pid in ${stress_pids[*]} ; do
9762306a36Sopenharmony_ci	kill -SIGTERM $pid
9862306a36Sopenharmony_ci	wait $pid
9962306a36Sopenharmony_cidone
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciexit $rc
102