xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker
4*053f45beSAndroid Build Coastguard WorkerSYSFS=
5*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4.
6*053f45beSAndroid Build Coastguard Workerksft_skip=4
7*053f45beSAndroid Build Coastguard Workerretval=0
8*053f45beSAndroid Build Coastguard Worker
9*053f45beSAndroid Build Coastguard Workerprerequisite()
10*053f45beSAndroid Build Coastguard Worker{
11*053f45beSAndroid Build Coastguard Worker	msg="skip all tests:"
12*053f45beSAndroid Build Coastguard Worker
13*053f45beSAndroid Build Coastguard Worker	if [ $UID != 0 ]; then
14*053f45beSAndroid Build Coastguard Worker		echo $msg must be run as root >&2
15*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
16*053f45beSAndroid Build Coastguard Worker	fi
17*053f45beSAndroid Build Coastguard Worker
18*053f45beSAndroid Build Coastguard Worker	taskset -p 01 $$
19*053f45beSAndroid Build Coastguard Worker
20*053f45beSAndroid Build Coastguard Worker	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
21*053f45beSAndroid Build Coastguard Worker
22*053f45beSAndroid Build Coastguard Worker	if [ ! -d "$SYSFS" ]; then
23*053f45beSAndroid Build Coastguard Worker		echo $msg sysfs is not mounted >&2
24*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
25*053f45beSAndroid Build Coastguard Worker	fi
26*053f45beSAndroid Build Coastguard Worker
27*053f45beSAndroid Build Coastguard Worker	if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then
28*053f45beSAndroid Build Coastguard Worker		echo $msg cpu hotplug is not supported >&2
29*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
30*053f45beSAndroid Build Coastguard Worker	fi
31*053f45beSAndroid Build Coastguard Worker
32*053f45beSAndroid Build Coastguard Worker	echo "CPU online/offline summary:"
33*053f45beSAndroid Build Coastguard Worker	online_cpus=`cat $SYSFS/devices/system/cpu/online`
34*053f45beSAndroid Build Coastguard Worker	online_max=${online_cpus##*-}
35*053f45beSAndroid Build Coastguard Worker
36*053f45beSAndroid Build Coastguard Worker	if [[ "$online_cpus" = "$online_max" ]]; then
37*053f45beSAndroid Build Coastguard Worker		echo "$msg: since there is only one cpu: $online_cpus"
38*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
39*053f45beSAndroid Build Coastguard Worker	fi
40*053f45beSAndroid Build Coastguard Worker
41*053f45beSAndroid Build Coastguard Worker	present_cpus=`cat $SYSFS/devices/system/cpu/present`
42*053f45beSAndroid Build Coastguard Worker	present_max=${present_cpus##*-}
43*053f45beSAndroid Build Coastguard Worker	echo "present_cpus = $present_cpus present_max = $present_max"
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Worker	echo -e "\t Cpus in online state: $online_cpus"
46*053f45beSAndroid Build Coastguard Worker
47*053f45beSAndroid Build Coastguard Worker	offline_cpus=`cat $SYSFS/devices/system/cpu/offline`
48*053f45beSAndroid Build Coastguard Worker	if [[ "a$offline_cpus" = "a" ]]; then
49*053f45beSAndroid Build Coastguard Worker		offline_cpus=0
50*053f45beSAndroid Build Coastguard Worker	else
51*053f45beSAndroid Build Coastguard Worker		offline_max=${offline_cpus##*-}
52*053f45beSAndroid Build Coastguard Worker	fi
53*053f45beSAndroid Build Coastguard Worker	echo -e "\t Cpus in offline state: $offline_cpus"
54*053f45beSAndroid Build Coastguard Worker}
55*053f45beSAndroid Build Coastguard Worker
56*053f45beSAndroid Build Coastguard Worker#
57*053f45beSAndroid Build Coastguard Worker# list all hot-pluggable CPUs
58*053f45beSAndroid Build Coastguard Worker#
59*053f45beSAndroid Build Coastguard Workerhotpluggable_cpus()
60*053f45beSAndroid Build Coastguard Worker{
61*053f45beSAndroid Build Coastguard Worker	local state=${1:-.\*}
62*053f45beSAndroid Build Coastguard Worker
63*053f45beSAndroid Build Coastguard Worker	for cpu in $SYSFS/devices/system/cpu/cpu*; do
64*053f45beSAndroid Build Coastguard Worker		if [ -f $cpu/online ] && grep -q $state $cpu/online; then
65*053f45beSAndroid Build Coastguard Worker			echo ${cpu##/*/cpu}
66*053f45beSAndroid Build Coastguard Worker		fi
67*053f45beSAndroid Build Coastguard Worker	done
68*053f45beSAndroid Build Coastguard Worker}
69*053f45beSAndroid Build Coastguard Worker
70*053f45beSAndroid Build Coastguard Workerhotplaggable_offline_cpus()
71*053f45beSAndroid Build Coastguard Worker{
72*053f45beSAndroid Build Coastguard Worker	hotpluggable_cpus 0
73*053f45beSAndroid Build Coastguard Worker}
74*053f45beSAndroid Build Coastguard Worker
75*053f45beSAndroid Build Coastguard Workerhotpluggable_online_cpus()
76*053f45beSAndroid Build Coastguard Worker{
77*053f45beSAndroid Build Coastguard Worker	hotpluggable_cpus 1
78*053f45beSAndroid Build Coastguard Worker}
79*053f45beSAndroid Build Coastguard Worker
80*053f45beSAndroid Build Coastguard Workercpu_is_online()
81*053f45beSAndroid Build Coastguard Worker{
82*053f45beSAndroid Build Coastguard Worker	grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online
83*053f45beSAndroid Build Coastguard Worker}
84*053f45beSAndroid Build Coastguard Worker
85*053f45beSAndroid Build Coastguard Workercpu_is_offline()
86*053f45beSAndroid Build Coastguard Worker{
87*053f45beSAndroid Build Coastguard Worker	grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online
88*053f45beSAndroid Build Coastguard Worker}
89*053f45beSAndroid Build Coastguard Worker
90*053f45beSAndroid Build Coastguard Workeronline_cpu()
91*053f45beSAndroid Build Coastguard Worker{
92*053f45beSAndroid Build Coastguard Worker	echo 1 > $SYSFS/devices/system/cpu/cpu$1/online
93*053f45beSAndroid Build Coastguard Worker}
94*053f45beSAndroid Build Coastguard Worker
95*053f45beSAndroid Build Coastguard Workeroffline_cpu()
96*053f45beSAndroid Build Coastguard Worker{
97*053f45beSAndroid Build Coastguard Worker	echo 0 > $SYSFS/devices/system/cpu/cpu$1/online
98*053f45beSAndroid Build Coastguard Worker}
99*053f45beSAndroid Build Coastguard Worker
100*053f45beSAndroid Build Coastguard Workeronline_cpu_expect_success()
101*053f45beSAndroid Build Coastguard Worker{
102*053f45beSAndroid Build Coastguard Worker	local cpu=$1
103*053f45beSAndroid Build Coastguard Worker
104*053f45beSAndroid Build Coastguard Worker	if ! online_cpu $cpu; then
105*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected fail >&2
106*053f45beSAndroid Build Coastguard Worker		retval=1
107*053f45beSAndroid Build Coastguard Worker	elif ! cpu_is_online $cpu; then
108*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected offline >&2
109*053f45beSAndroid Build Coastguard Worker		retval=1
110*053f45beSAndroid Build Coastguard Worker	fi
111*053f45beSAndroid Build Coastguard Worker}
112*053f45beSAndroid Build Coastguard Worker
113*053f45beSAndroid Build Coastguard Workeronline_cpu_expect_fail()
114*053f45beSAndroid Build Coastguard Worker{
115*053f45beSAndroid Build Coastguard Worker	local cpu=$1
116*053f45beSAndroid Build Coastguard Worker
117*053f45beSAndroid Build Coastguard Worker	if online_cpu $cpu 2> /dev/null; then
118*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected success >&2
119*053f45beSAndroid Build Coastguard Worker		retval=1
120*053f45beSAndroid Build Coastguard Worker	elif ! cpu_is_offline $cpu; then
121*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected online >&2
122*053f45beSAndroid Build Coastguard Worker		retval=1
123*053f45beSAndroid Build Coastguard Worker	fi
124*053f45beSAndroid Build Coastguard Worker}
125*053f45beSAndroid Build Coastguard Worker
126*053f45beSAndroid Build Coastguard Workeroffline_cpu_expect_success()
127*053f45beSAndroid Build Coastguard Worker{
128*053f45beSAndroid Build Coastguard Worker	local cpu=$1
129*053f45beSAndroid Build Coastguard Worker
130*053f45beSAndroid Build Coastguard Worker	if ! offline_cpu $cpu; then
131*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected fail >&2
132*053f45beSAndroid Build Coastguard Worker		retval=1
133*053f45beSAndroid Build Coastguard Worker	elif ! cpu_is_offline $cpu; then
134*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected offline >&2
135*053f45beSAndroid Build Coastguard Worker		retval=1
136*053f45beSAndroid Build Coastguard Worker	fi
137*053f45beSAndroid Build Coastguard Worker}
138*053f45beSAndroid Build Coastguard Worker
139*053f45beSAndroid Build Coastguard Workeroffline_cpu_expect_fail()
140*053f45beSAndroid Build Coastguard Worker{
141*053f45beSAndroid Build Coastguard Worker	local cpu=$1
142*053f45beSAndroid Build Coastguard Worker
143*053f45beSAndroid Build Coastguard Worker	if offline_cpu $cpu 2> /dev/null; then
144*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected success >&2
145*053f45beSAndroid Build Coastguard Worker		retval=1
146*053f45beSAndroid Build Coastguard Worker	elif ! cpu_is_online $cpu; then
147*053f45beSAndroid Build Coastguard Worker		echo $FUNCNAME $cpu: unexpected offline >&2
148*053f45beSAndroid Build Coastguard Worker		retval=1
149*053f45beSAndroid Build Coastguard Worker	fi
150*053f45beSAndroid Build Coastguard Worker}
151*053f45beSAndroid Build Coastguard Worker
152*053f45beSAndroid Build Coastguard Workeronline_all_hot_pluggable_cpus()
153*053f45beSAndroid Build Coastguard Worker{
154*053f45beSAndroid Build Coastguard Worker	for cpu in `hotplaggable_offline_cpus`; do
155*053f45beSAndroid Build Coastguard Worker		online_cpu_expect_success $cpu
156*053f45beSAndroid Build Coastguard Worker	done
157*053f45beSAndroid Build Coastguard Worker}
158*053f45beSAndroid Build Coastguard Worker
159*053f45beSAndroid Build Coastguard Workeroffline_all_hot_pluggable_cpus()
160*053f45beSAndroid Build Coastguard Worker{
161*053f45beSAndroid Build Coastguard Worker	local reserve_cpu=$online_max
162*053f45beSAndroid Build Coastguard Worker	for cpu in `hotpluggable_online_cpus`; do
163*053f45beSAndroid Build Coastguard Worker		# Reserve one cpu oneline at least.
164*053f45beSAndroid Build Coastguard Worker		if [ $cpu -eq $reserve_cpu ];then
165*053f45beSAndroid Build Coastguard Worker			continue
166*053f45beSAndroid Build Coastguard Worker		fi
167*053f45beSAndroid Build Coastguard Worker		offline_cpu_expect_success $cpu
168*053f45beSAndroid Build Coastguard Worker	done
169*053f45beSAndroid Build Coastguard Worker}
170*053f45beSAndroid Build Coastguard Worker
171*053f45beSAndroid Build Coastguard Workerallcpus=0
172*053f45beSAndroid Build Coastguard Workeronline_cpus=0
173*053f45beSAndroid Build Coastguard Workeronline_max=0
174*053f45beSAndroid Build Coastguard Workeroffline_cpus=0
175*053f45beSAndroid Build Coastguard Workeroffline_max=0
176*053f45beSAndroid Build Coastguard Workerpresent_cpus=0
177*053f45beSAndroid Build Coastguard Workerpresent_max=0
178*053f45beSAndroid Build Coastguard Worker
179*053f45beSAndroid Build Coastguard Workerwhile getopts ah opt; do
180*053f45beSAndroid Build Coastguard Worker	case $opt in
181*053f45beSAndroid Build Coastguard Worker	a)
182*053f45beSAndroid Build Coastguard Worker		allcpus=1
183*053f45beSAndroid Build Coastguard Worker		;;
184*053f45beSAndroid Build Coastguard Worker	h)
185*053f45beSAndroid Build Coastguard Worker		echo "Usage $0 [ -a ]"
186*053f45beSAndroid Build Coastguard Worker		echo -e "\t default offline one cpu"
187*053f45beSAndroid Build Coastguard Worker		echo -e "\t run with -a option to offline all cpus"
188*053f45beSAndroid Build Coastguard Worker		exit
189*053f45beSAndroid Build Coastguard Worker		;;
190*053f45beSAndroid Build Coastguard Worker	esac
191*053f45beSAndroid Build Coastguard Workerdone
192*053f45beSAndroid Build Coastguard Worker
193*053f45beSAndroid Build Coastguard Workerprerequisite
194*053f45beSAndroid Build Coastguard Worker
195*053f45beSAndroid Build Coastguard Worker#
196*053f45beSAndroid Build Coastguard Worker# Safe test (default) - offline and online one cpu
197*053f45beSAndroid Build Coastguard Worker#
198*053f45beSAndroid Build Coastguard Workerif [ $allcpus -eq 0 ]; then
199*053f45beSAndroid Build Coastguard Worker	echo "Limited scope test: one hotplug cpu"
200*053f45beSAndroid Build Coastguard Worker	echo -e "\t (leaves cpu in the original state):"
201*053f45beSAndroid Build Coastguard Worker	echo -e "\t online to offline to online: cpu $online_max"
202*053f45beSAndroid Build Coastguard Worker	offline_cpu_expect_success $online_max
203*053f45beSAndroid Build Coastguard Worker	online_cpu_expect_success $online_max
204*053f45beSAndroid Build Coastguard Worker
205*053f45beSAndroid Build Coastguard Worker	if [[ $offline_cpus -gt 0 ]]; then
206*053f45beSAndroid Build Coastguard Worker		echo -e "\t online to offline to online: cpu $present_max"
207*053f45beSAndroid Build Coastguard Worker		online_cpu_expect_success $present_max
208*053f45beSAndroid Build Coastguard Worker		offline_cpu_expect_success $present_max
209*053f45beSAndroid Build Coastguard Worker		online_cpu $present_max
210*053f45beSAndroid Build Coastguard Worker	fi
211*053f45beSAndroid Build Coastguard Worker	exit $retval
212*053f45beSAndroid Build Coastguard Workerelse
213*053f45beSAndroid Build Coastguard Worker	echo "Full scope test: all hotplug cpus"
214*053f45beSAndroid Build Coastguard Worker	echo -e "\t online all offline cpus"
215*053f45beSAndroid Build Coastguard Worker	echo -e "\t offline all online cpus"
216*053f45beSAndroid Build Coastguard Worker	echo -e "\t online all offline cpus"
217*053f45beSAndroid Build Coastguard Workerfi
218*053f45beSAndroid Build Coastguard Worker
219*053f45beSAndroid Build Coastguard Workeronline_all_hot_pluggable_cpus
220*053f45beSAndroid Build Coastguard Worker
221*053f45beSAndroid Build Coastguard Workeroffline_all_hot_pluggable_cpus
222*053f45beSAndroid Build Coastguard Worker
223*053f45beSAndroid Build Coastguard Workeronline_all_hot_pluggable_cpus
224*053f45beSAndroid Build Coastguard Worker
225*053f45beSAndroid Build Coastguard Workerexit $retval
226