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