brintos

brintos / linux-shallow public Read only

0
0
Text · 7.3 KiB · b053eea Raw
397 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# protect against multiple inclusion5if [ $FILE_MAIN ]; then6	return 07else8	FILE_MAIN=DONE9fi10 11SCRIPTDIR=`dirname "$0"`12TRACER=$SCRIPTDIR/../../../power/x86/amd_pstate_tracer/amd_pstate_trace.py13 14source $SCRIPTDIR/basic.sh15source $SCRIPTDIR/tbench.sh16source $SCRIPTDIR/gitsource.sh17 18# amd-pstate-ut only run on x86/x86_64 AMD systems.19ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/')20VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}')21 22msg="Skip all tests:"23FUNC=all24OUTFILE=selftest25OUTFILE_TBENCH="$OUTFILE.tbench"26OUTFILE_GIT="$OUTFILE.gitsource"27 28PERF=/usr/bin/perf29SYSFS=30CPUROOT=31CPUFREQROOT=32MAKE_CPUS=33 34TIME_LIMIT=10035PROCESS_NUM=12836LOOP_TIMES=337TRACER_INTERVAL=1038CURRENT_TEST=amd-pstate39COMPARATIVE_TEST=40 41# Kselftest framework requirement - SKIP code is 4.42ksft_skip=443all_scaling_names=("acpi-cpufreq" "amd-pstate")44 45# Get current cpufreq scaling driver name46scaling_name()47{48	if [ "$COMPARATIVE_TEST" = "" ]; then49		echo "$CURRENT_TEST"50	else51		echo "$COMPARATIVE_TEST"52	fi53}54 55# Counts CPUs with cpufreq directories56count_cpus()57{58	count=0;59 60	for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do61		if [ -d $CPUROOT/$cpu/cpufreq ]; then62			let count=count+1;63		fi64	done65 66	echo $count;67}68 69# $1: policy70find_current_governor()71{72	cat $CPUFREQROOT/$1/scaling_governor73}74 75backup_governor()76{77	policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")78	for policy in $policies; do79		cur_gov=$(find_current_governor $policy)80		echo "$policy $cur_gov" >> $OUTFILE.backup_governor.log81	done82 83	printf "Governor $cur_gov backup done.\n"84}85 86restore_governor()87{88	i=0;89 90	policies=$(awk '{print $1}' $OUTFILE.backup_governor.log)91	for policy in $policies; do92		let i++;93		governor=$(sed -n ''$i'p' $OUTFILE.backup_governor.log | awk '{print $2}')94 95		# switch governor96		echo $governor > $CPUFREQROOT/$policy/scaling_governor97	done98 99	printf "Governor restored to $governor.\n"100}101 102# $1: governor103switch_governor()104{105	policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")106	for policy in $policies; do107		filepath=$CPUFREQROOT/$policy/scaling_available_governors108 109		# Exit if cpu isn't managed by cpufreq core110		if [ ! -f $filepath ]; then111			return;112		fi113 114		echo $1 > $CPUFREQROOT/$policy/scaling_governor115	done116 117	printf "Switched governor to $1.\n"118}119 120# All amd-pstate tests121amd_pstate_all()122{123	printf "\n=============================================\n"124	printf "***** Running AMD P-state Sanity Tests  *****\n"125	printf "=============================================\n\n"126 127	count=$(count_cpus)128	if [ $count = 0 ]; then129		printf "No cpu is managed by cpufreq core, exiting\n"130		exit;131	else132		printf "AMD P-state manages: $count CPUs\n"133	fi134 135	# unit test for amd-pstate kernel driver136	amd_pstate_basic137 138	# tbench139	amd_pstate_tbench140 141	# gitsource142	amd_pstate_gitsource143}144 145help()146{147	printf "Usage: $0 [OPTION...]148	[-h <help>]149	[-o <output-file-for-dump>]150	[-c <all: All testing,151	     basic: Basic testing,152	     tbench: Tbench testing,153	     gitsource: Gitsource testing.>]154	[-t <tbench time limit>]155	[-p <tbench process number>]156	[-l <loop times for tbench>]157	[-i <amd tracer interval>]158	[-b <perf binary>]159	[-m <comparative test: acpi-cpufreq>]160	\n"161	exit 2162}163 164parse_arguments()165{166	while getopts ho:c:t:p:l:i:b:m: arg167	do168		case $arg in169			h) # --help170				help171				;;172 173			c) # --func_type (Function to perform: basic, tbench, gitsource (default: all))174				FUNC=$OPTARG175				;;176 177			o) # --output-file (Output file to store dumps)178				OUTFILE=$OPTARG179				;;180 181			t) # --tbench-time-limit182				TIME_LIMIT=$OPTARG183				;;184 185			p) # --tbench-process-number186				PROCESS_NUM=$OPTARG187				;;188 189			l) # --tbench/gitsource-loop-times190				LOOP_TIMES=$OPTARG191				;;192 193			i) # --amd-tracer-interval194				TRACER_INTERVAL=$OPTARG195				;;196 197			b) # --perf-binary198				PERF=`realpath $OPTARG`199				;;200 201			m) # --comparative-test202				COMPARATIVE_TEST=$OPTARG203				;;204 205			*)206				help207				;;208		esac209	done210}211 212command_perf()213{214	if ! $PERF -v; then215		echo $msg please install perf or provide perf binary path as argument >&2216		exit $ksft_skip217	fi218}219 220command_tbench()221{222	if ! command -v tbench > /dev/null; then223		if apt policy dbench > /dev/null 2>&1; then224			echo $msg apt install dbench >&2225			exit $ksft_skip226		elif yum list available | grep dbench > /dev/null 2>&1; then227			echo $msg yum install dbench >&2228			exit $ksft_skip229		fi230	fi231 232	if ! command -v tbench > /dev/null; then233		echo $msg please install tbench. >&2234		exit $ksft_skip235	fi236}237 238prerequisite()239{240	if ! echo "$ARCH" | grep -q x86; then241		echo "$0 # Skipped: Test can only run on x86 architectures."242		exit $ksft_skip243	fi244 245	if ! echo "$VENDOR" | grep -iq amd; then246		echo "$0 # Skipped: Test can only run on AMD CPU."247		echo "$0 # Current cpu vendor is $VENDOR."248		exit $ksft_skip249	fi250 251	scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver)252	if [ "$COMPARATIVE_TEST" = "" ]; then253		if [ "$scaling_driver" != "$CURRENT_TEST" ]; then254			echo "$0 # Skipped: Test can only run on $CURRENT_TEST driver or run comparative test."255			echo "$0 # Please set X86_AMD_PSTATE enabled or run comparative test."256			echo "$0 # Current cpufreq scaling driver is $scaling_driver."257			exit $ksft_skip258		fi259	else260		case "$FUNC" in261			"tbench" | "gitsource")262				if [ "$scaling_driver" != "$COMPARATIVE_TEST" ]; then263					echo "$0 # Skipped: Comparison test can only run on $COMPARISON_TEST driver."264					echo "$0 # Current cpufreq scaling driver is $scaling_driver."265					exit $ksft_skip266				fi267				;;268 269			*)270				echo "$0 # Skipped: Comparison test are only for tbench or gitsource."271				echo "$0 # Current comparative test is for $FUNC."272				exit $ksft_skip273				;;274		esac275	fi276 277	if [ ! -w /dev ]; then278		echo $msg please run this as root >&2279		exit $ksft_skip280	fi281 282	case "$FUNC" in283		"all")284			command_perf285			command_tbench286			;;287 288		"tbench")289			command_perf290			command_tbench291			;;292 293		"gitsource")294			command_perf295			;;296	esac297 298	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`299 300	if [ ! -d "$SYSFS" ]; then301		echo $msg sysfs is not mounted >&2302		exit 2303	fi304 305	CPUROOT=$SYSFS/devices/system/cpu306	CPUFREQROOT="$CPUROOT/cpufreq"307 308	if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then309		echo $msg cpus not available in sysfs >&2310		exit 2311	fi312 313	if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then314		echo $msg cpufreq directory not available in sysfs >&2315		exit 2316	fi317}318 319do_test()320{321	# Check if CPUs are managed by cpufreq or not322	count=$(count_cpus)323	MAKE_CPUS=$((count*2))324 325	if [ $count = 0 ]; then326		echo "No cpu is managed by cpufreq core, exiting"327		exit 2;328	fi329 330	case "$FUNC" in331		"all")332			amd_pstate_all333			;;334 335		"basic")336			amd_pstate_basic337			;;338 339		"tbench")340			amd_pstate_tbench341			;;342 343		"gitsource")344			amd_pstate_gitsource345			;;346 347		*)348			echo "Invalid [-f] function type"349			help350			;;351	esac352}353 354# clear dumps355pre_clear_dumps()356{357	case "$FUNC" in358		"all")359			rm -rf $OUTFILE.log360			rm -rf $OUTFILE.backup_governor.log361			rm -rf *.png362			;;363 364		"tbench")365			rm -rf $OUTFILE.log366			rm -rf $OUTFILE.backup_governor.log367			rm -rf tbench_*.png368			;;369 370		"gitsource")371			rm -rf $OUTFILE.log372			rm -rf $OUTFILE.backup_governor.log373			rm -rf gitsource_*.png374			;;375 376		*)377			;;378	esac379}380 381post_clear_dumps()382{383	rm -rf $OUTFILE.log384	rm -rf $OUTFILE.backup_governor.log385}386 387# Parse arguments388parse_arguments $@389 390# Make sure all requirements are met391prerequisite392 393# Run requested functions394pre_clear_dumps395do_test | tee -a $OUTFILE.log396post_clear_dumps397