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