Signed-off-by: Xing Gu <[email protected]> --- testcases/kernel/hotplug/cpu_hotplug/ChangeLog | 6 +- testcases/kernel/hotplug/cpu_hotplug/README | 6 +- .../hotplug/cpu_hotplug/functional/cpuhotplug01.sh | 12 +- .../hotplug/cpu_hotplug/functional/cpuhotplug02.sh | 6 +- .../hotplug/cpu_hotplug/functional/cpuhotplug03.sh | 23 ++- .../hotplug/cpu_hotplug/functional/cpuhotplug04.sh | 4 +- .../hotplug/cpu_hotplug/functional/cpuhotplug05.sh | 4 +- .../hotplug/cpu_hotplug/functional/cpuhotplug06.sh | 4 +- .../hotplug/cpu_hotplug/functional/cpuhotplug07.sh | 6 +- .../cpu_hotplug/include/cpuhotplug_hotplug.sh | 203 +++++++++++++++++++++ .../cpu_hotplug/include/cpuhotplug_testsuite.sh | 171 +++++++++++++++++ .../kernel/hotplug/cpu_hotplug/include/hotplug.fns | 202 -------------------- .../hotplug/cpu_hotplug/include/testsuite.fns | 170 ----------------- .../tools/cpuhotplug_do_disk_write_loop | 19 ++ .../cpu_hotplug/tools/cpuhotplug_do_kcompile_loop | 21 +++ .../cpu_hotplug/tools/cpuhotplug_do_spin_loop | 8 + .../tools/cpuhotplug_report_proc_interrupts | 53 ++++++ .../hotplug/cpu_hotplug/tools/do_disk_write_loop | 19 -- .../hotplug/cpu_hotplug/tools/do_kcompile_loop | 21 --- .../kernel/hotplug/cpu_hotplug/tools/do_spin_loop | 8 - .../cpu_hotplug/tools/report_proc_interrupts | 53 ------ 21 files changed, 514 insertions(+), 505 deletions(-) create mode 100644 testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_hotplug.sh create mode 100644 testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_testsuite.sh delete mode 100644 testcases/kernel/hotplug/cpu_hotplug/include/hotplug.fns delete mode 100644 testcases/kernel/hotplug/cpu_hotplug/include/testsuite.fns create mode 100644 testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_disk_write_loop create mode 100644 testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_kcompile_loop create mode 100644 testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_spin_loop create mode 100644 testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_report_proc_interrupts delete mode 100755 testcases/kernel/hotplug/cpu_hotplug/tools/do_disk_write_loop delete mode 100755 testcases/kernel/hotplug/cpu_hotplug/tools/do_kcompile_loop delete mode 100755 testcases/kernel/hotplug/cpu_hotplug/tools/do_spin_loop delete mode 100755 testcases/kernel/hotplug/cpu_hotplug/tools/report_proc_interrupts
diff --git a/testcases/kernel/hotplug/cpu_hotplug/ChangeLog b/testcases/kernel/hotplug/cpu_hotplug/ChangeLog index 5e6b9df..bf1d979 100644 --- a/testcases/kernel/hotplug/cpu_hotplug/ChangeLog +++ b/testcases/kernel/hotplug/cpu_hotplug/ChangeLog @@ -1,15 +1,15 @@ 2006-09-14 Bryce Harrington <[email protected]> * hotplug03.sh: Fixing bug in return value of psr command, that was getting lost due to a subsequent command - * hotplug07.sh: Fixing path issue for do_kcompile_loop + * hotplug07.sh: Fixing path issue for cpuhotplug_do_kcompile_loop * hotplug07.sh: Automatic kernel source tree detection * hotplug07.sh: Reordering statements to suppress a warning - * do_kcompile_loop: Adding support for chdir to kernel dir + * cpuhotplug_do_kcompile_loop: Adding support for chdir to kernel dir 2006-07-06 Bryce Harrington <[email protected]> * hotplug07.sh: Fixing permissions * hotplug07.sh: Updating includes - * include/hotplug.fns: Fixing error where files in + * include/cpuhotplug_hotplug.sh: Fixing error where files in /sys/devices/system/cpu were detected as (invalid) cpus. 2006-03-09 Bryce Harrington <[email protected]> diff --git a/testcases/kernel/hotplug/cpu_hotplug/README b/testcases/kernel/hotplug/cpu_hotplug/README index 0199a36..54fbd1a 100644 --- a/testcases/kernel/hotplug/cpu_hotplug/README +++ b/testcases/kernel/hotplug/cpu_hotplug/README @@ -23,15 +23,15 @@ can be run in place using the above script. About Hotplug CPU ================= The logic used to operate the hotplug features in Linux are implemented -in the file includes/hotplug.fns. These include functions for onlining -and offlining CPUs, determining if a given CPU is valid and/or online, +in the file includes/cpuhotplug_hotplug.sh. These include functions for +onlining and offlining CPUs, determining if a given CPU is valid and/or online, getting lists of CPUs that are available, online, and offline, and managing IRQ's and affinities as they relate to CPUs. About the Test Suite ==================== -See includes/testsuite.fns for some general purpose routines for +See includes/cpuhotplug_testsuite.sh for some general purpose routines for implementing a test suite. These include process management, timing, and interupt handling and cleanup. diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug01.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug01.sh index 07379dc..9e05cce 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug01.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug01.sh @@ -18,8 +18,8 @@ fi # Includes: LHCS_PATH=${LHCS_PATH:-$LTPROOT/testcases/bin/cpu_hotplug} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID @@ -38,7 +38,8 @@ TM_OFFLINE=${HOTPLUG01_TM_OFFLINE:-1} TM_DLY=${HOTPLUG01_TM_DLY:-6} if ! type -P perl > /dev/null; then - tst_brk TCONF "analysis script - report_proc_interrupts - requires perl" + tst_brk TCONF "analysis script - cpuhotplug_report_proc_interrupts - \ + requires perl" exit 1 fi @@ -123,7 +124,7 @@ do_online() } # Start up a process that writes to disk; keep track of its PID -$LHCS_PATH/tools/do_disk_write_loop > /dev/null 2>&1 & +$LHCS_PATH/tools/cpuhotplug_do_disk_write_loop > /dev/null 2>&1 & WRL_ID=$! RC=0 @@ -172,7 +173,8 @@ do # Print out a report showing the changes in IRQs echo echo - $LHCS_PATH/tools/report_proc_interrupts "$IRQ_START" "$IRQ_END" + $LHCS_PATH/tools/cpuhotplug_report_proc_interrupts "$IRQ_START" \ + "$IRQ_END" echo if [ $RC -eq 0 ] ; then diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug02.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug02.sh index 3f9400b..56eead9 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug02.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug02.sh @@ -16,8 +16,8 @@ fi # Includes: LHCS_PATH=${LHCS_PATH:-$LTPROOT/testcases/bin/cpu_hotplug} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID @@ -27,7 +27,7 @@ Desc: What happens to a process when its CPU is offlined? EOF # Start up a process that just uses CPU cycles -$LHCS_PATH/tools/do_spin_loop > /dev/null& +$LHCS_PATH/tools/cpuhotplug_do_spin_loop > /dev/null& SPIN_LOOP_PID=$! # Validate the specified CPU exists diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug03.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug03.sh index 516a21f..60343d5 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug03.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug03.sh @@ -16,8 +16,8 @@ fi # Includes: LHCS_PATH=${LHCS_PATH:-${LTPROOT:+$LTPROOT/testcases/bin/cpu_hotplug}} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID @@ -85,13 +85,13 @@ until [ $TST_COUNT -gt $TST_TOTAL ]; do # 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 & + $LHCS_PATH/tools/cpuhotplug_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 + ps aux | grep cpuhotplug_do_spin_loop # Online the CPU tst_resm TINFO "Onlining CPU ${CPU_TO_TEST}" @@ -105,15 +105,20 @@ until [ $TST_COUNT -gt $TST_TOTAL ]; do sleep 1 # Verify at least one process has migrated to the new CPU - ps -o psr -o command --no-headers -C do_spin_loop + ps -o psr -o command --no-headers -C cpuhotplug_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` + NUM=`ps -o psr -o command --no-headers -C cpuhotplug_do_spin_loop | \ + sed -e "s/^ *//" | cut -d' ' -f 1 | grep "^${CPU_TO_TEST}$" | \ + wc -l` if [ $RC -ne 0 ]; then - tst_resm TBROK "No do_spin_loop processes found on any processor" + tst_resm TBROK "No cpuhotplug_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}" + tst_resm TFAIL "No cpuhotplug_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}" + tst_resm TPASS "$NUM cpuhotplug_do_spin_loop processes found \ + on CPU${CPU_TO_TEST}" fi do_clean diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug04.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug04.sh index 3e84354..0204d66 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug04.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug04.sh @@ -10,8 +10,8 @@ export TST_TOTAL=${HOTPLUG04_LOOPS:-1} # Includes: LHCS_PATH=${LHCS_PATH:-${LTPROOT:+$LTPROOT/testcases/bin/cpu_hotplug}} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug05.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug05.sh index e64b91c..9b1cdbc 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug05.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug05.sh @@ -17,8 +17,8 @@ fi # Includes: LHCS_PATH=${LHCS_PATH:-${LTPROOT:+$LTPROOT/testcases/bin/cpu_hotplug}} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug06.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug06.sh index 0778fa0..bb80746 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug06.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug06.sh @@ -16,8 +16,8 @@ fi # Includes: LHCS_PATH=${LHCS_PATH:-${LTPROOT:+$LTPROOT/testcases/bin/cpu_hotplug}} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID diff --git a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug07.sh b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug07.sh index cd45677..c77ccfb 100755 --- a/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug07.sh +++ b/testcases/kernel/hotplug/cpu_hotplug/functional/cpuhotplug07.sh @@ -12,8 +12,8 @@ export TST_TOTAL=${HOTPLUG07_LOOPS:-1} # Includes: LHCS_PATH=${LHCS_PATH:-${LTPROOT:+$LTPROOT/testcases/bin/cpu_hotplug}} -. $LHCS_PATH/include/testsuite.fns -. $LHCS_PATH/include/hotplug.fns +. $LHCS_PATH/include/cpuhotplug_testsuite.sh +. $LHCS_PATH/include/cpuhotplug_hotplug.sh cat <<EOF Name: $TCID @@ -39,7 +39,7 @@ do_clean() kill_pid ${KCOMPILE_LOOP_PID} } -$LHCS_PATH/tools/do_kcompile_loop $KERNEL_DIR > /dev/null 2>&1 & +$LHCS_PATH/tools/cpuhotplug_do_kcompile_loop $KERNEL_DIR > /dev/null 2>&1 & KCOMPILE_LOOP_PID=$! tst_resm TINFO "initial CPU affinity for kernel compile is: $(get_affinity_mask ${KCOMPILE_LOOP_PID})" diff --git a/testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_hotplug.sh b/testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_hotplug.sh new file mode 100644 index 0000000..8ded6bb --- /dev/null +++ b/testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_hotplug.sh @@ -0,0 +1,203 @@ +#!/bin/sh + +# cpuhotplug_hotplug.sh - Collection of functions for hotplugging +# operations. + +# Routines in this library are set up to allow timing to be done +# by defining $TIME to a timing command. +TIME=${TIME:-""} + +# get_all_irqs() +# +# Gets list of all available IRQs in the system +# +get_all_irqs() +{ + echo `egrep [0-9]+: /proc/interrupts | cut -d ':' -f 1` + return +} + +# migrate_irq(CPU, IRQS) +# +# Sets the smp_affinity for the list of $IRQS to the given +# CPU number +# +migrate_irq() +{ + CPU=${1#cpu} + MASK=$((1<<${CPU})) + IRQS=$2 + for irq in ${IRQS} + do + echo $MASK > /proc/irq/${irq}/smp_affinity || \ + tst_resm TINFO "It is NOT permitted to change the IRQ $irq smp_affinity" + done +} + + +# get_affinity(PID) +# +# Echos the CPU affinity for the given process ID to stdout +# +get_affinity_mask() +{ + AFFINITY=`taskset -p ${1}` + echo ${AFFINITY} + return +} + +# set_affinity(PID, CPU) +# +# Sets the affinity for the given PID to the specified CPU. +# +set_affinity() +{ + PID="$1" + CPU="$2" + MASK=$((1<<${CPU_TO_TEST})) + `taskset -p ${MASK} ${PID} > /dev/null 2>&1` + return $? +} + +# online_cpu(CPU) +# +# Onlines the given CPU. Returns a true value if it was able +# to perform the online operation successfully, false otherwise. +# +# $CPU should either be a specific number like 4, or the cpu name, +# as in 'cpu4'. +# +online_cpu() +{ + CPU=${1#cpu} + if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then + return 1 + fi + $TIME echo 1 > /sys/devices/system/cpu/cpu${CPU}/online + RC=$? + report_timing "Online cpu ${CPU}" + return $RC +} + + +# offline_cpu(CPU) +# +# Offlines the given CPU. Returns a true value if it was able +# to perform the offline operation successfully, false otherwise. +# +offline_cpu() +{ + CPU=${1#cpu} + if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then + return 1 + fi + $TIME echo 0 > /sys/devices/system/cpu/cpu${CPU}/online + RC=$? + report_timing "Offline cpu ${CPU}" + return $RC +} + + +# get_all_cpus() +# +# Prints a list of all available CPUs, regardless of whether they're +# currently online or offline. +# +# This routine will work even if the CPUs are not hotpluggable, however +# it requires you have sysfs enabled in the kernel. +# +get_all_cpus() +{ + [ -d /sys/devices/system/cpu/cpu0 ] || return 1 + ls -dr /sys/devices/system/cpu/cpu[0-9]* | \ + sed "s/\/sys\/devices\/system\/cpu\///g" || return 2 +} + + +# get_all_cpu_states() +# +# Collects the current online/offline state of CPUs in the +# system, printing it in a format that can be passed to +# set_all_cpu_states() later. +# +get_all_cpu_states() +{ + echo `cd /sys/devices/system/cpu/ && grep '' */online | \ + sed -e 's/\/online//'` + return +} + +# set_all_cpu_states(STATES) +# +# Sets all of the CPU states according to $STATE, which must be +# of the form "cpuX:Y", where X is the CPU number and Y its state. +# Each must be on a separate line. +# +set_all_cpu_states() +{ + for cpu_state in $STATE; do + cpu=`echo $c | cut -d: -f 1` + state=`echo $c | cut -d: -f 1` + if [ $state = 1 ]; then + echo "# Re-onlining $cpu" + online_cpu $cpu + else + echo "# Re-offlining $cpu" + offline_cpu $cpu + fi + done +} + + +# get_online_cpus() +# +# Prints a list of all CPUs currently online. This function only +# works if the system's CPUs have hotplug capabilities +# +get_online_cpus() +{ + echo `cd /sys/devices/system/cpu/ && grep 1 */online | cut -d '/' -f 1` + return +} + + +# get_offline_cpus() +# +# Prints a list of all CPUs currently offline. This function only +# works if the system's CPUs have hotplug capabilities +# +get_offline_cpus() +{ + echo `cd /sys/devices/system/cpu/ && grep 0 */online | cut -d '/' -f 1` + return +} + +# cpu_is_valid(CPU) +# +# Checks to see if the given CPU number is available for hotplugging +# in the system. Returns 0 if the CPU is available, 1 otherwise. +# +cpu_is_valid() +{ + CPU=${1#cpu} + echo "CPU is $CPU" + cat /sys/devices/system/cpu/cpu${CPU}/online > /dev/null 2>&1 + return $? +} + + +# cpu_is_online(CPU) +# +# Returns a 0 value if the given CPU number is currently online, +# 1 otherwise. This function requires the system's CPUs have +# hotplug capabilities. +# +cpu_is_online() +{ + CPU=${1#cpu} + if [ `cat /sys/devices/system/cpu/cpu${CPU}/online` = "1" ]; then + return 0 + else + return 1 + fi +} diff --git a/testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_testsuite.sh b/testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_testsuite.sh new file mode 100644 index 0000000..2d0166c --- /dev/null +++ b/testcases/kernel/hotplug/cpu_hotplug/include/cpuhotplug_testsuite.sh @@ -0,0 +1,171 @@ +#!/bin/sh +############################################################ +## Convenience functions for reporting, asserting, etc. ## +############################################################ + +# warn(TEXT) +# +# Issues a warning message to stderr +# +warn() +{ + echo $1 1>&2 +} + +# assert() +# +# Basic assertion support. Use it like this: +# +# a=5 +# b=4 +# condition="$a -lt $b" # Error message and exit from script. +# # Try setting "condition" to something else, +# #+ and see what happens. +# +# assert "$condition" $LINENO +# +# Note that $LINENO is a built-in +# +assert () # If condition false, +{ #+ exit from script with error message. + E_PARAM_ERR=98 + E_ASSERT_FAILED=99 + + + if [ -z "$2" ] # Not enough parameters passed. + then + return $E_PARAM_ERR # No damage done. + fi + + lineno=$2 + + if [ ! $1 ] + then + echo "Assertion failed: \"$1\"" + echo "File \"$0\", line $lineno" + exit $E_ASSERT_FAILED + # else + # return + # and continue executing script. + fi +} + +############################################################ +## Process management ## +############################################################ + +# pid_is_valid(PID) +# +# Checks if the given $PID is still running. Returns a true value if +# it is, false otherwise. +# +pid_is_valid() +{ + PID=$1 + ps --pid ${PID} --no-header | grep ${PID} + return $? +} + +# kill_pid(PID) +# +# Forcibly kills the process ID and prevents it from +# displaying any messages (to stdout, stderr, or otherwise) +# +kill_pid() +{ + PID=$1 + disown $PID + kill -9 $PID > /dev/null 2>&1 +} + +############################################################ +## Timing ## +############################################################ + +# Routines in this library are set up to allow timing to be done +# by defining $TIME to a timing command. You can define your +# own handler by defining $TIME before or after including this +# library. +TIME=${TIME:-""} + +# Allows overriding the filename to use for storing time +# measurements. Required in order to +TIME_TMP_FILE=${TIME_TMP_FILE:-"${TMP:-/tmp}/cpu_$$"} + +# perform_timings() +# +# This turns on timings for operations that support timing +# via the $TIME variable. It does this by setting $TIME to +# a general purpose time command. +set_timing_on() +{ + TIME="/usr/bin/time -o $TIME_TMP_FILE -f \"%e\"" +} + +report_timing() +{ + MSG=${1:-"perform operation"} + if [ ! -z "${TIME}" ]; then + TM=`cat $TIME_TMP_FILE` + echo "Time to ${MSG} : $TM" + fi +} + +############################################################ +## Interrupt handling and cleanup ## +############################################################ + +# do_clean() +# +# Virtual function called by do_intr(). Override this to +# provide custom cleanup handling. +# +do_clean() +{ + return 0 +} + +# do_testsuite_clean() +# +# Internal routine to do cleanup specific to other routines +# in this testsuite. You may override this routine if you +# do not want this behavior. +# +do_testsuite_clean() +{ + /bin/rm -rf $TIME_TMP_FILE +} + +# exit_clean(EXIT_CODE) +# +# Replacement for exit command. Prints the date, then calls do_clean +# and exits with the given $EXIT_CODE, or 0 if none specified. +# +exit_clean() +{ + EXIT_CODE=${1:-0} + date + do_clean + exit $EXIT_CODE +} + +# do_intr() +# +# Handler for trapped interrupts (i.e., signals 1 2 15). +# +# This will result in a call do do_clean() when the user +# interrupts the test, allowing you to do whatever final +# cleanup work is needed (removing tmp files, restoring +# resources to initial states, etc.) This routine will +# exit with error code 1 when done. +# +do_intr() +{ + echo "## Cleaning up... user interrupt" + do_testsuite_clean + do_clean + exit 1 +} + +trap "do_intr" 1 2 15 + diff --git a/testcases/kernel/hotplug/cpu_hotplug/include/hotplug.fns b/testcases/kernel/hotplug/cpu_hotplug/include/hotplug.fns deleted file mode 100644 index 6b3c933..0000000 --- a/testcases/kernel/hotplug/cpu_hotplug/include/hotplug.fns +++ /dev/null @@ -1,202 +0,0 @@ -#!/bin/sh - -# hotplug.fns - Collection of functions for hotplugging -# operations. - -# Routines in this library are set up to allow timing to be done -# by defining $TIME to a timing command. -TIME=${TIME:-""} - -# get_all_irqs() -# -# Gets list of all available IRQs in the system -# -get_all_irqs() -{ - echo `egrep [0-9]+: /proc/interrupts | cut -d ':' -f 1` - return -} - -# migrate_irq(CPU, IRQS) -# -# Sets the smp_affinity for the list of $IRQS to the given -# CPU number -# -migrate_irq() -{ - CPU=${1#cpu} - MASK=$((1<<${CPU})) - IRQS=$2 - for irq in ${IRQS} - do - echo $MASK > /proc/irq/${irq}/smp_affinity || \ - tst_resm TINFO "It is NOT permitted to change the IRQ $irq smp_affinity" - done -} - - -# get_affinity(PID) -# -# Echos the CPU affinity for the given process ID to stdout -# -get_affinity_mask() -{ - AFFINITY=`taskset -p ${1}` - echo ${AFFINITY} - return -} - -# set_affinity(PID, CPU) -# -# Sets the affinity for the given PID to the specified CPU. -# -set_affinity() -{ - PID="$1" - CPU="$2" - MASK=$((1<<${CPU_TO_TEST})) - `taskset -p ${MASK} ${PID} > /dev/null 2>&1` - return $? -} - -# online_cpu(CPU) -# -# Onlines the given CPU. Returns a true value if it was able -# to perform the online operation successfully, false otherwise. -# -# $CPU should either be a specific number like 4, or the cpu name, -# as in 'cpu4'. -# -online_cpu() -{ - CPU=${1#cpu} - if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then - return 1 - fi - $TIME echo 1 > /sys/devices/system/cpu/cpu${CPU}/online - RC=$? - report_timing "Online cpu ${CPU}" - return $RC -} - - -# offline_cpu(CPU) -# -# Offlines the given CPU. Returns a true value if it was able -# to perform the offline operation successfully, false otherwise. -# -offline_cpu() -{ - CPU=${1#cpu} - if [ ! -w /sys/devices/system/cpu/cpu${CPU}/online ]; then - return 1 - fi - $TIME echo 0 > /sys/devices/system/cpu/cpu${CPU}/online - RC=$? - report_timing "Offline cpu ${CPU}" - return $RC -} - - -# get_all_cpus() -# -# Prints a list of all available CPUs, regardless of whether they're -# currently online or offline. -# -# This routine will work even if the CPUs are not hotpluggable, however -# it requires you have sysfs enabled in the kernel. -# -get_all_cpus() -{ - [ -d /sys/devices/system/cpu/cpu0 ] || return 1 - ls -dr /sys/devices/system/cpu/cpu[0-9]* | \ - sed "s/\/sys\/devices\/system\/cpu\///g" || return 2 -} - - -# get_all_cpu_states() -# -# Collects the current online/offline state of CPUs in the -# system, printing it in a format that can be passed to -# set_all_cpu_states() later. -# -get_all_cpu_states() -{ - echo `cd /sys/devices/system/cpu/ && grep '' */online | sed -e 's/\/online//'` - return -} - -# set_all_cpu_states(STATES) -# -# Sets all of the CPU states according to $STATE, which must be -# of the form "cpuX:Y", where X is the CPU number and Y its state. -# Each must be on a separate line. -# -set_all_cpu_states() -{ - for cpu_state in $STATE; do - cpu=`echo $c | cut -d: -f 1` - state=`echo $c | cut -d: -f 1` - if [ $state = 1 ]; then - echo "# Re-onlining $cpu" - online_cpu $cpu - else - echo "# Re-offlining $cpu" - offline_cpu $cpu - fi - done -} - - -# get_online_cpus() -# -# Prints a list of all CPUs currently online. This function only -# works if the system's CPUs have hotplug capabilities -# -get_online_cpus() -{ - echo `cd /sys/devices/system/cpu/ && grep 1 */online | cut -d '/' -f 1` - return -} - - -# get_offline_cpus() -# -# Prints a list of all CPUs currently offline. This function only -# works if the system's CPUs have hotplug capabilities -# -get_offline_cpus() -{ - echo `cd /sys/devices/system/cpu/ && grep 0 */online | cut -d '/' -f 1` - return -} - -# cpu_is_valid(CPU) -# -# Checks to see if the given CPU number is available for hotplugging -# in the system. Returns 0 if the CPU is available, 1 otherwise. -# -cpu_is_valid() -{ - CPU=${1#cpu} - echo "CPU is $CPU" - cat /sys/devices/system/cpu/cpu${CPU}/online > /dev/null 2>&1 - return $? -} - - -# cpu_is_online(CPU) -# -# Returns a 0 value if the given CPU number is currently online, -# 1 otherwise. This function requires the system's CPUs have -# hotplug capabilities. -# -cpu_is_online() -{ - CPU=${1#cpu} - if [ `cat /sys/devices/system/cpu/cpu${CPU}/online` = "1" ]; then - return 0 - else - return 1 - fi -} diff --git a/testcases/kernel/hotplug/cpu_hotplug/include/testsuite.fns b/testcases/kernel/hotplug/cpu_hotplug/include/testsuite.fns deleted file mode 100644 index 59103c2..0000000 --- a/testcases/kernel/hotplug/cpu_hotplug/include/testsuite.fns +++ /dev/null @@ -1,170 +0,0 @@ -############################################################ -## Convenience functions for reporting, asserting, etc. ## -############################################################ - -# warn(TEXT) -# -# Issues a warning message to stderr -# -warn() -{ - echo $1 1>&2 -} - -# assert() -# -# Basic assertion support. Use it like this: -# -# a=5 -# b=4 -# condition="$a -lt $b" # Error message and exit from script. -# # Try setting "condition" to something else, -# #+ and see what happens. -# -# assert "$condition" $LINENO -# -# Note that $LINENO is a built-in -# -assert () # If condition false, -{ #+ exit from script with error message. - E_PARAM_ERR=98 - E_ASSERT_FAILED=99 - - - if [ -z "$2" ] # Not enough parameters passed. - then - return $E_PARAM_ERR # No damage done. - fi - - lineno=$2 - - if [ ! $1 ] - then - echo "Assertion failed: \"$1\"" - echo "File \"$0\", line $lineno" - exit $E_ASSERT_FAILED - # else - # return - # and continue executing script. - fi -} - -############################################################ -## Process management ## -############################################################ - -# pid_is_valid(PID) -# -# Checks if the given $PID is still running. Returns a true value if -# it is, false otherwise. -# -pid_is_valid() -{ - PID=$1 - ps --pid ${PID} --no-header | grep ${PID} - return $? -} - -# kill_pid(PID) -# -# Forcibly kills the process ID and prevents it from -# displaying any messages (to stdout, stderr, or otherwise) -# -kill_pid() -{ - PID=$1 - disown $PID - kill -9 $PID > /dev/null 2>&1 -} - -############################################################ -## Timing ## -############################################################ - -# Routines in this library are set up to allow timing to be done -# by defining $TIME to a timing command. You can define your -# own handler by defining $TIME before or after including this -# library. -TIME=${TIME:-""} - -# Allows overriding the filename to use for storing time -# measurements. Required in order to -TIME_TMP_FILE=${TIME_TMP_FILE:-"${TMP:-/tmp}/cpu_$$"} - -# perform_timings() -# -# This turns on timings for operations that support timing -# via the $TIME variable. It does this by setting $TIME to -# a general purpose time command. -set_timing_on() -{ - TIME="/usr/bin/time -o $TIME_TMP_FILE -f \"%e\"" -} - -report_timing() -{ - MSG=${1:-"perform operation"} - if [ ! -z "${TIME}" ]; then - TM=`cat $TIME_TMP_FILE` - echo "Time to ${MSG} : $TM" - fi -} - -############################################################ -## Interrupt handling and cleanup ## -############################################################ - -# do_clean() -# -# Virtual function called by do_intr(). Override this to -# provide custom cleanup handling. -# -do_clean() -{ - return 0 -} - -# do_testsuite_clean() -# -# Internal routine to do cleanup specific to other routines -# in this testsuite. You may override this routine if you -# do not want this behavior. -# -do_testsuite_clean() -{ - /bin/rm -rf $TIME_TMP_FILE -} - -# exit_clean(EXIT_CODE) -# -# Replacement for exit command. Prints the date, then calls do_clean -# and exits with the given $EXIT_CODE, or 0 if none specified. -# -exit_clean() -{ - EXIT_CODE=${1:-0} - date - do_clean - exit $EXIT_CODE -} - -# do_intr() -# -# Handler for trapped interrupts (i.e., signals 1 2 15). -# -# This will result in a call do do_clean() when the user -# interrupts the test, allowing you to do whatever final -# cleanup work is needed (removing tmp files, restoring -# resources to initial states, etc.) This routine will -# exit with error code 1 when done. -# -do_intr() -{ - echo "## Cleaning up... user interrupt" - do_testsuite_clean - do_clean - exit 1 -} - -trap "do_intr" 1 2 15 - diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_disk_write_loop b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_disk_write_loop new file mode 100644 index 0000000..9e28591 --- /dev/null +++ b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_disk_write_loop @@ -0,0 +1,19 @@ +#!/bin/sh + +TMP_FILE=${TMP:-/tmp}/cpu_$$ +TM_DLY=1 # Time delay before start of entire new cycle. + + +CNT=0 +while : +do + + : $(( CNT += 1 )) + echo "Loop Count $CNT" + + echo 1 > $TMP_FILE + # TODO: Verify writes are complete and correct + + sleep $TM_DLY + +done diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_kcompile_loop b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_kcompile_loop new file mode 100644 index 0000000..d4b32c2 --- /dev/null +++ b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_kcompile_loop @@ -0,0 +1,21 @@ +#!/bin/sh + +# Must be run from a kernel source code directory + +echo $$ + +KERNEL_DIR=${1:-/usr/src/linux} + +if [ ! -d $KERNEL_DIR ]; then + echo "${0##*/}: ERROR: kernel directory - $KERNEL_DIR - does not exist" + exit 1 +fi + +cd $KERNEL_DIR || exit $? + +while : +do + make mrproper + make defconfig + make -j20 bzImage +done diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_spin_loop b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_spin_loop new file mode 100644 index 0000000..a5c05cb --- /dev/null +++ b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_do_spin_loop @@ -0,0 +1,8 @@ +#!/bin/sh + +echo $$ + +while : +do + NOOP=1 +done diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_report_proc_interrupts b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_report_proc_interrupts new file mode 100644 index 0000000..59a6bbd --- /dev/null +++ b/testcases/kernel/hotplug/cpu_hotplug/tools/cpuhotplug_report_proc_interrupts @@ -0,0 +1,53 @@ +#!/usr/bin/perl + +use strict; + +sub compare_proc_interrupts { + my ($run1, $run2) = @_; + + my $printed_header; + foreach my $irq (sort keys %{$run1}) { + if (! $printed_header) { + printf "%-8s ", "IRQ"; + foreach my $cpu (sort keys %{$run1->{$irq}}) { + printf "%-5s ", $cpu; + } + print "\n"; + $printed_header = 1; + } + printf "%-8s ", $irq; + foreach my $cpu (sort keys %{$run1->{$irq}}) { + printf "%-5s ", $run2->{$irq}->{$cpu} - $run1->{$irq}->{$cpu}; + } + print "\n"; + } +} + + +sub parse_proc_interrupts { + my $content = shift; + my @cpus; + my %run; + + foreach my $line (split /\n/, $content) { + $line =~ s/^\s+//; + $line =~ s/\s+$//; + + if (! @cpus) { + @cpus = split /\s+/, $line; + } else { + my @items = split /\s+/, $line; + my $irq = shift @items; + $irq =~ s/:$//; + foreach my $cpu (@cpus) { + $run{"IRQ$irq"}->{"$cpu"} = shift @items; + } + } + } + return \%run; +} + +my $run1 = parse_proc_interrupts(shift @ARGV); +my $run2 = parse_proc_interrupts(shift @ARGV); + +compare_proc_interrupts($run1, $run2); diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/do_disk_write_loop b/testcases/kernel/hotplug/cpu_hotplug/tools/do_disk_write_loop deleted file mode 100755 index 9e28591..0000000 --- a/testcases/kernel/hotplug/cpu_hotplug/tools/do_disk_write_loop +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -TMP_FILE=${TMP:-/tmp}/cpu_$$ -TM_DLY=1 # Time delay before start of entire new cycle. - - -CNT=0 -while : -do - - : $(( CNT += 1 )) - echo "Loop Count $CNT" - - echo 1 > $TMP_FILE - # TODO: Verify writes are complete and correct - - sleep $TM_DLY - -done diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/do_kcompile_loop b/testcases/kernel/hotplug/cpu_hotplug/tools/do_kcompile_loop deleted file mode 100755 index d4b32c2..0000000 --- a/testcases/kernel/hotplug/cpu_hotplug/tools/do_kcompile_loop +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -# Must be run from a kernel source code directory - -echo $$ - -KERNEL_DIR=${1:-/usr/src/linux} - -if [ ! -d $KERNEL_DIR ]; then - echo "${0##*/}: ERROR: kernel directory - $KERNEL_DIR - does not exist" - exit 1 -fi - -cd $KERNEL_DIR || exit $? - -while : -do - make mrproper - make defconfig - make -j20 bzImage -done diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/do_spin_loop b/testcases/kernel/hotplug/cpu_hotplug/tools/do_spin_loop deleted file mode 100755 index a5c05cb..0000000 --- a/testcases/kernel/hotplug/cpu_hotplug/tools/do_spin_loop +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -echo $$ - -while : -do - NOOP=1 -done diff --git a/testcases/kernel/hotplug/cpu_hotplug/tools/report_proc_interrupts b/testcases/kernel/hotplug/cpu_hotplug/tools/report_proc_interrupts deleted file mode 100755 index 59a6bbd..0000000 --- a/testcases/kernel/hotplug/cpu_hotplug/tools/report_proc_interrupts +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/perl - -use strict; - -sub compare_proc_interrupts { - my ($run1, $run2) = @_; - - my $printed_header; - foreach my $irq (sort keys %{$run1}) { - if (! $printed_header) { - printf "%-8s ", "IRQ"; - foreach my $cpu (sort keys %{$run1->{$irq}}) { - printf "%-5s ", $cpu; - } - print "\n"; - $printed_header = 1; - } - printf "%-8s ", $irq; - foreach my $cpu (sort keys %{$run1->{$irq}}) { - printf "%-5s ", $run2->{$irq}->{$cpu} - $run1->{$irq}->{$cpu}; - } - print "\n"; - } -} - - -sub parse_proc_interrupts { - my $content = shift; - my @cpus; - my %run; - - foreach my $line (split /\n/, $content) { - $line =~ s/^\s+//; - $line =~ s/\s+$//; - - if (! @cpus) { - @cpus = split /\s+/, $line; - } else { - my @items = split /\s+/, $line; - my $irq = shift @items; - $irq =~ s/:$//; - foreach my $cpu (@cpus) { - $run{"IRQ$irq"}->{"$cpu"} = shift @items; - } - } - } - return \%run; -} - -my $run1 = parse_proc_interrupts(shift @ARGV); -my $run2 = parse_proc_interrupts(shift @ARGV); - -compare_proc_interrupts($run1, $run2); -- 1.9.3 ------------------------------------------------------------------------------ Open source business process management suite built on Java and Eclipse Turn processes into business applications with Bonita BPM Community Edition Quickly connect people, data, and systems into organized workflows Winner of BOSSIE, CODIE, OW2 and Gartner awards http://p.sf.net/sfu/Bonitasoft _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
