Path: blob/master/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh
26285 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023SYSFS=4# Kselftest framework requirement - SKIP code is 4.5ksft_skip=46retval=078prerequisite()9{10msg="skip all tests:"1112if [ $UID != 0 ]; then13echo $msg must be run as root >&214exit $ksft_skip15fi1617taskset -p 01 $$1819SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`2021if [ ! -d "$SYSFS" ]; then22echo $msg sysfs is not mounted >&223exit $ksft_skip24fi2526if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then27echo $msg cpu hotplug is not supported >&228exit $ksft_skip29fi3031echo "CPU online/offline summary:"32online_cpus=`cat $SYSFS/devices/system/cpu/online`33online_max=${online_cpus##*-}3435if [[ "$online_cpus" = "$online_max" ]]; then36echo "$msg: since there is only one cpu: $online_cpus"37exit $ksft_skip38fi3940present_cpus=`cat $SYSFS/devices/system/cpu/present`41present_max=${present_cpus##*-}42echo "present_cpus = $present_cpus present_max = $present_max"4344echo -e "\t Cpus in online state: $online_cpus"4546offline_cpus=`cat $SYSFS/devices/system/cpu/offline`47if [[ "a$offline_cpus" = "a" ]]; then48offline_cpus=049else50offline_max=${offline_cpus##*-}51fi52echo -e "\t Cpus in offline state: $offline_cpus"53}5455#56# list all hot-pluggable CPUs57#58hotpluggable_cpus()59{60local state=${1:-.\*}6162for cpu in $SYSFS/devices/system/cpu/cpu*; do63if [ -f $cpu/online ] && grep -q $state $cpu/online; then64echo ${cpu##/*/cpu}65fi66done67}6869hotpluggable_offline_cpus()70{71hotpluggable_cpus 072}7374hotpluggable_online_cpus()75{76hotpluggable_cpus 177}7879cpu_is_online()80{81grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online82}8384cpu_is_offline()85{86grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online87}8889online_cpu()90{91echo 1 > $SYSFS/devices/system/cpu/cpu$1/online92}9394offline_cpu()95{96echo 0 > $SYSFS/devices/system/cpu/cpu$1/online97}9899online_cpu_expect_success()100{101local cpu=$1102103if ! online_cpu $cpu; then104echo $FUNCNAME $cpu: unexpected fail >&2105retval=1106elif ! cpu_is_online $cpu; then107echo $FUNCNAME $cpu: unexpected offline >&2108retval=1109fi110}111112online_cpu_expect_fail()113{114local cpu=$1115116if online_cpu $cpu 2> /dev/null; then117echo $FUNCNAME $cpu: unexpected success >&2118retval=1119elif ! cpu_is_offline $cpu; then120echo $FUNCNAME $cpu: unexpected online >&2121retval=1122fi123}124125offline_cpu_expect_success()126{127local cpu=$1128129if ! offline_cpu $cpu; then130echo $FUNCNAME $cpu: unexpected fail >&2131retval=1132elif ! cpu_is_offline $cpu; then133echo $FUNCNAME $cpu: unexpected offline >&2134retval=1135fi136}137138offline_cpu_expect_fail()139{140local cpu=$1141142if offline_cpu $cpu 2> /dev/null; then143echo $FUNCNAME $cpu: unexpected success >&2144retval=1145elif ! cpu_is_online $cpu; then146echo $FUNCNAME $cpu: unexpected offline >&2147retval=1148fi149}150151online_all_hot_pluggable_cpus()152{153for cpu in `hotpluggable_offline_cpus`; do154online_cpu_expect_success $cpu155done156}157158offline_all_hot_pluggable_cpus()159{160local reserve_cpu=$online_max161for cpu in `hotpluggable_online_cpus`; do162# Reserve one cpu oneline at least.163if [ $cpu -eq $reserve_cpu ];then164continue165fi166offline_cpu_expect_success $cpu167done168}169170allcpus=0171online_cpus=0172online_max=0173offline_cpus=0174offline_max=0175present_cpus=0176present_max=0177178while getopts ah opt; do179case $opt in180a)181allcpus=1182;;183h)184echo "Usage $0 [ -a ]"185echo -e "\t default offline one cpu"186echo -e "\t run with -a option to offline all cpus"187exit188;;189esac190done191192prerequisite193194#195# Safe test (default) - offline and online one cpu196#197if [ $allcpus -eq 0 ]; then198echo "Limited scope test: one hotplug cpu"199echo -e "\t (leaves cpu in the original state):"200echo -e "\t online to offline to online: cpu $online_max"201offline_cpu_expect_success $online_max202online_cpu_expect_success $online_max203204if [[ $offline_cpus -gt 0 ]]; then205echo -e "\t online to offline to online: cpu $present_max"206online_cpu_expect_success $present_max207offline_cpu_expect_success $present_max208online_cpu $present_max209fi210exit $retval211else212echo "Full scope test: all hotplug cpus"213echo -e "\t online all offline cpus"214echo -e "\t offline all online cpus"215echo -e "\t online all offline cpus"216fi217218online_all_hot_pluggable_cpus219220offline_all_hot_pluggable_cpus221222online_all_hot_pluggable_cpus223224exit $retval225226227