mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-07 06:14:24 +08:00
013190c4cc
Add gitsource.sh trigger the gitsource testing and monitor the cpu desire performance, frequency, load, power consumption and throughput etc. 1) Download and tar gitsource codes. 2) Run gitsource benchmark on specific governors, ondemand or schedutil. 3) Run tbench benchmark comparative test on acpi-cpufreq kernel driver. 4) Get desire performance, frequency, load by perf. 5) Get power consumption and throughput by amd_pstate_trace.py. 6) Get run time by /usr/bin/time. 7) Analyse test results and save it in file selftest.gitsource.csv. 8) Plot png images about time, energy and performance per watt for each test. Fixed whitespace error during commit: Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> Signed-off-by: Meng Li <li.meng@amd.com> Acked-by: Huang Rui <ray.huang@amd.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
388 lines
7.0 KiB
Bash
Executable File
388 lines
7.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# protect against multiple inclusion
|
|
if [ $FILE_MAIN ]; then
|
|
return 0
|
|
else
|
|
FILE_MAIN=DONE
|
|
fi
|
|
|
|
source basic.sh
|
|
source tbench.sh
|
|
source gitsource.sh
|
|
|
|
# amd-pstate-ut only run on x86/x86_64 AMD systems.
|
|
ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/')
|
|
VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}')
|
|
|
|
msg="Skip all tests:"
|
|
FUNC=all
|
|
OUTFILE=selftest
|
|
OUTFILE_TBENCH="$OUTFILE.tbench"
|
|
OUTFILE_GIT="$OUTFILE.gitsource"
|
|
|
|
SYSFS=
|
|
CPUROOT=
|
|
CPUFREQROOT=
|
|
MAKE_CPUS=
|
|
|
|
TIME_LIMIT=100
|
|
PROCESS_NUM=128
|
|
LOOP_TIMES=3
|
|
TRACER_INTERVAL=10
|
|
CURRENT_TEST=amd-pstate
|
|
COMPARATIVE_TEST=
|
|
|
|
# Kselftest framework requirement - SKIP code is 4.
|
|
ksft_skip=4
|
|
all_scaling_names=("acpi-cpufreq" "amd-pstate")
|
|
|
|
# Get current cpufreq scaling driver name
|
|
scaling_name()
|
|
{
|
|
if [ "$COMPARATIVE_TEST" = "" ]; then
|
|
echo "$CURRENT_TEST"
|
|
else
|
|
echo "$COMPARATIVE_TEST"
|
|
fi
|
|
}
|
|
|
|
# Counts CPUs with cpufreq directories
|
|
count_cpus()
|
|
{
|
|
count=0;
|
|
|
|
for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do
|
|
if [ -d $CPUROOT/$cpu/cpufreq ]; then
|
|
let count=count+1;
|
|
fi
|
|
done
|
|
|
|
echo $count;
|
|
}
|
|
|
|
# $1: policy
|
|
find_current_governor()
|
|
{
|
|
cat $CPUFREQROOT/$1/scaling_governor
|
|
}
|
|
|
|
backup_governor()
|
|
{
|
|
policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
|
|
for policy in $policies; do
|
|
cur_gov=$(find_current_governor $policy)
|
|
echo "$policy $cur_gov" >> $OUTFILE.backup_governor.log
|
|
done
|
|
|
|
printf "Governor $cur_gov backup done.\n"
|
|
}
|
|
|
|
restore_governor()
|
|
{
|
|
i=0;
|
|
|
|
policies=$(awk '{print $1}' $OUTFILE.backup_governor.log)
|
|
for policy in $policies; do
|
|
let i++;
|
|
governor=$(sed -n ''$i'p' $OUTFILE.backup_governor.log | awk '{print $2}')
|
|
|
|
# switch governor
|
|
echo $governor > $CPUFREQROOT/$policy/scaling_governor
|
|
done
|
|
|
|
printf "Governor restored to $governor.\n"
|
|
}
|
|
|
|
# $1: governor
|
|
switch_governor()
|
|
{
|
|
policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
|
|
for policy in $policies; do
|
|
filepath=$CPUFREQROOT/$policy/scaling_available_governors
|
|
|
|
# Exit if cpu isn't managed by cpufreq core
|
|
if [ ! -f $filepath ]; then
|
|
return;
|
|
fi
|
|
|
|
echo $1 > $CPUFREQROOT/$policy/scaling_governor
|
|
done
|
|
|
|
printf "Switched governor to $1.\n"
|
|
}
|
|
|
|
# All amd-pstate tests
|
|
amd_pstate_all()
|
|
{
|
|
printf "\n=============================================\n"
|
|
printf "***** Running AMD P-state Sanity Tests *****\n"
|
|
printf "=============================================\n\n"
|
|
|
|
count=$(count_cpus)
|
|
if [ $count = 0 ]; then
|
|
printf "No cpu is managed by cpufreq core, exiting\n"
|
|
exit;
|
|
else
|
|
printf "AMD P-state manages: $count CPUs\n"
|
|
fi
|
|
|
|
# unit test for amd-pstate kernel driver
|
|
amd_pstate_basic
|
|
|
|
# tbench
|
|
amd_pstate_tbench
|
|
|
|
# gitsource
|
|
amd_pstate_gitsource
|
|
}
|
|
|
|
help()
|
|
{
|
|
printf "Usage: $0 [OPTION...]
|
|
[-h <help>]
|
|
[-o <output-file-for-dump>]
|
|
[-c <all: All testing,
|
|
basic: Basic testing,
|
|
tbench: Tbench testing,
|
|
gitsource: Gitsource testing.>]
|
|
[-t <tbench time limit>]
|
|
[-p <tbench process number>]
|
|
[-l <loop times for tbench>]
|
|
[-i <amd tracer interval>]
|
|
[-m <comparative test: acpi-cpufreq>]
|
|
\n"
|
|
exit 2
|
|
}
|
|
|
|
parse_arguments()
|
|
{
|
|
while getopts ho:c:t:p:l:i:m: arg
|
|
do
|
|
case $arg in
|
|
h) # --help
|
|
help
|
|
;;
|
|
|
|
c) # --func_type (Function to perform: basic, tbench, gitsource (default: all))
|
|
FUNC=$OPTARG
|
|
;;
|
|
|
|
o) # --output-file (Output file to store dumps)
|
|
OUTFILE=$OPTARG
|
|
;;
|
|
|
|
t) # --tbench-time-limit
|
|
TIME_LIMIT=$OPTARG
|
|
;;
|
|
|
|
p) # --tbench-process-number
|
|
PROCESS_NUM=$OPTARG
|
|
;;
|
|
|
|
l) # --tbench/gitsource-loop-times
|
|
LOOP_TIMES=$OPTARG
|
|
;;
|
|
|
|
i) # --amd-tracer-interval
|
|
TRACER_INTERVAL=$OPTARG
|
|
;;
|
|
|
|
m) # --comparative-test
|
|
COMPARATIVE_TEST=$OPTARG
|
|
;;
|
|
|
|
*)
|
|
help
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
command_perf()
|
|
{
|
|
if ! command -v perf > /dev/null; then
|
|
echo $msg please install perf. >&2
|
|
exit $ksft_skip
|
|
fi
|
|
}
|
|
|
|
command_tbench()
|
|
{
|
|
if ! command -v tbench > /dev/null; then
|
|
if apt policy dbench > /dev/null 2>&1; then
|
|
echo $msg apt install dbench >&2
|
|
exit $ksft_skip
|
|
elif yum list available | grep dbench > /dev/null 2>&1; then
|
|
echo $msg yum install dbench >&2
|
|
exit $ksft_skip
|
|
fi
|
|
fi
|
|
|
|
if ! command -v tbench > /dev/null; then
|
|
echo $msg please install tbench. >&2
|
|
exit $ksft_skip
|
|
fi
|
|
}
|
|
|
|
prerequisite()
|
|
{
|
|
if ! echo "$ARCH" | grep -q x86; then
|
|
echo "$0 # Skipped: Test can only run on x86 architectures."
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
if ! echo "$VENDOR" | grep -iq amd; then
|
|
echo "$0 # Skipped: Test can only run on AMD CPU."
|
|
echo "$0 # Current cpu vendor is $VENDOR."
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver)
|
|
if [ "$COMPARATIVE_TEST" = "" ]; then
|
|
if [ "$scaling_driver" != "$CURRENT_TEST" ]; then
|
|
echo "$0 # Skipped: Test can only run on $CURRENT_TEST driver or run comparative test."
|
|
echo "$0 # Please set X86_AMD_PSTATE enabled or run comparative test."
|
|
echo "$0 # Current cpufreq scaling drvier is $scaling_driver."
|
|
exit $ksft_skip
|
|
fi
|
|
else
|
|
case "$FUNC" in
|
|
"tbench" | "gitsource")
|
|
if [ "$scaling_driver" != "$COMPARATIVE_TEST" ]; then
|
|
echo "$0 # Skipped: Comparison test can only run on $COMPARISON_TEST driver."
|
|
echo "$0 # Current cpufreq scaling drvier is $scaling_driver."
|
|
exit $ksft_skip
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
echo "$0 # Skipped: Comparison test are only for tbench or gitsource."
|
|
echo "$0 # Current comparative test is for $FUNC."
|
|
exit $ksft_skip
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [ ! -w /dev ]; then
|
|
echo $msg please run this as root >&2
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
case "$FUNC" in
|
|
"all")
|
|
command_perf
|
|
command_tbench
|
|
;;
|
|
|
|
"tbench")
|
|
command_perf
|
|
command_tbench
|
|
;;
|
|
|
|
"gitsource")
|
|
command_perf
|
|
;;
|
|
esac
|
|
|
|
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
|
|
}
|
|
|
|
do_test()
|
|
{
|
|
# Check if CPUs are managed by cpufreq or not
|
|
count=$(count_cpus)
|
|
MAKE_CPUS=$((count*2))
|
|
|
|
if [ $count = 0 ]; then
|
|
echo "No cpu is managed by cpufreq core, exiting"
|
|
exit 2;
|
|
fi
|
|
|
|
case "$FUNC" in
|
|
"all")
|
|
amd_pstate_all
|
|
;;
|
|
|
|
"basic")
|
|
amd_pstate_basic
|
|
;;
|
|
|
|
"tbench")
|
|
amd_pstate_tbench
|
|
;;
|
|
|
|
"gitsource")
|
|
amd_pstate_gitsource
|
|
;;
|
|
|
|
*)
|
|
echo "Invalid [-f] function type"
|
|
help
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# clear dumps
|
|
pre_clear_dumps()
|
|
{
|
|
case "$FUNC" in
|
|
"all")
|
|
rm -rf $OUTFILE.log
|
|
rm -rf $OUTFILE.backup_governor.log
|
|
rm -rf *.png
|
|
;;
|
|
|
|
"tbench")
|
|
rm -rf $OUTFILE.log
|
|
rm -rf $OUTFILE.backup_governor.log
|
|
rm -rf tbench_*.png
|
|
;;
|
|
|
|
"gitsource")
|
|
rm -rf $OUTFILE.log
|
|
rm -rf $OUTFILE.backup_governor.log
|
|
rm -rf gitsource_*.png
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
}
|
|
|
|
post_clear_dumps()
|
|
{
|
|
rm -rf $OUTFILE.log
|
|
rm -rf $OUTFILE.backup_governor.log
|
|
}
|
|
|
|
# Parse arguments
|
|
parse_arguments $@
|
|
|
|
# Make sure all requirements are met
|
|
prerequisite
|
|
|
|
# Run requested functions
|
|
pre_clear_dumps
|
|
do_test | tee -a $OUTFILE.log
|
|
post_clear_dumps
|