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