blob: 6923756614a5493dd05c2463602e8ba025e217b5 [file] [log] [blame]
#!/bin/sh
#
# Test Case 3
#
HOTPLUG03_LOOPS=${HOTPLUG03_LOOPS:-${LOOPS}}
export TST_COUNT=1
export TST_TOTAL=${HOTPLUG03_LOOPS:-1}
export TCID="hotplug03"
CPU_TO_TEST=${1#cpu}
if [ -z $CPU_TO_TEST ]; then
echo "usage: ${0##*} <CPU to online>"
exit 1
fi
# Includes:
LHCS_PATH=${LHCS_PATH:-${LTPROOT:+$LTPROOT/testcases/bin/cpu_hotplug}}
. $LHCS_PATH/include/testsuite.fns
. $LHCS_PATH/include/hotplug.fns
cat <<EOF
Name: $TCID
Date: `date`
Desc: Do tasks get scheduled to a newly on-lined CPU?
EOF
# Verify the specified CPU exists
if ! cpu_is_valid "${CPU_TO_TEST}" ; then
tst_resm TCONF "CPU${CPU_TO_TEST} not found"
exit_clean 1
fi
# do_clean()
#
# Callback to be executed when script exits from a user interrupt
# or regular program termination
#
do_clean()
{
# Kill all the processes we started up and get rid of their pid files
if [ -e "/var/run/hotplug4_$$.pid" ]; then
for i in `cat /var/run/hotplug4_$$.pid`; do
kill_pid $i
done
rm /var/run/hotplug4_$$.pid
fi
# Turn off the CPUs that were off before the test start
until [ $cpu -eq 0 ];do
offline_cpu $(eval "echo \$on_${cpu}")
: $(( cpu -= 1 ))
done
}
until [ $TST_COUNT -gt $TST_TOTAL ]; do
cpu=0
number_of_cpus=0
# Turns on all CPUs and saves their states
for i in $( get_all_cpus ); do
if ! online_cpu $1; then
: $(( cpu += 1 ))
eval "on_${cpu}=$i"
fi
: $(( number_of_cpus += 1 ))
done
if ! offline_cpu ${CPU_TO_TEST} ; then
tst_resm TBAIL "CPU${CPU_TO_TEST} cannot be offlined"
exit_clean 1
fi
# Start up a number of processes equal to twice the number of
# CPUs we have. This is to help ensure we've got enough processes
# that at least one will migrate to the new CPU. Store the PIDs
# so we can kill them later.
: $(( number_of_cpus *= 2 ))
until [ $number_of_cpus -eq 0 ]; do
$LHCS_PATH/tools/do_spin_loop > /dev/null 2>&1 &
echo $! >> /var/run/hotplug4_$$.pid
: $(( number_of_cpus -= 1 ))
done
ps aux | head -n 1
ps aux | grep do_spin_loop
# Online the CPU
tst_resm TINFO "Onlining CPU ${CPU_TO_TEST}"
online_cpu ${CPU_TO_TEST}
RC=$?
if [ $RC -eq 0 ]; then
tst_resm TFAIL "CPU${CPU_TO_TEST} cannot be onlined"
exit_clean 1
fi
sleep 1
# Verify at least one process has migrated to the new CPU
ps -o psr -o command --no-headers -C do_spin_loop
RC=$?
NUM=`ps -o psr -o command --no-headers -C do_spin_loop | sed -e "s/^ *//" | cut -d' ' -f 1 | grep "^${CPU_TO_TEST}$" | wc -l`
if [ $RC -eq 0 ]; then
tst_resm TBROK "No do_spin_loop processes found on any processor"
elif [ $NUM -lt 1 ]; then
tst_resm TFAIL "No do_spin_loop processes found on CPU${CPU_TO_TEST}"
else
tst_resm TPASS "$NUM do_spin_loop processes found on CPU${CPU_TO_TEST}"
fi
do_clean
: $(( TST_COUNT +=1 ))
done
exit_clean