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