1f08c3bdfSopenharmony_ci#!/bin/sh 2f08c3bdfSopenharmony_ci# usage: . cpuset_funcs.sh 3f08c3bdfSopenharmony_ci# functions for cpuset test 4f08c3bdfSopenharmony_ci 5f08c3bdfSopenharmony_ci################################################################################ 6f08c3bdfSopenharmony_ci## ## 7f08c3bdfSopenharmony_ci## Copyright (c) 2009 FUJITSU LIMITED ## 8f08c3bdfSopenharmony_ci## ## 9f08c3bdfSopenharmony_ci## This program is free software; you can redistribute it and#or modify ## 10f08c3bdfSopenharmony_ci## it under the terms of the GNU General Public License as published by ## 11f08c3bdfSopenharmony_ci## the Free Software Foundation; either version 2 of the License, or ## 12f08c3bdfSopenharmony_ci## (at your option) any later version. ## 13f08c3bdfSopenharmony_ci## ## 14f08c3bdfSopenharmony_ci## This program is distributed in the hope that it will be useful, but ## 15f08c3bdfSopenharmony_ci## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ## 16f08c3bdfSopenharmony_ci## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## 17f08c3bdfSopenharmony_ci## for more details. ## 18f08c3bdfSopenharmony_ci## ## 19f08c3bdfSopenharmony_ci## You should have received a copy of the GNU General Public License ## 20f08c3bdfSopenharmony_ci## along with this program; if not, write to the Free Software ## 21f08c3bdfSopenharmony_ci## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ## 22f08c3bdfSopenharmony_ci## ## 23f08c3bdfSopenharmony_ci## Author: Miao Xie <miaox@cn.fujitsu.com> ## 24f08c3bdfSopenharmony_ci## ## 25f08c3bdfSopenharmony_ci################################################################################ 26f08c3bdfSopenharmony_ci 27f08c3bdfSopenharmony_ci. test.sh 28f08c3bdfSopenharmony_ci 29f08c3bdfSopenharmony_cicpu_string="`cat /sys/devices/system/cpu/online`" 30f08c3bdfSopenharmony_ciNR_CPUS=`tst_ncpus` 31f08c3bdfSopenharmony_ci 32f08c3bdfSopenharmony_ciif [ -f "/sys/devices/system/node/has_high_memory" ]; then 33f08c3bdfSopenharmony_ci mem_string="`cat /sys/devices/system/node/has_high_memory`" 34f08c3bdfSopenharmony_cielse 35f08c3bdfSopenharmony_ci mem_string="`cat /sys/devices/system/node/has_normal_memory`" 36f08c3bdfSopenharmony_cifi 37f08c3bdfSopenharmony_ciN_NODES="`echo $mem_string | tr ',' ' '`" 38f08c3bdfSopenharmony_cicount=0 39f08c3bdfSopenharmony_cifinal_node=0 40f08c3bdfSopenharmony_cifor item in $N_NODES; do 41f08c3bdfSopenharmony_ci delta=1 42f08c3bdfSopenharmony_ci if [ "${item#*-*}" != "$item" ]; then 43f08c3bdfSopenharmony_ci delta=$((${item#*-*} - ${item%*-*} + 1)) 44f08c3bdfSopenharmony_ci fi 45f08c3bdfSopenharmony_ci final_node=${item#*-*} 46f08c3bdfSopenharmony_ci count=$((count + $delta)) 47f08c3bdfSopenharmony_cidone 48f08c3bdfSopenharmony_cifinal_node=$((final_node + 1)) 49f08c3bdfSopenharmony_ciN_NODES=$count 50f08c3bdfSopenharmony_ci 51f08c3bdfSopenharmony_cifinal_cpu=0 52f08c3bdfSopenharmony_ciN_CPUS="`echo $cpu_string | tr ',' ' '`" 53f08c3bdfSopenharmony_cifor item in $N_CPUS; do 54f08c3bdfSopenharmony_ci final_cpu=${item#*-*} 55f08c3bdfSopenharmony_cidone 56f08c3bdfSopenharmony_cifinal_cpu=$((final_cpu + 1)) 57f08c3bdfSopenharmony_ci 58f08c3bdfSopenharmony_ciCPUSET="/dev/cpuset" 59f08c3bdfSopenharmony_ciCPUSET_TMP="/tmp/cpuset_tmp" 60f08c3bdfSopenharmony_ciCLONE_CHILDREN="/dev/cpuset/cgroup.clone_children" 61f08c3bdfSopenharmony_ciCHILDREN_VALUE="0" 62f08c3bdfSopenharmony_ciHOTPLUG_CPU="1" 63f08c3bdfSopenharmony_ciSCHED_LB="/dev/cpuset/cpuset.sched_load_balance" 64f08c3bdfSopenharmony_ciSCHED_LB_VALUE="0" 65f08c3bdfSopenharmony_ci 66f08c3bdfSopenharmony_cicpuset_log() 67f08c3bdfSopenharmony_ci{ 68f08c3bdfSopenharmony_ci tst_resm TINFO "$*" 69f08c3bdfSopenharmony_ci} 70f08c3bdfSopenharmony_ci 71f08c3bdfSopenharmony_ci# cpuset_log_error <error_file> 72f08c3bdfSopenharmony_cicpuset_log_error() 73f08c3bdfSopenharmony_ci{ 74f08c3bdfSopenharmony_ci local error_message= 75f08c3bdfSopenharmony_ci 76f08c3bdfSopenharmony_ci while read error_message 77f08c3bdfSopenharmony_ci do 78f08c3bdfSopenharmony_ci cpuset_log "$error_message" 79f08c3bdfSopenharmony_ci done < "$1" 80f08c3bdfSopenharmony_ci} 81f08c3bdfSopenharmony_ci 82f08c3bdfSopenharmony_cincpus_check() 83f08c3bdfSopenharmony_ci{ 84f08c3bdfSopenharmony_ci if [ $NR_CPUS -lt $1 ]; then 85f08c3bdfSopenharmony_ci tst_brkm TCONF "The total of CPUs is less than $1" 86f08c3bdfSopenharmony_ci fi 87f08c3bdfSopenharmony_ci # check online cpus whether match 0-num 88f08c3bdfSopenharmony_ci if [ $final_cpu -eq $NR_CPUS ]; then 89f08c3bdfSopenharmony_ci tst_resm TINFO "CPUs are numbered continuously starting at 0 ($cpu_string)" 90f08c3bdfSopenharmony_ci else 91f08c3bdfSopenharmony_ci tst_brkm TCONF "CPUs are not numbered continuously starting at 0 ($cpu_string)" 92f08c3bdfSopenharmony_ci fi 93f08c3bdfSopenharmony_ci} 94f08c3bdfSopenharmony_ci 95f08c3bdfSopenharmony_cinnodes_check() 96f08c3bdfSopenharmony_ci{ 97f08c3bdfSopenharmony_ci if [ $N_NODES -lt $1 ]; then 98f08c3bdfSopenharmony_ci tst_brkm TCONF "The total of nodes is less than $1" 99f08c3bdfSopenharmony_ci fi 100f08c3bdfSopenharmony_ci # check online nodes whether match 0-num 101f08c3bdfSopenharmony_ci if [ $final_node -eq $N_NODES ]; then 102f08c3bdfSopenharmony_ci tst_resm TINFO "Nodes are numbered continuously starting at 0 ($mem_string)" 103f08c3bdfSopenharmony_ci else 104f08c3bdfSopenharmony_ci tst_brkm TCONF "Nodes are not numbered continuously starting at 0 ($mem_string)" 105f08c3bdfSopenharmony_ci fi 106f08c3bdfSopenharmony_ci} 107f08c3bdfSopenharmony_ci 108f08c3bdfSopenharmony_ciuser_check() 109f08c3bdfSopenharmony_ci{ 110f08c3bdfSopenharmony_ci if [ $(id -u) != 0 ]; then 111f08c3bdfSopenharmony_ci tst_brkm TCONF "Test must be run as root" 112f08c3bdfSopenharmony_ci fi 113f08c3bdfSopenharmony_ci} 114f08c3bdfSopenharmony_ci 115f08c3bdfSopenharmony_cicpuset_check() 116f08c3bdfSopenharmony_ci{ 117f08c3bdfSopenharmony_ci if [ -f /proc/cgroups ]; then 118f08c3bdfSopenharmony_ci CPUSET_CONTROLLER=`grep -w cpuset /proc/cgroups | cut -f1` 119f08c3bdfSopenharmony_ci CPUSET_CONTROLLER_VALUE=`grep -w cpuset /proc/cgroups | cut -f4` 120f08c3bdfSopenharmony_ci 121f08c3bdfSopenharmony_ci if [ "$CPUSET_CONTROLLER" = "cpuset" ] && [ "$CPUSET_CONTROLLER_VALUE" = "1" ] 122f08c3bdfSopenharmony_ci then 123f08c3bdfSopenharmony_ci return 0 124f08c3bdfSopenharmony_ci fi 125f08c3bdfSopenharmony_ci fi 126f08c3bdfSopenharmony_ci 127f08c3bdfSopenharmony_ci tst_brkm TCONF "Cpuset is not supported" 128f08c3bdfSopenharmony_ci} 129f08c3bdfSopenharmony_ci 130f08c3bdfSopenharmony_cimachine_check() 131f08c3bdfSopenharmony_ci{ 132f08c3bdfSopenharmony_ci if tst_virt_hyperv; then 133f08c3bdfSopenharmony_ci tst_brkm TCONF "Microsoft Hyper-V detected, no support for CPU hotplug" 134f08c3bdfSopenharmony_ci fi 135f08c3bdfSopenharmony_ci} 136f08c3bdfSopenharmony_ci 137f08c3bdfSopenharmony_ci# optional parameters (pass both or none of them): 138f08c3bdfSopenharmony_ci# $1 - required number of cpus (default 2) 139f08c3bdfSopenharmony_ci# $2 - required number of memory nodes (default 2) 140f08c3bdfSopenharmony_cicheck() 141f08c3bdfSopenharmony_ci{ 142f08c3bdfSopenharmony_ci user_check 143f08c3bdfSopenharmony_ci 144f08c3bdfSopenharmony_ci cpuset_check 145f08c3bdfSopenharmony_ci 146f08c3bdfSopenharmony_ci ncpus_check ${1:-2} 147f08c3bdfSopenharmony_ci 148f08c3bdfSopenharmony_ci nnodes_check ${2:-2} 149f08c3bdfSopenharmony_ci 150f08c3bdfSopenharmony_ci machine_check 151f08c3bdfSopenharmony_ci} 152f08c3bdfSopenharmony_ci 153f08c3bdfSopenharmony_ci# Create /dev/cpuset & mount the cgroup file system with cpuset 154f08c3bdfSopenharmony_ci# clean any group created eralier (if any) 155f08c3bdfSopenharmony_cisetup() 156f08c3bdfSopenharmony_ci{ 157f08c3bdfSopenharmony_ci if [ -e "$CPUSET" ] 158f08c3bdfSopenharmony_ci then 159f08c3bdfSopenharmony_ci tst_resm TWARN "$CPUSET already exist.. overwriting" 160f08c3bdfSopenharmony_ci cleanup || tst_brkm TFAIL "Can't cleanup... Exiting" 161f08c3bdfSopenharmony_ci fi 162f08c3bdfSopenharmony_ci 163f08c3bdfSopenharmony_ci mkdir -p "$CPUSET_TMP" 164f08c3bdfSopenharmony_ci mkdir "$CPUSET" 165f08c3bdfSopenharmony_ci mount -t cgroup -o cpuset cpuset "$CPUSET" 2> /dev/null 166f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 167f08c3bdfSopenharmony_ci cleanup 168f08c3bdfSopenharmony_ci tst_brkm TFAIL "Could not mount cgroup filesystem with"\ 169f08c3bdfSopenharmony_ci " cpuset on $CPUSET..Exiting test" 170f08c3bdfSopenharmony_ci fi 171f08c3bdfSopenharmony_ci 172f08c3bdfSopenharmony_ci CHILDREN_VALUE="`cat $CLONE_CHILDREN`" 173f08c3bdfSopenharmony_ci SCHED_LB_VALUE="`cat $SCHED_LB`" 174f08c3bdfSopenharmony_ci} 175f08c3bdfSopenharmony_ci 176f08c3bdfSopenharmony_ci# Write the cleanup function 177f08c3bdfSopenharmony_cicleanup() 178f08c3bdfSopenharmony_ci{ 179f08c3bdfSopenharmony_ci grep "$CPUSET" /proc/mounts >/dev/null 2>&1 || { 180f08c3bdfSopenharmony_ci rm -rf "$CPUSET" >/dev/null 2>&1 181f08c3bdfSopenharmony_ci return 0 182f08c3bdfSopenharmony_ci } 183f08c3bdfSopenharmony_ci 184f08c3bdfSopenharmony_ci echo $CHILDREN_VALUE > $CLONE_CHILDREN 185f08c3bdfSopenharmony_ci echo $SCHED_LB_VALUE > $SCHED_LB 186f08c3bdfSopenharmony_ci 187f08c3bdfSopenharmony_ci find "$CPUSET" -type d | sort | sed -n '2,$p' | tac | while read -r subdir 188f08c3bdfSopenharmony_ci do 189f08c3bdfSopenharmony_ci while read pid 190f08c3bdfSopenharmony_ci do 191f08c3bdfSopenharmony_ci /bin/kill -9 $pid > /dev/null 2>&1 192f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 193f08c3bdfSopenharmony_ci tst_brkm TFAIL "Couldn't kill task - "\ 194f08c3bdfSopenharmony_ci "$pid in the cpuset" 195f08c3bdfSopenharmony_ci fi 196f08c3bdfSopenharmony_ci done < "$subdir/tasks" 197f08c3bdfSopenharmony_ci rmdir "$subdir" 198f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 199f08c3bdfSopenharmony_ci tst_brkm TFAIL "Couldn't remove subdir - " 200f08c3bdfSopenharmony_ci "$subdir in the cpuset" 201f08c3bdfSopenharmony_ci fi 202f08c3bdfSopenharmony_ci done 203f08c3bdfSopenharmony_ci 204f08c3bdfSopenharmony_ci umount "$CPUSET" 205f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 206f08c3bdfSopenharmony_ci tst_brkm TFAIL "Couldn't umount cgroup filesystem with"\ 207f08c3bdfSopenharmony_ci " cpuset on $CPUSET..Exiting test" 208f08c3bdfSopenharmony_ci fi 209f08c3bdfSopenharmony_ci rmdir "$CPUSET" > /dev/null 2>&1 210f08c3bdfSopenharmony_ci rm -rf "$CPUSET_TMP" > /dev/null 2>&1 211f08c3bdfSopenharmony_ci} 212f08c3bdfSopenharmony_ci 213f08c3bdfSopenharmony_ci# set the cpuset's parameter 214f08c3bdfSopenharmony_ci# cpuset_set <cpusetpath> <cpus> <mems> <load_balance> 215f08c3bdfSopenharmony_cicpuset_set() 216f08c3bdfSopenharmony_ci{ 217f08c3bdfSopenharmony_ci local path="$1" 218f08c3bdfSopenharmony_ci mkdir -p "$path" 219f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 220f08c3bdfSopenharmony_ci return 1 221f08c3bdfSopenharmony_ci fi 222f08c3bdfSopenharmony_ci 223f08c3bdfSopenharmony_ci local cpus="$2" 224f08c3bdfSopenharmony_ci local mems="$3" 225f08c3bdfSopenharmony_ci local load_balance="$4" 226f08c3bdfSopenharmony_ci 227f08c3bdfSopenharmony_ci if [ "$path" != "$CPUSET" ]; then 228f08c3bdfSopenharmony_ci if [ "$cpus" != "-" ]; then 229f08c3bdfSopenharmony_ci /bin/echo $cpus > $path/cpuset.cpus 230f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 231f08c3bdfSopenharmony_ci return 1 232f08c3bdfSopenharmony_ci fi 233f08c3bdfSopenharmony_ci fi 234f08c3bdfSopenharmony_ci 235f08c3bdfSopenharmony_ci /bin/echo $mems > $path/cpuset.mems 236f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 237f08c3bdfSopenharmony_ci return 1 238f08c3bdfSopenharmony_ci fi 239f08c3bdfSopenharmony_ci fi 240f08c3bdfSopenharmony_ci 241f08c3bdfSopenharmony_ci /bin/echo $load_balance > $path/cpuset.sched_load_balance 242f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 243f08c3bdfSopenharmony_ci return 1 244f08c3bdfSopenharmony_ci fi 245f08c3bdfSopenharmony_ci} 246f08c3bdfSopenharmony_ci 247f08c3bdfSopenharmony_ci# cpu_hotplug cpu_id offline/online 248f08c3bdfSopenharmony_cicpu_hotplug() 249f08c3bdfSopenharmony_ci{ 250f08c3bdfSopenharmony_ci if [ "$2" = "online" ]; then 251f08c3bdfSopenharmony_ci /bin/echo 1 > "/sys/devices/system/cpu/cpu$1/online" 252f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 253f08c3bdfSopenharmony_ci return 1 254f08c3bdfSopenharmony_ci fi 255f08c3bdfSopenharmony_ci elif [ "$2" = "offline" ]; then 256f08c3bdfSopenharmony_ci /bin/echo 0 > "/sys/devices/system/cpu/cpu$1/online" 257f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 258f08c3bdfSopenharmony_ci return 1 259f08c3bdfSopenharmony_ci fi 260f08c3bdfSopenharmony_ci fi 261f08c3bdfSopenharmony_ci} 262f08c3bdfSopenharmony_ci 263f08c3bdfSopenharmony_ci# setup_test_environment <online | offline> 264f08c3bdfSopenharmony_ci# online - online a CPU in testing, so we must offline a CPU first 265f08c3bdfSopenharmony_ci# offline - offline a CPU in testing, we needn't do anything 266f08c3bdfSopenharmony_cisetup_test_environment() 267f08c3bdfSopenharmony_ci{ 268f08c3bdfSopenharmony_ci if [ "$1" = "online" ]; then 269f08c3bdfSopenharmony_ci cpu_hotplug $HOTPLUG_CPU offline 270f08c3bdfSopenharmony_ci if [ $? -ne 0 ]; then 271f08c3bdfSopenharmony_ci return 1 272f08c3bdfSopenharmony_ci fi 273f08c3bdfSopenharmony_ci fi 274f08c3bdfSopenharmony_ci} 275f08c3bdfSopenharmony_ci 276f08c3bdfSopenharmony_cicpu_hotplug_cleanup() 277f08c3bdfSopenharmony_ci{ 278f08c3bdfSopenharmony_ci local cpus_array="$(seq -s' ' 1 $((NR_CPUS-1)))" 279f08c3bdfSopenharmony_ci local cpuid= 280f08c3bdfSopenharmony_ci for cpuid in $cpus_array 281f08c3bdfSopenharmony_ci do 282f08c3bdfSopenharmony_ci local file="/sys/devices/system/cpu/cpu$cpuid/online" 283f08c3bdfSopenharmony_ci local offline="$(cat $file)" 284f08c3bdfSopenharmony_ci if [ $offline -eq 0 ]; then 285f08c3bdfSopenharmony_ci cpu_hotplug $cpuid "online" 286f08c3bdfSopenharmony_ci fi 287f08c3bdfSopenharmony_ci done 288f08c3bdfSopenharmony_ci} 289f08c3bdfSopenharmony_ci 290