1cc167821SShuah Khan#!/bin/bash 2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 3cc167821SShuah Khan 4cc167821SShuah KhanSYSFS= 567f721f9SShuah Khan (Samsung OSG)# Kselftest framework requirement - SKIP code is 4. 667f721f9SShuah Khan (Samsung OSG)ksft_skip=4 7972cf4ceSZhao Gongyiretval=0 8cc167821SShuah Khan 9cc167821SShuah Khanprerequisite() 10cc167821SShuah Khan{ 11cc167821SShuah Khan msg="skip all tests:" 12cc167821SShuah Khan 13cc167821SShuah Khan if [ $UID != 0 ]; then 14cc167821SShuah Khan echo $msg must be run as root >&2 1567f721f9SShuah Khan (Samsung OSG) exit $ksft_skip 16cc167821SShuah Khan fi 17cc167821SShuah Khan 18cc167821SShuah Khan taskset -p 01 $$ 19cc167821SShuah Khan 20cc167821SShuah Khan SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` 21cc167821SShuah Khan 22cc167821SShuah Khan if [ ! -d "$SYSFS" ]; then 23cc167821SShuah Khan echo $msg sysfs is not mounted >&2 2467f721f9SShuah Khan (Samsung OSG) exit $ksft_skip 25cc167821SShuah Khan fi 26cc167821SShuah Khan 27cc167821SShuah Khan if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then 28cc167821SShuah Khan echo $msg cpu hotplug is not supported >&2 2967f721f9SShuah Khan (Samsung OSG) exit $ksft_skip 30cc167821SShuah Khan fi 31cc167821SShuah Khan 32cc167821SShuah Khan echo "CPU online/offline summary:" 33cc167821SShuah Khan online_cpus=`cat $SYSFS/devices/system/cpu/online` 34cc167821SShuah Khan online_max=${online_cpus##*-} 3586db9a11SLi Zhijian 3686db9a11SLi Zhijian if [[ "$online_cpus" = "$online_max" ]]; then 3786db9a11SLi Zhijian echo "$msg: since there is only one cpu: $online_cpus" 3867f721f9SShuah Khan (Samsung OSG) exit $ksft_skip 3986db9a11SLi Zhijian fi 4086db9a11SLi Zhijian 412b531b61SColin Ian King present_cpus=`cat $SYSFS/devices/system/cpu/present` 422b531b61SColin Ian King present_max=${present_cpus##*-} 432b531b61SColin Ian King echo "present_cpus = $present_cpus present_max = $present_max" 442b531b61SColin Ian King 45cc167821SShuah Khan echo -e "\t Cpus in online state: $online_cpus" 46cc167821SShuah Khan 47cc167821SShuah Khan offline_cpus=`cat $SYSFS/devices/system/cpu/offline` 48cc167821SShuah Khan if [[ "a$offline_cpus" = "a" ]]; then 49cc167821SShuah Khan offline_cpus=0 50cc167821SShuah Khan else 51cc167821SShuah Khan offline_max=${offline_cpus##*-} 52cc167821SShuah Khan fi 53cc167821SShuah Khan echo -e "\t Cpus in offline state: $offline_cpus" 54cc167821SShuah Khan} 55cc167821SShuah Khan 56cc167821SShuah Khan# 57cc167821SShuah Khan# list all hot-pluggable CPUs 58cc167821SShuah Khan# 59cc167821SShuah Khanhotpluggable_cpus() 60cc167821SShuah Khan{ 61cc167821SShuah Khan local state=${1:-.\*} 62cc167821SShuah Khan 63cc167821SShuah Khan for cpu in $SYSFS/devices/system/cpu/cpu*; do 64cc167821SShuah Khan if [ -f $cpu/online ] && grep -q $state $cpu/online; then 65cc167821SShuah Khan echo ${cpu##/*/cpu} 66cc167821SShuah Khan fi 67cc167821SShuah Khan done 68cc167821SShuah Khan} 69cc167821SShuah Khan 70cc167821SShuah Khanhotplaggable_offline_cpus() 71cc167821SShuah Khan{ 72cc167821SShuah Khan hotpluggable_cpus 0 73cc167821SShuah Khan} 74cc167821SShuah Khan 75cc167821SShuah Khanhotpluggable_online_cpus() 76cc167821SShuah Khan{ 77cc167821SShuah Khan hotpluggable_cpus 1 78cc167821SShuah Khan} 79cc167821SShuah Khan 80cc167821SShuah Khancpu_is_online() 81cc167821SShuah Khan{ 82cc167821SShuah Khan grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online 83cc167821SShuah Khan} 84cc167821SShuah Khan 85cc167821SShuah Khancpu_is_offline() 86cc167821SShuah Khan{ 87cc167821SShuah Khan grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online 88cc167821SShuah Khan} 89cc167821SShuah Khan 90cc167821SShuah Khanonline_cpu() 91cc167821SShuah Khan{ 92cc167821SShuah Khan echo 1 > $SYSFS/devices/system/cpu/cpu$1/online 93cc167821SShuah Khan} 94cc167821SShuah Khan 95cc167821SShuah Khanoffline_cpu() 96cc167821SShuah Khan{ 97cc167821SShuah Khan echo 0 > $SYSFS/devices/system/cpu/cpu$1/online 98cc167821SShuah Khan} 99cc167821SShuah Khan 100cc167821SShuah Khanonline_cpu_expect_success() 101cc167821SShuah Khan{ 102cc167821SShuah Khan local cpu=$1 103cc167821SShuah Khan 104cc167821SShuah Khan if ! online_cpu $cpu; then 105cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected fail >&2 106972cf4ceSZhao Gongyi retval=1 107cc167821SShuah Khan elif ! cpu_is_online $cpu; then 108cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected offline >&2 109972cf4ceSZhao Gongyi retval=1 110cc167821SShuah Khan fi 111cc167821SShuah Khan} 112cc167821SShuah Khan 113cc167821SShuah Khanonline_cpu_expect_fail() 114cc167821SShuah Khan{ 115cc167821SShuah Khan local cpu=$1 116cc167821SShuah Khan 117cc167821SShuah Khan if online_cpu $cpu 2> /dev/null; then 118cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected success >&2 119195d74beSZhao Gongyi retval=1 120cc167821SShuah Khan elif ! cpu_is_offline $cpu; then 121cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected online >&2 122195d74beSZhao Gongyi retval=1 123cc167821SShuah Khan fi 124cc167821SShuah Khan} 125cc167821SShuah Khan 126cc167821SShuah Khanoffline_cpu_expect_success() 127cc167821SShuah Khan{ 128cc167821SShuah Khan local cpu=$1 129cc167821SShuah Khan 130cc167821SShuah Khan if ! offline_cpu $cpu; then 131cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected fail >&2 132972cf4ceSZhao Gongyi retval=1 133cc167821SShuah Khan elif ! cpu_is_offline $cpu; then 134cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected offline >&2 135972cf4ceSZhao Gongyi retval=1 136cc167821SShuah Khan fi 137cc167821SShuah Khan} 138cc167821SShuah Khan 139cc167821SShuah Khanoffline_cpu_expect_fail() 140cc167821SShuah Khan{ 141cc167821SShuah Khan local cpu=$1 142cc167821SShuah Khan 143cc167821SShuah Khan if offline_cpu $cpu 2> /dev/null; then 144cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected success >&2 145195d74beSZhao Gongyi retval=1 146cc167821SShuah Khan elif ! cpu_is_online $cpu; then 147cc167821SShuah Khan echo $FUNCNAME $cpu: unexpected offline >&2 148195d74beSZhao Gongyi retval=1 149cc167821SShuah Khan fi 150cc167821SShuah Khan} 151cc167821SShuah Khan 152*51d4c851SZhao Gongyionline_all_hot_pluggable_cpus() 153*51d4c851SZhao Gongyi{ 154*51d4c851SZhao Gongyi for cpu in `hotplaggable_offline_cpus`; do 155*51d4c851SZhao Gongyi online_cpu_expect_success $cpu 156*51d4c851SZhao Gongyi done 157*51d4c851SZhao Gongyi} 158*51d4c851SZhao Gongyi 159*51d4c851SZhao Gongyioffline_all_hot_pluggable_cpus() 160*51d4c851SZhao Gongyi{ 161*51d4c851SZhao Gongyi local reserve_cpu=$online_max 162*51d4c851SZhao Gongyi for cpu in `hotpluggable_online_cpus`; do 163*51d4c851SZhao Gongyi # Reserve one cpu oneline at least. 164*51d4c851SZhao Gongyi if [ $cpu -eq $reserve_cpu ];then 165*51d4c851SZhao Gongyi continue 166*51d4c851SZhao Gongyi fi 167*51d4c851SZhao Gongyi offline_cpu_expect_success $cpu 168*51d4c851SZhao Gongyi done 169*51d4c851SZhao Gongyi} 170*51d4c851SZhao Gongyi 171cc167821SShuah Khanallcpus=0 172cc167821SShuah Khanonline_cpus=0 173cc167821SShuah Khanonline_max=0 174cc167821SShuah Khanoffline_cpus=0 175cc167821SShuah Khanoffline_max=0 1762b531b61SColin Ian Kingpresent_cpus=0 1772b531b61SColin Ian Kingpresent_max=0 178cc167821SShuah Khan 179195d74beSZhao Gongyiwhile getopts ah opt; do 180cc167821SShuah Khan case $opt in 181cc167821SShuah Khan a) 182cc167821SShuah Khan allcpus=1 183cc167821SShuah Khan ;; 184cc167821SShuah Khan h) 185195d74beSZhao Gongyi echo "Usage $0 [ -a ]" 186cc167821SShuah Khan echo -e "\t default offline one cpu" 187cc167821SShuah Khan echo -e "\t run with -a option to offline all cpus" 188cc167821SShuah Khan exit 189cc167821SShuah Khan ;; 190cc167821SShuah Khan esac 191cc167821SShuah Khandone 192cc167821SShuah Khan 193cc167821SShuah Khanprerequisite 194cc167821SShuah Khan 195cc167821SShuah Khan# 196cc167821SShuah Khan# Safe test (default) - offline and online one cpu 197cc167821SShuah Khan# 198cc167821SShuah Khanif [ $allcpus -eq 0 ]; then 199cc167821SShuah Khan echo "Limited scope test: one hotplug cpu" 200cc167821SShuah Khan echo -e "\t (leaves cpu in the original state):" 201cc167821SShuah Khan echo -e "\t online to offline to online: cpu $online_max" 202cc167821SShuah Khan offline_cpu_expect_success $online_max 203cc167821SShuah Khan online_cpu_expect_success $online_max 204cc167821SShuah Khan 205cc167821SShuah Khan if [[ $offline_cpus -gt 0 ]]; then 2062354edd0SZhao Gongyi echo -e "\t online to offline to online: cpu $present_max" 2072b531b61SColin Ian King online_cpu_expect_success $present_max 2082b531b61SColin Ian King offline_cpu_expect_success $present_max 2092b531b61SColin Ian King online_cpu $present_max 210cc167821SShuah Khan fi 211972cf4ceSZhao Gongyi exit $retval 212cc167821SShuah Khanelse 213cc167821SShuah Khan echo "Full scope test: all hotplug cpus" 214cc167821SShuah Khan echo -e "\t online all offline cpus" 215cc167821SShuah Khan echo -e "\t offline all online cpus" 216cc167821SShuah Khan echo -e "\t online all offline cpus" 217cc167821SShuah Khanfi 218cc167821SShuah Khan 219*51d4c851SZhao Gongyionline_all_hot_pluggable_cpus 220cc167821SShuah Khan 221*51d4c851SZhao Gongyioffline_all_hot_pluggable_cpus 222cc167821SShuah Khan 223*51d4c851SZhao Gongyionline_all_hot_pluggable_cpus 224cc167821SShuah Khan 225972cf4ceSZhao Gongyiexit $retval 226