226 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4SYSFS=5# Kselftest framework requirement - SKIP code is 4.6ksft_skip=47retval=08 9prerequisite()10{11 msg="skip all tests:"12 13 if [ $UID != 0 ]; then14 echo $msg must be run as root >&215 exit $ksft_skip16 fi17 18 taskset -p 01 $$19 20 SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`21 22 if [ ! -d "$SYSFS" ]; then23 echo $msg sysfs is not mounted >&224 exit $ksft_skip25 fi26 27 if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then28 echo $msg cpu hotplug is not supported >&229 exit $ksft_skip30 fi31 32 echo "CPU online/offline summary:"33 online_cpus=`cat $SYSFS/devices/system/cpu/online`34 online_max=${online_cpus##*-}35 36 if [[ "$online_cpus" = "$online_max" ]]; then37 echo "$msg: since there is only one cpu: $online_cpus"38 exit $ksft_skip39 fi40 41 present_cpus=`cat $SYSFS/devices/system/cpu/present`42 present_max=${present_cpus##*-}43 echo "present_cpus = $present_cpus present_max = $present_max"44 45 echo -e "\t Cpus in online state: $online_cpus"46 47 offline_cpus=`cat $SYSFS/devices/system/cpu/offline`48 if [[ "a$offline_cpus" = "a" ]]; then49 offline_cpus=050 else51 offline_max=${offline_cpus##*-}52 fi53 echo -e "\t Cpus in offline state: $offline_cpus"54}55 56#57# list all hot-pluggable CPUs58#59hotpluggable_cpus()60{61 local state=${1:-.\*}62 63 for cpu in $SYSFS/devices/system/cpu/cpu*; do64 if [ -f $cpu/online ] && grep -q $state $cpu/online; then65 echo ${cpu##/*/cpu}66 fi67 done68}69 70hotplaggable_offline_cpus()71{72 hotpluggable_cpus 073}74 75hotpluggable_online_cpus()76{77 hotpluggable_cpus 178}79 80cpu_is_online()81{82 grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online83}84 85cpu_is_offline()86{87 grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online88}89 90online_cpu()91{92 echo 1 > $SYSFS/devices/system/cpu/cpu$1/online93}94 95offline_cpu()96{97 echo 0 > $SYSFS/devices/system/cpu/cpu$1/online98}99 100online_cpu_expect_success()101{102 local cpu=$1103 104 if ! online_cpu $cpu; then105 echo $FUNCNAME $cpu: unexpected fail >&2106 retval=1107 elif ! cpu_is_online $cpu; then108 echo $FUNCNAME $cpu: unexpected offline >&2109 retval=1110 fi111}112 113online_cpu_expect_fail()114{115 local cpu=$1116 117 if online_cpu $cpu 2> /dev/null; then118 echo $FUNCNAME $cpu: unexpected success >&2119 retval=1120 elif ! cpu_is_offline $cpu; then121 echo $FUNCNAME $cpu: unexpected online >&2122 retval=1123 fi124}125 126offline_cpu_expect_success()127{128 local cpu=$1129 130 if ! offline_cpu $cpu; then131 echo $FUNCNAME $cpu: unexpected fail >&2132 retval=1133 elif ! cpu_is_offline $cpu; then134 echo $FUNCNAME $cpu: unexpected offline >&2135 retval=1136 fi137}138 139offline_cpu_expect_fail()140{141 local cpu=$1142 143 if offline_cpu $cpu 2> /dev/null; then144 echo $FUNCNAME $cpu: unexpected success >&2145 retval=1146 elif ! cpu_is_online $cpu; then147 echo $FUNCNAME $cpu: unexpected offline >&2148 retval=1149 fi150}151 152online_all_hot_pluggable_cpus()153{154 for cpu in `hotplaggable_offline_cpus`; do155 online_cpu_expect_success $cpu156 done157}158 159offline_all_hot_pluggable_cpus()160{161 local reserve_cpu=$online_max162 for cpu in `hotpluggable_online_cpus`; do163 # Reserve one cpu oneline at least.164 if [ $cpu -eq $reserve_cpu ];then165 continue166 fi167 offline_cpu_expect_success $cpu168 done169}170 171allcpus=0172online_cpus=0173online_max=0174offline_cpus=0175offline_max=0176present_cpus=0177present_max=0178 179while getopts ah opt; do180 case $opt in181 a)182 allcpus=1183 ;;184 h)185 echo "Usage $0 [ -a ]"186 echo -e "\t default offline one cpu"187 echo -e "\t run with -a option to offline all cpus"188 exit189 ;;190 esac191done192 193prerequisite194 195#196# Safe test (default) - offline and online one cpu197#198if [ $allcpus -eq 0 ]; then199 echo "Limited scope test: one hotplug cpu"200 echo -e "\t (leaves cpu in the original state):"201 echo -e "\t online to offline to online: cpu $online_max"202 offline_cpu_expect_success $online_max203 online_cpu_expect_success $online_max204 205 if [[ $offline_cpus -gt 0 ]]; then206 echo -e "\t online to offline to online: cpu $present_max"207 online_cpu_expect_success $present_max208 offline_cpu_expect_success $present_max209 online_cpu $present_max210 fi211 exit $retval212else213 echo "Full scope test: all hotplug cpus"214 echo -e "\t online all offline cpus"215 echo -e "\t offline all online cpus"216 echo -e "\t online all offline cpus"217fi218 219online_all_hot_pluggable_cpus220 221offline_all_hot_pluggable_cpus222 223online_all_hot_pluggable_cpus224 225exit $retval226