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