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