run.sh 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. # protect against multiple inclusion
  4. if [ $FILE_MAIN ]; then
  5. return 0
  6. else
  7. FILE_MAIN=DONE
  8. fi
  9. SCRIPTDIR=`dirname "$0"`
  10. TRACER=$SCRIPTDIR/../../../power/x86/amd_pstate_tracer/amd_pstate_trace.py
  11. source $SCRIPTDIR/basic.sh
  12. source $SCRIPTDIR/tbench.sh
  13. source $SCRIPTDIR/gitsource.sh
  14. # amd-pstate-ut only run on x86/x86_64 AMD systems.
  15. ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/')
  16. VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}')
  17. msg="Skip all tests:"
  18. FUNC=all
  19. OUTFILE=selftest
  20. OUTFILE_TBENCH="$OUTFILE.tbench"
  21. OUTFILE_GIT="$OUTFILE.gitsource"
  22. PERF=/usr/bin/perf
  23. SYSFS=
  24. CPUROOT=
  25. CPUFREQROOT=
  26. MAKE_CPUS=
  27. TIME_LIMIT=100
  28. PROCESS_NUM=128
  29. LOOP_TIMES=3
  30. TRACER_INTERVAL=10
  31. CURRENT_TEST=amd-pstate
  32. COMPARATIVE_TEST=
  33. # Kselftest framework requirement - SKIP code is 4.
  34. ksft_skip=4
  35. all_scaling_names=("acpi-cpufreq" "amd-pstate")
  36. # Get current cpufreq scaling driver name
  37. scaling_name()
  38. {
  39. if [ "$COMPARATIVE_TEST" = "" ]; then
  40. echo "$CURRENT_TEST"
  41. else
  42. echo "$COMPARATIVE_TEST"
  43. fi
  44. }
  45. # Counts CPUs with cpufreq directories
  46. count_cpus()
  47. {
  48. count=0;
  49. for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do
  50. if [ -d $CPUROOT/$cpu/cpufreq ]; then
  51. let count=count+1;
  52. fi
  53. done
  54. echo $count;
  55. }
  56. # $1: policy
  57. find_current_governor()
  58. {
  59. cat $CPUFREQROOT/$1/scaling_governor
  60. }
  61. backup_governor()
  62. {
  63. policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
  64. for policy in $policies; do
  65. cur_gov=$(find_current_governor $policy)
  66. echo "$policy $cur_gov" >> $OUTFILE.backup_governor.log
  67. done
  68. printf "Governor $cur_gov backup done.\n"
  69. }
  70. restore_governor()
  71. {
  72. i=0;
  73. policies=$(awk '{print $1}' $OUTFILE.backup_governor.log)
  74. for policy in $policies; do
  75. let i++;
  76. governor=$(sed -n ''$i'p' $OUTFILE.backup_governor.log | awk '{print $2}')
  77. # switch governor
  78. echo $governor > $CPUFREQROOT/$policy/scaling_governor
  79. done
  80. printf "Governor restored to $governor.\n"
  81. }
  82. # $1: governor
  83. switch_governor()
  84. {
  85. policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
  86. for policy in $policies; do
  87. filepath=$CPUFREQROOT/$policy/scaling_available_governors
  88. # Exit if cpu isn't managed by cpufreq core
  89. if [ ! -f $filepath ]; then
  90. return;
  91. fi
  92. echo $1 > $CPUFREQROOT/$policy/scaling_governor
  93. done
  94. printf "Switched governor to $1.\n"
  95. }
  96. # All amd-pstate tests
  97. amd_pstate_all()
  98. {
  99. printf "\n=============================================\n"
  100. printf "***** Running AMD P-state Sanity Tests *****\n"
  101. printf "=============================================\n\n"
  102. count=$(count_cpus)
  103. if [ $count = 0 ]; then
  104. printf "No cpu is managed by cpufreq core, exiting\n"
  105. exit;
  106. else
  107. printf "AMD P-state manages: $count CPUs\n"
  108. fi
  109. # unit test for amd-pstate kernel driver
  110. amd_pstate_basic
  111. # tbench
  112. amd_pstate_tbench
  113. # gitsource
  114. amd_pstate_gitsource
  115. }
  116. help()
  117. {
  118. printf "Usage: $0 [OPTION...]
  119. [-h <help>]
  120. [-o <output-file-for-dump>]
  121. [-c <all: All testing,
  122. basic: Basic testing,
  123. tbench: Tbench testing,
  124. gitsource: Gitsource testing.>]
  125. [-t <tbench time limit>]
  126. [-p <tbench process number>]
  127. [-l <loop times for tbench>]
  128. [-i <amd tracer interval>]
  129. [-b <perf binary>]
  130. [-m <comparative test: acpi-cpufreq>]
  131. \n"
  132. exit 2
  133. }
  134. parse_arguments()
  135. {
  136. while getopts ho:c:t:p:l:i:b:m: arg
  137. do
  138. case $arg in
  139. h) # --help
  140. help
  141. ;;
  142. c) # --func_type (Function to perform: basic, tbench, gitsource (default: all))
  143. FUNC=$OPTARG
  144. ;;
  145. o) # --output-file (Output file to store dumps)
  146. OUTFILE=$OPTARG
  147. ;;
  148. t) # --tbench-time-limit
  149. TIME_LIMIT=$OPTARG
  150. ;;
  151. p) # --tbench-process-number
  152. PROCESS_NUM=$OPTARG
  153. ;;
  154. l) # --tbench/gitsource-loop-times
  155. LOOP_TIMES=$OPTARG
  156. ;;
  157. i) # --amd-tracer-interval
  158. TRACER_INTERVAL=$OPTARG
  159. ;;
  160. b) # --perf-binary
  161. PERF=`realpath $OPTARG`
  162. ;;
  163. m) # --comparative-test
  164. COMPARATIVE_TEST=$OPTARG
  165. ;;
  166. *)
  167. help
  168. ;;
  169. esac
  170. done
  171. }
  172. command_perf()
  173. {
  174. if ! $PERF -v; then
  175. echo $msg please install perf or provide perf binary path as argument >&2
  176. exit $ksft_skip
  177. fi
  178. }
  179. command_tbench()
  180. {
  181. if ! command -v tbench > /dev/null; then
  182. if apt policy dbench > /dev/null 2>&1; then
  183. echo $msg apt install dbench >&2
  184. exit $ksft_skip
  185. elif yum list available | grep dbench > /dev/null 2>&1; then
  186. echo $msg yum install dbench >&2
  187. exit $ksft_skip
  188. fi
  189. fi
  190. if ! command -v tbench > /dev/null; then
  191. echo $msg please install tbench. >&2
  192. exit $ksft_skip
  193. fi
  194. }
  195. prerequisite()
  196. {
  197. if ! echo "$ARCH" | grep -q x86; then
  198. echo "$0 # Skipped: Test can only run on x86 architectures."
  199. exit $ksft_skip
  200. fi
  201. if ! echo "$VENDOR" | grep -iq amd; then
  202. echo "$0 # Skipped: Test can only run on AMD CPU."
  203. echo "$0 # Current cpu vendor is $VENDOR."
  204. exit $ksft_skip
  205. fi
  206. scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver)
  207. if [ "$COMPARATIVE_TEST" = "" ]; then
  208. if [ "$scaling_driver" != "$CURRENT_TEST" ]; then
  209. echo "$0 # Skipped: Test can only run on $CURRENT_TEST driver or run comparative test."
  210. echo "$0 # Please set X86_AMD_PSTATE enabled or run comparative test."
  211. echo "$0 # Current cpufreq scaling driver is $scaling_driver."
  212. exit $ksft_skip
  213. fi
  214. else
  215. case "$FUNC" in
  216. "tbench" | "gitsource")
  217. if [ "$scaling_driver" != "$COMPARATIVE_TEST" ]; then
  218. echo "$0 # Skipped: Comparison test can only run on $COMPARISON_TEST driver."
  219. echo "$0 # Current cpufreq scaling driver is $scaling_driver."
  220. exit $ksft_skip
  221. fi
  222. ;;
  223. *)
  224. echo "$0 # Skipped: Comparison test are only for tbench or gitsource."
  225. echo "$0 # Current comparative test is for $FUNC."
  226. exit $ksft_skip
  227. ;;
  228. esac
  229. fi
  230. if [ ! -w /dev ]; then
  231. echo $msg please run this as root >&2
  232. exit $ksft_skip
  233. fi
  234. case "$FUNC" in
  235. "all")
  236. command_perf
  237. command_tbench
  238. ;;
  239. "tbench")
  240. command_perf
  241. command_tbench
  242. ;;
  243. "gitsource")
  244. command_perf
  245. ;;
  246. esac
  247. SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
  248. if [ ! -d "$SYSFS" ]; then
  249. echo $msg sysfs is not mounted >&2
  250. exit 2
  251. fi
  252. CPUROOT=$SYSFS/devices/system/cpu
  253. CPUFREQROOT="$CPUROOT/cpufreq"
  254. if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
  255. echo $msg cpus not available in sysfs >&2
  256. exit 2
  257. fi
  258. if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
  259. echo $msg cpufreq directory not available in sysfs >&2
  260. exit 2
  261. fi
  262. }
  263. do_test()
  264. {
  265. # Check if CPUs are managed by cpufreq or not
  266. count=$(count_cpus)
  267. MAKE_CPUS=$((count*2))
  268. if [ $count = 0 ]; then
  269. echo "No cpu is managed by cpufreq core, exiting"
  270. exit 2;
  271. fi
  272. case "$FUNC" in
  273. "all")
  274. amd_pstate_all
  275. ;;
  276. "basic")
  277. amd_pstate_basic
  278. ;;
  279. "tbench")
  280. amd_pstate_tbench
  281. ;;
  282. "gitsource")
  283. amd_pstate_gitsource
  284. ;;
  285. *)
  286. echo "Invalid [-f] function type"
  287. help
  288. ;;
  289. esac
  290. }
  291. # clear dumps
  292. pre_clear_dumps()
  293. {
  294. case "$FUNC" in
  295. "all")
  296. rm -rf $OUTFILE.log
  297. rm -rf $OUTFILE.backup_governor.log
  298. rm -rf *.png
  299. ;;
  300. "tbench")
  301. rm -rf $OUTFILE.log
  302. rm -rf $OUTFILE.backup_governor.log
  303. rm -rf tbench_*.png
  304. ;;
  305. "gitsource")
  306. rm -rf $OUTFILE.log
  307. rm -rf $OUTFILE.backup_governor.log
  308. rm -rf gitsource_*.png
  309. ;;
  310. *)
  311. ;;
  312. esac
  313. }
  314. post_clear_dumps()
  315. {
  316. rm -rf $OUTFILE.log
  317. rm -rf $OUTFILE.backup_governor.log
  318. }
  319. # Parse arguments
  320. parse_arguments $@
  321. # Make sure all requirements are met
  322. prerequisite
  323. # Run requested functions
  324. pre_clear_dumps
  325. do_test | tee -a $OUTFILE.log
  326. post_clear_dumps