1 #!/bin/bash 1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 2 # SPDX-License-Identifier: GPL-2.0 3 3 4 SYSFS= 4 SYSFS= 5 # Kselftest framework requirement - SKIP code 5 # Kselftest framework requirement - SKIP code is 4. 6 ksft_skip=4 6 ksft_skip=4 7 retval=0 << 8 7 9 prerequisite() 8 prerequisite() 10 { 9 { 11 msg="skip all tests:" 10 msg="skip all tests:" 12 11 13 if [ $UID != 0 ]; then 12 if [ $UID != 0 ]; then 14 echo $msg must be run as root 13 echo $msg must be run as root >&2 15 exit $ksft_skip 14 exit $ksft_skip 16 fi 15 fi 17 16 18 taskset -p 01 $$ 17 taskset -p 01 $$ 19 18 20 SYSFS=`mount -t sysfs | head -1 | awk 19 SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` 21 20 22 if [ ! -d "$SYSFS" ]; then 21 if [ ! -d "$SYSFS" ]; then 23 echo $msg sysfs is not mounted 22 echo $msg sysfs is not mounted >&2 24 exit $ksft_skip 23 exit $ksft_skip 25 fi 24 fi 26 25 27 if ! ls $SYSFS/devices/system/cpu/cpu* 26 if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then 28 echo $msg cpu hotplug is not s 27 echo $msg cpu hotplug is not supported >&2 29 exit $ksft_skip 28 exit $ksft_skip 30 fi 29 fi 31 30 32 echo "CPU online/offline summary:" 31 echo "CPU online/offline summary:" 33 online_cpus=`cat $SYSFS/devices/system 32 online_cpus=`cat $SYSFS/devices/system/cpu/online` 34 online_max=${online_cpus##*-} 33 online_max=${online_cpus##*-} 35 34 36 if [[ "$online_cpus" = "$online_max" ] 35 if [[ "$online_cpus" = "$online_max" ]]; then 37 echo "$msg: since there is onl 36 echo "$msg: since there is only one cpu: $online_cpus" 38 exit $ksft_skip 37 exit $ksft_skip 39 fi 38 fi 40 39 41 present_cpus=`cat $SYSFS/devices/syste 40 present_cpus=`cat $SYSFS/devices/system/cpu/present` 42 present_max=${present_cpus##*-} 41 present_max=${present_cpus##*-} 43 echo "present_cpus = $present_cpus pre 42 echo "present_cpus = $present_cpus present_max = $present_max" 44 43 45 echo -e "\t Cpus in online state: $onl 44 echo -e "\t Cpus in online state: $online_cpus" 46 45 47 offline_cpus=`cat $SYSFS/devices/syste 46 offline_cpus=`cat $SYSFS/devices/system/cpu/offline` 48 if [[ "a$offline_cpus" = "a" ]]; then 47 if [[ "a$offline_cpus" = "a" ]]; then 49 offline_cpus=0 48 offline_cpus=0 50 else 49 else 51 offline_max=${offline_cpus##*- 50 offline_max=${offline_cpus##*-} 52 fi 51 fi 53 echo -e "\t Cpus in offline state: $of 52 echo -e "\t Cpus in offline state: $offline_cpus" 54 } 53 } 55 54 56 # 55 # 57 # list all hot-pluggable CPUs 56 # list all hot-pluggable CPUs 58 # 57 # 59 hotpluggable_cpus() 58 hotpluggable_cpus() 60 { 59 { 61 local state=${1:-.\*} 60 local state=${1:-.\*} 62 61 63 for cpu in $SYSFS/devices/system/cpu/c 62 for cpu in $SYSFS/devices/system/cpu/cpu*; do 64 if [ -f $cpu/online ] && grep 63 if [ -f $cpu/online ] && grep -q $state $cpu/online; then 65 echo ${cpu##/*/cpu} 64 echo ${cpu##/*/cpu} 66 fi 65 fi 67 done 66 done 68 } 67 } 69 68 70 hotplaggable_offline_cpus() 69 hotplaggable_offline_cpus() 71 { 70 { 72 hotpluggable_cpus 0 71 hotpluggable_cpus 0 73 } 72 } 74 73 75 hotpluggable_online_cpus() 74 hotpluggable_online_cpus() 76 { 75 { 77 hotpluggable_cpus 1 76 hotpluggable_cpus 1 78 } 77 } 79 78 80 cpu_is_online() 79 cpu_is_online() 81 { 80 { 82 grep -q 1 $SYSFS/devices/system/cpu/cp 81 grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online 83 } 82 } 84 83 85 cpu_is_offline() 84 cpu_is_offline() 86 { 85 { 87 grep -q 0 $SYSFS/devices/system/cpu/cp 86 grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online 88 } 87 } 89 88 90 online_cpu() 89 online_cpu() 91 { 90 { 92 echo 1 > $SYSFS/devices/system/cpu/cpu 91 echo 1 > $SYSFS/devices/system/cpu/cpu$1/online 93 } 92 } 94 93 95 offline_cpu() 94 offline_cpu() 96 { 95 { 97 echo 0 > $SYSFS/devices/system/cpu/cpu 96 echo 0 > $SYSFS/devices/system/cpu/cpu$1/online 98 } 97 } 99 98 100 online_cpu_expect_success() 99 online_cpu_expect_success() 101 { 100 { 102 local cpu=$1 101 local cpu=$1 103 102 104 if ! online_cpu $cpu; then 103 if ! online_cpu $cpu; then 105 echo $FUNCNAME $cpu: unexpecte 104 echo $FUNCNAME $cpu: unexpected fail >&2 106 retval=1 !! 105 exit 1 107 elif ! cpu_is_online $cpu; then 106 elif ! cpu_is_online $cpu; then 108 echo $FUNCNAME $cpu: unexpecte 107 echo $FUNCNAME $cpu: unexpected offline >&2 109 retval=1 !! 108 exit 1 110 fi 109 fi 111 } 110 } 112 111 113 online_cpu_expect_fail() 112 online_cpu_expect_fail() 114 { 113 { 115 local cpu=$1 114 local cpu=$1 116 115 117 if online_cpu $cpu 2> /dev/null; then 116 if online_cpu $cpu 2> /dev/null; then 118 echo $FUNCNAME $cpu: unexpecte 117 echo $FUNCNAME $cpu: unexpected success >&2 119 retval=1 !! 118 exit 1 120 elif ! cpu_is_offline $cpu; then 119 elif ! cpu_is_offline $cpu; then 121 echo $FUNCNAME $cpu: unexpecte 120 echo $FUNCNAME $cpu: unexpected online >&2 122 retval=1 !! 121 exit 1 123 fi 122 fi 124 } 123 } 125 124 126 offline_cpu_expect_success() 125 offline_cpu_expect_success() 127 { 126 { 128 local cpu=$1 127 local cpu=$1 129 128 130 if ! offline_cpu $cpu; then 129 if ! offline_cpu $cpu; then 131 echo $FUNCNAME $cpu: unexpecte 130 echo $FUNCNAME $cpu: unexpected fail >&2 132 retval=1 !! 131 exit 1 133 elif ! cpu_is_offline $cpu; then 132 elif ! cpu_is_offline $cpu; then 134 echo $FUNCNAME $cpu: unexpecte 133 echo $FUNCNAME $cpu: unexpected offline >&2 135 retval=1 !! 134 exit 1 136 fi 135 fi 137 } 136 } 138 137 139 offline_cpu_expect_fail() 138 offline_cpu_expect_fail() 140 { 139 { 141 local cpu=$1 140 local cpu=$1 142 141 143 if offline_cpu $cpu 2> /dev/null; then 142 if offline_cpu $cpu 2> /dev/null; then 144 echo $FUNCNAME $cpu: unexpecte 143 echo $FUNCNAME $cpu: unexpected success >&2 145 retval=1 !! 144 exit 1 146 elif ! cpu_is_online $cpu; then 145 elif ! cpu_is_online $cpu; then 147 echo $FUNCNAME $cpu: unexpecte 146 echo $FUNCNAME $cpu: unexpected offline >&2 148 retval=1 !! 147 exit 1 149 fi 148 fi 150 } 149 } 151 150 152 online_all_hot_pluggable_cpus() !! 151 error=-12 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 152 allcpus=0 >> 153 priority=0 172 online_cpus=0 154 online_cpus=0 173 online_max=0 155 online_max=0 174 offline_cpus=0 156 offline_cpus=0 175 offline_max=0 157 offline_max=0 176 present_cpus=0 158 present_cpus=0 177 present_max=0 159 present_max=0 178 160 179 while getopts ah opt; do !! 161 while getopts e:ahp: opt; do 180 case $opt in 162 case $opt in >> 163 e) >> 164 error=$OPTARG >> 165 ;; 181 a) 166 a) 182 allcpus=1 167 allcpus=1 183 ;; 168 ;; 184 h) 169 h) 185 echo "Usage $0 [ -a ]" !! 170 echo "Usage $0 [ -a ] [ -e errno ] [ -p notifier-priority ]" 186 echo -e "\t default offline on 171 echo -e "\t default offline one cpu" 187 echo -e "\t run with -a option 172 echo -e "\t run with -a option to offline all cpus" 188 exit 173 exit 189 ;; 174 ;; >> 175 p) >> 176 priority=$OPTARG >> 177 ;; 190 esac 178 esac 191 done 179 done 192 180 >> 181 if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then >> 182 echo "error code must be -4095 <= errno < 0" >&2 >> 183 exit 1 >> 184 fi >> 185 193 prerequisite 186 prerequisite 194 187 195 # 188 # 196 # Safe test (default) - offline and online one 189 # Safe test (default) - offline and online one cpu 197 # 190 # 198 if [ $allcpus -eq 0 ]; then 191 if [ $allcpus -eq 0 ]; then 199 echo "Limited scope test: one hotplug 192 echo "Limited scope test: one hotplug cpu" 200 echo -e "\t (leaves cpu in the origina 193 echo -e "\t (leaves cpu in the original state):" 201 echo -e "\t online to offline to onlin 194 echo -e "\t online to offline to online: cpu $online_max" 202 offline_cpu_expect_success $online_max 195 offline_cpu_expect_success $online_max 203 online_cpu_expect_success $online_max 196 online_cpu_expect_success $online_max 204 197 205 if [[ $offline_cpus -gt 0 ]]; then 198 if [[ $offline_cpus -gt 0 ]]; then 206 echo -e "\t online to offline !! 199 echo -e "\t offline to online to offline: cpu $present_max" 207 online_cpu_expect_success $pre 200 online_cpu_expect_success $present_max 208 offline_cpu_expect_success $pr 201 offline_cpu_expect_success $present_max 209 online_cpu $present_max 202 online_cpu $present_max 210 fi 203 fi 211 exit $retval !! 204 exit 0 212 else 205 else 213 echo "Full scope test: all hotplug cpu 206 echo "Full scope test: all hotplug cpus" 214 echo -e "\t online all offline cpus" 207 echo -e "\t online all offline cpus" 215 echo -e "\t offline all online cpus" 208 echo -e "\t offline all online cpus" 216 echo -e "\t online all offline cpus" 209 echo -e "\t online all offline cpus" 217 fi 210 fi 218 211 219 online_all_hot_pluggable_cpus !! 212 # >> 213 # Online all hot-pluggable CPUs >> 214 # >> 215 for cpu in `hotplaggable_offline_cpus`; do >> 216 online_cpu_expect_success $cpu >> 217 done >> 218 >> 219 # >> 220 # Offline all hot-pluggable CPUs >> 221 # >> 222 for cpu in `hotpluggable_online_cpus`; do >> 223 offline_cpu_expect_success $cpu >> 224 done >> 225 >> 226 # >> 227 # Online all hot-pluggable CPUs again >> 228 # >> 229 for cpu in `hotplaggable_offline_cpus`; do >> 230 online_cpu_expect_success $cpu >> 231 done >> 232 >> 233 # >> 234 # Test with cpu notifier error injection >> 235 # 220 236 221 offline_all_hot_pluggable_cpus !! 237 DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'` >> 238 NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/cpu 222 239 223 online_all_hot_pluggable_cpus !! 240 prerequisite_extra() >> 241 { >> 242 msg="skip extra tests:" >> 243 >> 244 /sbin/modprobe -q -r cpu-notifier-error-inject >> 245 /sbin/modprobe -q cpu-notifier-error-inject priority=$priority >> 246 >> 247 if [ ! -d "$DEBUGFS" ]; then >> 248 echo $msg debugfs is not mounted >&2 >> 249 exit $ksft_skip >> 250 fi >> 251 >> 252 if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then >> 253 echo $msg cpu-notifier-error-inject module is not available >&2 >> 254 exit $ksft_skip >> 255 fi >> 256 } >> 257 >> 258 prerequisite_extra >> 259 >> 260 # >> 261 # Offline all hot-pluggable CPUs >> 262 # >> 263 echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error >> 264 for cpu in `hotpluggable_online_cpus`; do >> 265 offline_cpu_expect_success $cpu >> 266 done >> 267 >> 268 # >> 269 # Test CPU hot-add error handling (offline => online) >> 270 # >> 271 echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_UP_PREPARE/error >> 272 for cpu in `hotplaggable_offline_cpus`; do >> 273 online_cpu_expect_fail $cpu >> 274 done >> 275 >> 276 # >> 277 # Online all hot-pluggable CPUs >> 278 # >> 279 echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_UP_PREPARE/error >> 280 for cpu in `hotplaggable_offline_cpus`; do >> 281 online_cpu_expect_success $cpu >> 282 done >> 283 >> 284 # >> 285 # Test CPU hot-remove error handling (online => offline) >> 286 # >> 287 echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error >> 288 for cpu in `hotpluggable_online_cpus`; do >> 289 offline_cpu_expect_fail $cpu >> 290 done 224 291 225 exit $retval !! 292 echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error >> 293 /sbin/modprobe -q -r cpu-notifier-error-inject
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.