xref: /openbmc/linux/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1cc167821SShuah Khan#!/bin/bash
2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
3cc167821SShuah Khan
4cc167821SShuah KhanSYSFS=
567f721f9SShuah Khan (Samsung OSG)# Kselftest framework requirement - SKIP code is 4.
667f721f9SShuah Khan (Samsung OSG)ksft_skip=4
7972cf4ceSZhao Gongyiretval=0
8cc167821SShuah Khan
9cc167821SShuah Khanprerequisite()
10cc167821SShuah Khan{
11cc167821SShuah Khan	msg="skip all tests:"
12cc167821SShuah Khan
13cc167821SShuah Khan	if [ $UID != 0 ]; then
14cc167821SShuah Khan		echo $msg must be run as root >&2
1567f721f9SShuah Khan (Samsung OSG)		exit $ksft_skip
16cc167821SShuah Khan	fi
17cc167821SShuah Khan
18cc167821SShuah Khan	taskset -p 01 $$
19cc167821SShuah Khan
20cc167821SShuah Khan	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
21cc167821SShuah Khan
22cc167821SShuah Khan	if [ ! -d "$SYSFS" ]; then
23cc167821SShuah Khan		echo $msg sysfs is not mounted >&2
2467f721f9SShuah Khan (Samsung OSG)		exit $ksft_skip
25cc167821SShuah Khan	fi
26cc167821SShuah Khan
27cc167821SShuah Khan	if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then
28cc167821SShuah Khan		echo $msg cpu hotplug is not supported >&2
2967f721f9SShuah Khan (Samsung OSG)		exit $ksft_skip
30cc167821SShuah Khan	fi
31cc167821SShuah Khan
32cc167821SShuah Khan	echo "CPU online/offline summary:"
33cc167821SShuah Khan	online_cpus=`cat $SYSFS/devices/system/cpu/online`
34cc167821SShuah Khan	online_max=${online_cpus##*-}
3586db9a11SLi Zhijian
3686db9a11SLi Zhijian	if [[ "$online_cpus" = "$online_max" ]]; then
3786db9a11SLi Zhijian		echo "$msg: since there is only one cpu: $online_cpus"
3867f721f9SShuah Khan (Samsung OSG)		exit $ksft_skip
3986db9a11SLi Zhijian	fi
4086db9a11SLi Zhijian
412b531b61SColin Ian King	present_cpus=`cat $SYSFS/devices/system/cpu/present`
422b531b61SColin Ian King	present_max=${present_cpus##*-}
432b531b61SColin Ian King	echo "present_cpus = $present_cpus present_max = $present_max"
442b531b61SColin Ian King
45cc167821SShuah Khan	echo -e "\t Cpus in online state: $online_cpus"
46cc167821SShuah Khan
47cc167821SShuah Khan	offline_cpus=`cat $SYSFS/devices/system/cpu/offline`
48cc167821SShuah Khan	if [[ "a$offline_cpus" = "a" ]]; then
49cc167821SShuah Khan		offline_cpus=0
50cc167821SShuah Khan	else
51cc167821SShuah Khan		offline_max=${offline_cpus##*-}
52cc167821SShuah Khan	fi
53cc167821SShuah Khan	echo -e "\t Cpus in offline state: $offline_cpus"
54cc167821SShuah Khan}
55cc167821SShuah Khan
56cc167821SShuah Khan#
57cc167821SShuah Khan# list all hot-pluggable CPUs
58cc167821SShuah Khan#
59cc167821SShuah Khanhotpluggable_cpus()
60cc167821SShuah Khan{
61cc167821SShuah Khan	local state=${1:-.\*}
62cc167821SShuah Khan
63cc167821SShuah Khan	for cpu in $SYSFS/devices/system/cpu/cpu*; do
64cc167821SShuah Khan		if [ -f $cpu/online ] && grep -q $state $cpu/online; then
65cc167821SShuah Khan			echo ${cpu##/*/cpu}
66cc167821SShuah Khan		fi
67cc167821SShuah Khan	done
68cc167821SShuah Khan}
69cc167821SShuah Khan
70cc167821SShuah Khanhotplaggable_offline_cpus()
71cc167821SShuah Khan{
72cc167821SShuah Khan	hotpluggable_cpus 0
73cc167821SShuah Khan}
74cc167821SShuah Khan
75cc167821SShuah Khanhotpluggable_online_cpus()
76cc167821SShuah Khan{
77cc167821SShuah Khan	hotpluggable_cpus 1
78cc167821SShuah Khan}
79cc167821SShuah Khan
80cc167821SShuah Khancpu_is_online()
81cc167821SShuah Khan{
82cc167821SShuah Khan	grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online
83cc167821SShuah Khan}
84cc167821SShuah Khan
85cc167821SShuah Khancpu_is_offline()
86cc167821SShuah Khan{
87cc167821SShuah Khan	grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online
88cc167821SShuah Khan}
89cc167821SShuah Khan
90cc167821SShuah Khanonline_cpu()
91cc167821SShuah Khan{
92cc167821SShuah Khan	echo 1 > $SYSFS/devices/system/cpu/cpu$1/online
93cc167821SShuah Khan}
94cc167821SShuah Khan
95cc167821SShuah Khanoffline_cpu()
96cc167821SShuah Khan{
97cc167821SShuah Khan	echo 0 > $SYSFS/devices/system/cpu/cpu$1/online
98cc167821SShuah Khan}
99cc167821SShuah Khan
100cc167821SShuah Khanonline_cpu_expect_success()
101cc167821SShuah Khan{
102cc167821SShuah Khan	local cpu=$1
103cc167821SShuah Khan
104cc167821SShuah Khan	if ! online_cpu $cpu; then
105cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected fail >&2
106972cf4ceSZhao Gongyi		retval=1
107cc167821SShuah Khan	elif ! cpu_is_online $cpu; then
108cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected offline >&2
109972cf4ceSZhao Gongyi		retval=1
110cc167821SShuah Khan	fi
111cc167821SShuah Khan}
112cc167821SShuah Khan
113cc167821SShuah Khanonline_cpu_expect_fail()
114cc167821SShuah Khan{
115cc167821SShuah Khan	local cpu=$1
116cc167821SShuah Khan
117cc167821SShuah Khan	if online_cpu $cpu 2> /dev/null; then
118cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected success >&2
119195d74beSZhao Gongyi		retval=1
120cc167821SShuah Khan	elif ! cpu_is_offline $cpu; then
121cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected online >&2
122195d74beSZhao Gongyi		retval=1
123cc167821SShuah Khan	fi
124cc167821SShuah Khan}
125cc167821SShuah Khan
126cc167821SShuah Khanoffline_cpu_expect_success()
127cc167821SShuah Khan{
128cc167821SShuah Khan	local cpu=$1
129cc167821SShuah Khan
130cc167821SShuah Khan	if ! offline_cpu $cpu; then
131cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected fail >&2
132972cf4ceSZhao Gongyi		retval=1
133cc167821SShuah Khan	elif ! cpu_is_offline $cpu; then
134cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected offline >&2
135972cf4ceSZhao Gongyi		retval=1
136cc167821SShuah Khan	fi
137cc167821SShuah Khan}
138cc167821SShuah Khan
139cc167821SShuah Khanoffline_cpu_expect_fail()
140cc167821SShuah Khan{
141cc167821SShuah Khan	local cpu=$1
142cc167821SShuah Khan
143cc167821SShuah Khan	if offline_cpu $cpu 2> /dev/null; then
144cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected success >&2
145195d74beSZhao Gongyi		retval=1
146cc167821SShuah Khan	elif ! cpu_is_online $cpu; then
147cc167821SShuah Khan		echo $FUNCNAME $cpu: unexpected offline >&2
148195d74beSZhao Gongyi		retval=1
149cc167821SShuah Khan	fi
150cc167821SShuah Khan}
151cc167821SShuah Khan
152*51d4c851SZhao Gongyionline_all_hot_pluggable_cpus()
153*51d4c851SZhao Gongyi{
154*51d4c851SZhao Gongyi	for cpu in `hotplaggable_offline_cpus`; do
155*51d4c851SZhao Gongyi		online_cpu_expect_success $cpu
156*51d4c851SZhao Gongyi	done
157*51d4c851SZhao Gongyi}
158*51d4c851SZhao Gongyi
159*51d4c851SZhao Gongyioffline_all_hot_pluggable_cpus()
160*51d4c851SZhao Gongyi{
161*51d4c851SZhao Gongyi	local reserve_cpu=$online_max
162*51d4c851SZhao Gongyi	for cpu in `hotpluggable_online_cpus`; do
163*51d4c851SZhao Gongyi		# Reserve one cpu oneline at least.
164*51d4c851SZhao Gongyi		if [ $cpu -eq $reserve_cpu ];then
165*51d4c851SZhao Gongyi			continue
166*51d4c851SZhao Gongyi		fi
167*51d4c851SZhao Gongyi		offline_cpu_expect_success $cpu
168*51d4c851SZhao Gongyi	done
169*51d4c851SZhao Gongyi}
170*51d4c851SZhao Gongyi
171cc167821SShuah Khanallcpus=0
172cc167821SShuah Khanonline_cpus=0
173cc167821SShuah Khanonline_max=0
174cc167821SShuah Khanoffline_cpus=0
175cc167821SShuah Khanoffline_max=0
1762b531b61SColin Ian Kingpresent_cpus=0
1772b531b61SColin Ian Kingpresent_max=0
178cc167821SShuah Khan
179195d74beSZhao Gongyiwhile getopts ah opt; do
180cc167821SShuah Khan	case $opt in
181cc167821SShuah Khan	a)
182cc167821SShuah Khan		allcpus=1
183cc167821SShuah Khan		;;
184cc167821SShuah Khan	h)
185195d74beSZhao Gongyi		echo "Usage $0 [ -a ]"
186cc167821SShuah Khan		echo -e "\t default offline one cpu"
187cc167821SShuah Khan		echo -e "\t run with -a option to offline all cpus"
188cc167821SShuah Khan		exit
189cc167821SShuah Khan		;;
190cc167821SShuah Khan	esac
191cc167821SShuah Khandone
192cc167821SShuah Khan
193cc167821SShuah Khanprerequisite
194cc167821SShuah Khan
195cc167821SShuah Khan#
196cc167821SShuah Khan# Safe test (default) - offline and online one cpu
197cc167821SShuah Khan#
198cc167821SShuah Khanif [ $allcpus -eq 0 ]; then
199cc167821SShuah Khan	echo "Limited scope test: one hotplug cpu"
200cc167821SShuah Khan	echo -e "\t (leaves cpu in the original state):"
201cc167821SShuah Khan	echo -e "\t online to offline to online: cpu $online_max"
202cc167821SShuah Khan	offline_cpu_expect_success $online_max
203cc167821SShuah Khan	online_cpu_expect_success $online_max
204cc167821SShuah Khan
205cc167821SShuah Khan	if [[ $offline_cpus -gt 0 ]]; then
2062354edd0SZhao Gongyi		echo -e "\t online to offline to online: cpu $present_max"
2072b531b61SColin Ian King		online_cpu_expect_success $present_max
2082b531b61SColin Ian King		offline_cpu_expect_success $present_max
2092b531b61SColin Ian King		online_cpu $present_max
210cc167821SShuah Khan	fi
211972cf4ceSZhao Gongyi	exit $retval
212cc167821SShuah Khanelse
213cc167821SShuah Khan	echo "Full scope test: all hotplug cpus"
214cc167821SShuah Khan	echo -e "\t online all offline cpus"
215cc167821SShuah Khan	echo -e "\t offline all online cpus"
216cc167821SShuah Khan	echo -e "\t online all offline cpus"
217cc167821SShuah Khanfi
218cc167821SShuah Khan
219*51d4c851SZhao Gongyionline_all_hot_pluggable_cpus
220cc167821SShuah Khan
221*51d4c851SZhao Gongyioffline_all_hot_pluggable_cpus
222cc167821SShuah Khan
223*51d4c851SZhao Gongyionline_all_hot_pluggable_cpus
224cc167821SShuah Khan
225972cf4ceSZhao Gongyiexit $retval
226