Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e4c2830 authored by Viresh Kumar's avatar Viresh Kumar Committed by Shuah Khan
Browse files

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: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarShuah Khan <shuahkh@osg.samsung.com>
parent 6751faf3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
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

+7 −0
Original line number Diff line number Diff line
@@ -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
+23 −2
Original line number Diff line number Diff line
@@ -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
+115 −0
Original line number Diff line number Diff line
#!/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
}