mirror of https://gitee.com/openkylin/linux.git
selftest: cpufreq: Add special tests
This patch adds support for special tests which were reported on the PM list over the years, which helped catching core bugs by several developers. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
This commit is contained in:
parent
6751faf3d8
commit
1e4c2830c3
|
@ -1,7 +1,7 @@
|
|||
all:
|
||||
|
||||
TEST_PROGS := main.sh
|
||||
TEST_FILES := cpu.sh cpufreq.sh governor.sh module.sh
|
||||
TEST_FILES := cpu.sh cpufreq.sh governor.sh module.sh special-tests.sh
|
||||
|
||||
include ../lib.mk
|
||||
|
||||
|
|
|
@ -71,6 +71,13 @@ __switch_governor()
|
|||
echo $2 > $CPUFREQROOT/$1/scaling_governor
|
||||
}
|
||||
|
||||
# param:
|
||||
# $1: cpu, $2: governor
|
||||
__switch_governor_for_cpu()
|
||||
{
|
||||
echo $2 > $CPUROOT/$1/cpufreq/scaling_governor
|
||||
}
|
||||
|
||||
# SWITCH GOVERNORS
|
||||
|
||||
# $1: cpu, $2: governor
|
||||
|
|
|
@ -4,6 +4,7 @@ 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
|
||||
|
@ -19,7 +20,11 @@ helpme()
|
|||
[-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>]
|
||||
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"
|
||||
|
@ -67,7 +72,7 @@ parse_arguments()
|
|||
helpme
|
||||
;;
|
||||
|
||||
t) # --func_type (Function to perform: basic, suspend, hibernate, modtest (default: basic))
|
||||
t) # --func_type (Function to perform: basic, suspend, hibernate, modtest, sptest1/2/3/4 (default: basic))
|
||||
FUNC=$OPTARG
|
||||
;;
|
||||
|
||||
|
@ -136,6 +141,22 @@ do_test()
|
|||
fi
|
||||
;;
|
||||
|
||||
"sptest1")
|
||||
simple_lockdep
|
||||
;;
|
||||
|
||||
"sptest2")
|
||||
concurrent_lockdep
|
||||
;;
|
||||
|
||||
"sptest3")
|
||||
governor_race
|
||||
;;
|
||||
|
||||
"sptest4")
|
||||
hotplug_with_updates
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid [-f] function type"
|
||||
helpme
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Special test cases reported by people
|
||||
|
||||
# Testcase 1: Reported here: http://marc.info/?l=linux-pm&m=140618592709858&w=2
|
||||
|
||||
# protect against multiple inclusion
|
||||
if [ $FILE_SPECIAL ]; then
|
||||
return 0
|
||||
else
|
||||
FILE_SPECIAL=DONE
|
||||
fi
|
||||
|
||||
source cpu.sh
|
||||
source cpufreq.sh
|
||||
source governor.sh
|
||||
|
||||
# Test 1
|
||||
# $1: policy
|
||||
__simple_lockdep()
|
||||
{
|
||||
# switch to ondemand
|
||||
__switch_governor $1 "ondemand"
|
||||
|
||||
# cat ondemand files
|
||||
local ondir=$(find_gov_directory $1 "ondemand")
|
||||
if [ -z $ondir ]; then
|
||||
printf "${FUNCNAME[0]}Ondemand directory not created, quit"
|
||||
return
|
||||
fi
|
||||
|
||||
cat $ondir/*
|
||||
|
||||
# switch to conservative
|
||||
__switch_governor $1 "conservative"
|
||||
}
|
||||
|
||||
simple_lockdep()
|
||||
{
|
||||
printf "** Test: Running ${FUNCNAME[0]} **\n"
|
||||
|
||||
for_each_policy __simple_lockdep
|
||||
}
|
||||
|
||||
# Test 2
|
||||
# $1: policy
|
||||
__concurrent_lockdep()
|
||||
{
|
||||
for i in `seq 0 100`; do
|
||||
__simple_lockdep $1
|
||||
done
|
||||
}
|
||||
|
||||
concurrent_lockdep()
|
||||
{
|
||||
printf "** Test: Running ${FUNCNAME[0]} **\n"
|
||||
|
||||
for_each_policy_concurrent __concurrent_lockdep
|
||||
}
|
||||
|
||||
# Test 3
|
||||
quick_shuffle()
|
||||
{
|
||||
# this is called concurrently from governor_race
|
||||
for I in `seq 1000`
|
||||
do
|
||||
echo ondemand | sudo tee $CPUFREQROOT/policy*/scaling_governor &
|
||||
echo userspace | sudo tee $CPUFREQROOT/policy*/scaling_governor &
|
||||
done
|
||||
}
|
||||
|
||||
governor_race()
|
||||
{
|
||||
printf "** Test: Running ${FUNCNAME[0]} **\n"
|
||||
|
||||
# run 8 concurrent instances
|
||||
for I in `seq 8`
|
||||
do
|
||||
quick_shuffle &
|
||||
done
|
||||
}
|
||||
|
||||
# Test 4
|
||||
# $1: cpu
|
||||
hotplug_with_updates_cpu()
|
||||
{
|
||||
local filepath="$CPUROOT/$1/cpufreq"
|
||||
|
||||
# switch to ondemand
|
||||
__switch_governor_for_cpu $1 "ondemand"
|
||||
|
||||
for i in `seq 1 5000`
|
||||
do
|
||||
reboot_cpu $1
|
||||
done &
|
||||
|
||||
local freqs=$(cat $filepath/scaling_available_frequencies)
|
||||
local oldfreq=$(cat $filepath/scaling_min_freq)
|
||||
|
||||
for j in `seq 1 5000`
|
||||
do
|
||||
# Set all frequencies one-by-one
|
||||
for freq in $freqs; do
|
||||
echo $freq > $filepath/scaling_min_freq
|
||||
done
|
||||
done
|
||||
|
||||
# restore old freq
|
||||
echo $oldfreq > $filepath/scaling_min_freq
|
||||
}
|
||||
|
||||
hotplug_with_updates()
|
||||
{
|
||||
for_each_non_boot_cpu hotplug_with_updates_cpu
|
||||
}
|
Loading…
Reference in New Issue