Skip to content

Commit

Permalink
selftest: cpufreq: Add special tests
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Viresh Kumar authored and Shuah Khan committed Jan 19, 2017
1 parent 6751faf commit 1e4c283
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 3 deletions.
2 changes: 1 addition & 1 deletion tools/testing/selftests/cpufreq/Makefile
Original file line number Diff line number Diff line change
@@ -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

Expand Down
7 changes: 7 additions & 0 deletions tools/testing/selftests/cpufreq/governor.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 23 additions & 2 deletions tools/testing/selftests/cpufreq/main.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"
Expand Down Expand Up @@ -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
;;

Expand Down Expand Up @@ -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
Expand Down
115 changes: 115 additions & 0 deletions tools/testing/selftests/cpufreq/special-tests.sh
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 1e4c283

Please sign in to comment.