mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-08 23:04:35 +08:00
40d70d4d60
Use 'tee' to send the test output to stdout in addition to the current output file. This makes the output easier to handle in automated test systems and is superior to only later dumping the output file contents to stdout, since this way the test output can be interleaved with other log messages, like from the kernel, so that chronology is preserved, making it easier to detect issues. Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
199 lines
3.5 KiB
Bash
Executable File
199 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
source cpu.sh
|
|
source cpufreq.sh
|
|
source governor.sh
|
|
source module.sh
|
|
source special-tests.sh
|
|
|
|
FUNC=basic # do basic tests by default
|
|
OUTFILE=cpufreq_selftest
|
|
SYSFS=
|
|
CPUROOT=
|
|
CPUFREQROOT=
|
|
|
|
# Kselftest framework requirement - SKIP code is 4.
|
|
ksft_skip=4
|
|
|
|
helpme()
|
|
{
|
|
printf "Usage: $0 [-h] [-todg args]
|
|
[-h <help>]
|
|
[-o <output-file-for-dump>]
|
|
[-t <basic: Basic cpufreq testing
|
|
suspend: suspend/resume,
|
|
hibernate: hibernate/resume,
|
|
modtest: test driver or governor modules. Only to be used with -d or -g options,
|
|
sptest1: Simple governor switch to produce lockdep.
|
|
sptest2: Concurrent governor switch to produce lockdep.
|
|
sptest3: Governor races, shuffle between governors quickly.
|
|
sptest4: CPU hotplugs with updates to cpufreq files.>]
|
|
[-d <driver's module name: only with \"-t modtest>\"]
|
|
[-g <governor's module name: only with \"-t modtest>\"]
|
|
\n"
|
|
exit 2
|
|
}
|
|
|
|
prerequisite()
|
|
{
|
|
msg="skip all tests:"
|
|
|
|
if [ $UID != 0 ]; then
|
|
echo $msg must be run as root >&2
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
taskset -p 01 $$
|
|
|
|
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
|
|
|
|
if [ ! -d "$SYSFS" ]; then
|
|
echo $msg sysfs is not mounted >&2
|
|
exit 2
|
|
fi
|
|
|
|
CPUROOT=$SYSFS/devices/system/cpu
|
|
CPUFREQROOT="$CPUROOT/cpufreq"
|
|
|
|
if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
|
|
echo $msg cpus not available in sysfs >&2
|
|
exit 2
|
|
fi
|
|
|
|
if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
|
|
echo $msg cpufreq directory not available in sysfs >&2
|
|
exit 2
|
|
fi
|
|
}
|
|
|
|
parse_arguments()
|
|
{
|
|
while getopts ht:o:d:g: arg
|
|
do
|
|
case $arg in
|
|
h) # --help
|
|
helpme
|
|
;;
|
|
|
|
t) # --func_type (Function to perform: basic, suspend, hibernate, modtest, sptest1/2/3/4 (default: basic))
|
|
FUNC=$OPTARG
|
|
;;
|
|
|
|
o) # --output-file (Output file to store dumps)
|
|
OUTFILE=$OPTARG
|
|
;;
|
|
|
|
d) # --driver-mod-name (Name of the driver module)
|
|
DRIVER_MOD=$OPTARG
|
|
;;
|
|
|
|
g) # --governor-mod-name (Name of the governor module)
|
|
GOVERNOR_MOD=$OPTARG
|
|
;;
|
|
|
|
\?)
|
|
helpme
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
do_test()
|
|
{
|
|
# Check if CPUs are managed by cpufreq or not
|
|
count=$(count_cpufreq_managed_cpus)
|
|
|
|
if [ $count = 0 -a $FUNC != "modtest" ]; then
|
|
echo "No cpu is managed by cpufreq core, exiting"
|
|
exit 2;
|
|
fi
|
|
|
|
case "$FUNC" in
|
|
"basic")
|
|
cpufreq_basic_tests
|
|
;;
|
|
|
|
"suspend")
|
|
do_suspend "suspend" 1
|
|
;;
|
|
|
|
"hibernate")
|
|
do_suspend "hibernate" 1
|
|
;;
|
|
|
|
"modtest")
|
|
# Do we have modules in place?
|
|
if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then
|
|
echo "No driver or governor module passed with -d or -g"
|
|
exit 2;
|
|
fi
|
|
|
|
if [ $DRIVER_MOD ]; then
|
|
if [ $GOVERNOR_MOD ]; then
|
|
module_test $DRIVER_MOD $GOVERNOR_MOD
|
|
else
|
|
module_driver_test $DRIVER_MOD
|
|
fi
|
|
else
|
|
if [ $count = 0 ]; then
|
|
echo "No cpu is managed by cpufreq core, exiting"
|
|
exit 2;
|
|
fi
|
|
|
|
module_governor_test $GOVERNOR_MOD
|
|
fi
|
|
;;
|
|
|
|
"sptest1")
|
|
simple_lockdep
|
|
;;
|
|
|
|
"sptest2")
|
|
concurrent_lockdep
|
|
;;
|
|
|
|
"sptest3")
|
|
governor_race
|
|
;;
|
|
|
|
"sptest4")
|
|
hotplug_with_updates
|
|
;;
|
|
|
|
*)
|
|
echo "Invalid [-f] function type"
|
|
helpme
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# clear dumps
|
|
# $1: file name
|
|
clear_dumps()
|
|
{
|
|
echo "" > $1.txt
|
|
echo "" > $1.dmesg_cpufreq.txt
|
|
echo "" > $1.dmesg_full.txt
|
|
}
|
|
|
|
# $1: output file name
|
|
dmesg_dumps()
|
|
{
|
|
dmesg | grep cpufreq >> $1.dmesg_cpufreq.txt
|
|
|
|
# We may need the full logs as well
|
|
dmesg >> $1.dmesg_full.txt
|
|
}
|
|
|
|
# Parse arguments
|
|
parse_arguments $@
|
|
|
|
# Make sure all requirements are met
|
|
prerequisite
|
|
|
|
# Run requested functions
|
|
clear_dumps $OUTFILE
|
|
do_test | tee -a $OUTFILE.txt
|
|
dmesg_dumps $OUTFILE
|