#!/bin/sh
#
# Test Case 5 - sar
#
export TCID="cpuhotplug05"
export TST_TOTAL=1
export LC_TIME="POSIX"
# Includes:
. test.sh
. cpuhotplug_testsuite.sh
. cpuhotplug_hotplug.sh
cat <<EOF
Name: $TCID
Date: `date`
Desc: Does sar behave properly during CPU hotplug events?
EOF
usage()
{
cat << EOF
usage: $0 -c cpu -l loop -d directory
OPTIONS
-c cpu which is specified for testing
-l number of cycle test
-d directory used to lay file
EOF
exit 1
}
do_clean()
{
pid_is_valid ${SAR_PID} && kill_pid ${SAR_PID}
online_cpu "$CPU_TO_TEST"
}
get_field()
{
echo "$1" | awk "{print \$$2}"
}
while getopts c:l:d: OPTION; do
case $OPTION in
c)
CPU_TO_TEST=$OPTARG;;
l)
HOTPLUG05_LOOPS=$OPTARG;;
d)
TMP=$OPTARG;;
?)
usage;;
esac
done
LOOP_COUNT=1
tst_check_cmds sar
if [ $(get_present_cpus_num) -lt 2 ]; then
tst_brkm TCONF "system doesn't have required CPU hotplug support"
fi
if [ -z "$CPU_TO_TEST" ]; then
tst_brkm TBROK "usage: ${0##*} <CPU to offline>"
fi
# Validate the specified CPU is available
if ! cpu_is_valid "${CPU_TO_TEST}" ; then
tst_brkm TCONF "cpu${CPU_TO_TEST} doesn't support hotplug"
fi
# Check that the specified CPU is offline; if not, offline it
if cpu_is_online "${CPU_TO_TEST}" ; then
if ! offline_cpu ${CPU_TO_TEST} ; then
tst_brkm TBROK "CPU${CPU_TO_TEST} cannot be offlined"
fi
fi
TST_CLEANUP=do_clean
LOG_FILE="$TMP/log_$$"
until [ $LOOP_COUNT -gt $HOTPLUG05_LOOPS ]; do
# Start up SAR and give it a couple cycles to run
sar 1 0 >/dev/null 2>&1 &
sleep 2
# "sar 1 0" is supported before 'sysstat-8.1.4(include sar)',
# after that use "sar 1" instead of. Use 'ps -C sar' to check.
if ps -C sar >/dev/null 2>&1; then
pkill sar
sar -P "$CPU_TO_TEST" 1 0 > "$LOG_FILE" &
else
sar -P "$CPU_TO_TEST" 1 > "$LOG_FILE" &
fi
sleep 2
SAR_PID=$!
# Since the CPU is offline, SAR should display all the 6 fields
# of CPU statistics as '0.00'
offline_status=$(tail -n 1 "$LOG_FILE")
if [ -z "$offline_status" ]; then
tst_brkm TBROK "SAR output file is empty"
fi
for i in $(seq 3 8); do
field=$(get_field "$offline_status" "$i")
if [ "$field" != "0.00" ]; then
tst_brkm TBROK "Field $i is '$field', '0.00' expected"
fi
done
# Online the CPU
if ! online_cpu ${CPU_TO_TEST}; then
tst_brkm TBROK "CPU${CPU_TO_TEST} cannot be onlined"
fi
sleep 2
# Check that SAR registered the change in CPU online/offline states
online_status=$(tail -n 1 "$LOG_FILE")
check_passed=0
for i in $(seq 3 8); do
field_online=$(get_field "$online_status" "$i")
if [ "$field_online" != "0.00" ]; then
check_passed=1
break
fi
done
if [ $check_passed -eq 0 ]; then
tst_resm TFAIL "No change in the CPU statistics"
tst_exit
fi
offline_cpu ${CPU_TO_TEST}
kill_pid ${SAR_PID}
LOOP_COUNT=$((LOOP_COUNT+1))
done
tst_resm TPASS "SAR updated statistics after the CPU was turned on."
tst_exit