xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/cgroup/with_stress.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4.
5*4882a593Smuzhiyunksft_skip=4
6*4882a593Smuzhiyun
7*4882a593Smuzhiyunstress_fork()
8*4882a593Smuzhiyun{
9*4882a593Smuzhiyun	while true ; do
10*4882a593Smuzhiyun		/usr/bin/true
11*4882a593Smuzhiyun		sleep 0.01
12*4882a593Smuzhiyun	done
13*4882a593Smuzhiyun}
14*4882a593Smuzhiyun
15*4882a593Smuzhiyunstress_subsys()
16*4882a593Smuzhiyun{
17*4882a593Smuzhiyun	local verb=+
18*4882a593Smuzhiyun	while true ; do
19*4882a593Smuzhiyun		echo $verb$subsys_ctrl >$sysfs/cgroup.subtree_control
20*4882a593Smuzhiyun		[ $verb = "+" ] && verb=- || verb=+
21*4882a593Smuzhiyun		# incommensurable period with other stresses
22*4882a593Smuzhiyun		sleep 0.011
23*4882a593Smuzhiyun	done
24*4882a593Smuzhiyun}
25*4882a593Smuzhiyun
26*4882a593Smuzhiyuninit_and_check()
27*4882a593Smuzhiyun{
28*4882a593Smuzhiyun	sysfs=`mount -t cgroup2 | head -1 | awk '{ print $3 }'`
29*4882a593Smuzhiyun	if [ ! -d "$sysfs" ]; then
30*4882a593Smuzhiyun		echo "Skipping: cgroup2 is not mounted" >&2
31*4882a593Smuzhiyun		exit $ksft_skip
32*4882a593Smuzhiyun	fi
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun	if ! echo +$subsys_ctrl >$sysfs/cgroup.subtree_control ; then
35*4882a593Smuzhiyun		echo "Skipping: cannot enable $subsys_ctrl in $sysfs" >&2
36*4882a593Smuzhiyun		exit $ksft_skip
37*4882a593Smuzhiyun	fi
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	if ! echo -$subsys_ctrl >$sysfs/cgroup.subtree_control ; then
40*4882a593Smuzhiyun		echo "Skipping: cannot disable $subsys_ctrl in $sysfs" >&2
41*4882a593Smuzhiyun		exit $ksft_skip
42*4882a593Smuzhiyun	fi
43*4882a593Smuzhiyun}
44*4882a593Smuzhiyun
45*4882a593Smuzhiyundeclare -a stresses
46*4882a593Smuzhiyundeclare -a stress_pids
47*4882a593Smuzhiyunduration=5
48*4882a593Smuzhiyunrc=0
49*4882a593Smuzhiyunsubsys_ctrl=cpuset
50*4882a593Smuzhiyunsysfs=
51*4882a593Smuzhiyun
52*4882a593Smuzhiyunwhile getopts c:d:hs: opt; do
53*4882a593Smuzhiyun	case $opt in
54*4882a593Smuzhiyun	c)
55*4882a593Smuzhiyun		subsys_ctrl=$OPTARG
56*4882a593Smuzhiyun		;;
57*4882a593Smuzhiyun	d)
58*4882a593Smuzhiyun		duration=$OPTARG
59*4882a593Smuzhiyun		;;
60*4882a593Smuzhiyun	h)
61*4882a593Smuzhiyun		echo "Usage $0 [ -s stress ] ... [ -d duration ] [-c controller] cmd args .."
62*4882a593Smuzhiyun		echo -e "\t default duration $duration seconds"
63*4882a593Smuzhiyun		echo -e "\t default controller $subsys_ctrl"
64*4882a593Smuzhiyun		exit
65*4882a593Smuzhiyun		;;
66*4882a593Smuzhiyun	s)
67*4882a593Smuzhiyun		func=stress_$OPTARG
68*4882a593Smuzhiyun		if [ "x$(type -t $func)" != "xfunction" ] ; then
69*4882a593Smuzhiyun			echo "Unknown stress $OPTARG"
70*4882a593Smuzhiyun			exit 1
71*4882a593Smuzhiyun		fi
72*4882a593Smuzhiyun		stresses+=($func)
73*4882a593Smuzhiyun		;;
74*4882a593Smuzhiyun	esac
75*4882a593Smuzhiyundone
76*4882a593Smuzhiyunshift $((OPTIND - 1))
77*4882a593Smuzhiyun
78*4882a593Smuzhiyuninit_and_check
79*4882a593Smuzhiyun
80*4882a593Smuzhiyunfor s in ${stresses[*]} ; do
81*4882a593Smuzhiyun	$s &
82*4882a593Smuzhiyun	stress_pids+=($!)
83*4882a593Smuzhiyundone
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun
86*4882a593Smuzhiyuntime=0
87*4882a593Smuzhiyunstart=$(date +%s)
88*4882a593Smuzhiyun
89*4882a593Smuzhiyunwhile [ $time -lt $duration ] ; do
90*4882a593Smuzhiyun	$*
91*4882a593Smuzhiyun	rc=$?
92*4882a593Smuzhiyun	[ $rc -eq 0 ] || break
93*4882a593Smuzhiyun	time=$(($(date +%s) - $start))
94*4882a593Smuzhiyundone
95*4882a593Smuzhiyun
96*4882a593Smuzhiyunfor pid in ${stress_pids[*]} ; do
97*4882a593Smuzhiyun	kill -SIGTERM $pid
98*4882a593Smuzhiyun	wait $pid
99*4882a593Smuzhiyundone
100*4882a593Smuzhiyun
101*4882a593Smuzhiyunexit $rc
102