torture.sh 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0+
  3. #
  4. # Run a series of torture tests, intended for overnight or
  5. # longer timeframes, and also for large systems.
  6. #
  7. # Usage: torture.sh [ options ]
  8. #
  9. # Copyright (C) 2020 Facebook, Inc.
  10. #
  11. # Authors: Paul E. McKenney <paulmck@kernel.org>
  12. scriptname=$0
  13. args="$*"
  14. RCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
  15. PATH=${RCUTORTURE}/bin:$PATH; export PATH
  16. . functions.sh
  17. TORTURE_ALLOTED_CPUS="`identify_qemu_vcpus`"
  18. MAKE_ALLOTED_CPUS=$((TORTURE_ALLOTED_CPUS*2))
  19. SCALE_ALLOTED_CPUS=$((TORTURE_ALLOTED_CPUS/2))
  20. if test "$SCALE_ALLOTED_CPUS" -lt 1
  21. then
  22. SCALE_ALLOTED_CPUS=1
  23. fi
  24. VERBOSE_BATCH_CPUS=$((TORTURE_ALLOTED_CPUS/16))
  25. if test "$VERBOSE_BATCH_CPUS" -lt 2
  26. then
  27. VERBOSE_BATCH_CPUS=0
  28. fi
  29. # Configurations/scenarios.
  30. configs_rcutorture=
  31. configs_locktorture=
  32. configs_scftorture=
  33. kcsan_kmake_args=
  34. # Default compression, duration, and apportionment.
  35. compress_concurrency="`identify_qemu_vcpus`"
  36. duration_base=10
  37. duration_rcutorture_frac=7
  38. duration_locktorture_frac=1
  39. duration_scftorture_frac=2
  40. # "yes" or "no" parameters
  41. do_allmodconfig=yes
  42. do_rcutorture=yes
  43. do_locktorture=yes
  44. do_scftorture=yes
  45. do_rcuscale=yes
  46. do_refscale=yes
  47. do_kvfree=yes
  48. do_kasan=yes
  49. do_kcsan=no
  50. do_clocksourcewd=yes
  51. do_rt=yes
  52. do_rcutasksflavors=yes
  53. do_srcu_lockdep=yes
  54. # doyesno - Helper function for yes/no arguments
  55. function doyesno () {
  56. if test "$1" = "$2"
  57. then
  58. echo yes
  59. else
  60. echo no
  61. fi
  62. }
  63. usage () {
  64. echo "Usage: $scriptname optional arguments:"
  65. echo " --compress-concurrency concurrency"
  66. echo " --configs-rcutorture \"config-file list w/ repeat factor (3*TINY01)\""
  67. echo " --configs-locktorture \"config-file list w/ repeat factor (10*LOCK01)\""
  68. echo " --configs-scftorture \"config-file list w/ repeat factor (2*CFLIST)\""
  69. echo " --do-all"
  70. echo " --do-allmodconfig / --do-no-allmodconfig / --no-allmodconfig"
  71. echo " --do-clocksourcewd / --do-no-clocksourcewd / --no-clocksourcewd"
  72. echo " --do-kasan / --do-no-kasan / --no-kasan"
  73. echo " --do-kcsan / --do-no-kcsan / --no-kcsan"
  74. echo " --do-kvfree / --do-no-kvfree / --no-kvfree"
  75. echo " --do-locktorture / --do-no-locktorture / --no-locktorture"
  76. echo " --do-none"
  77. echo " --do-rcuscale / --do-no-rcuscale / --no-rcuscale"
  78. echo " --do-rcutasksflavors / --do-no-rcutasksflavors / --no-rcutasksflavors"
  79. echo " --do-rcutorture / --do-no-rcutorture / --no-rcutorture"
  80. echo " --do-refscale / --do-no-refscale / --no-refscale"
  81. echo " --do-rt / --do-no-rt / --no-rt"
  82. echo " --do-scftorture / --do-no-scftorture / --no-scftorture"
  83. echo " --do-srcu-lockdep / --do-no-srcu-lockdep / --no-srcu-lockdep"
  84. echo " --duration [ <minutes> | <hours>h | <days>d ]"
  85. echo " --guest-cpu-limit N"
  86. echo " --kcsan-kmake-arg kernel-make-arguments"
  87. exit 1
  88. }
  89. while test $# -gt 0
  90. do
  91. case "$1" in
  92. --compress-concurrency)
  93. checkarg --compress-concurrency "(concurrency level)" $# "$2" '^[0-9][0-9]*$' '^error'
  94. compress_concurrency=$2
  95. shift
  96. ;;
  97. --config-rcutorture|--configs-rcutorture)
  98. checkarg --configs-rcutorture "(list of config files)" "$#" "$2" '^[^/]\+$' '^--'
  99. configs_rcutorture="$configs_rcutorture $2"
  100. shift
  101. ;;
  102. --config-locktorture|--configs-locktorture)
  103. checkarg --configs-locktorture "(list of config files)" "$#" "$2" '^[^/]\+$' '^--'
  104. configs_locktorture="$configs_locktorture $2"
  105. shift
  106. ;;
  107. --config-scftorture|--configs-scftorture)
  108. checkarg --configs-scftorture "(list of config files)" "$#" "$2" '^[^/]\+$' '^--'
  109. configs_scftorture="$configs_scftorture $2"
  110. shift
  111. ;;
  112. --do-all|--doall)
  113. do_allmodconfig=yes
  114. do_rcutasksflavor=yes
  115. do_rcutorture=yes
  116. do_locktorture=yes
  117. do_scftorture=yes
  118. do_rcuscale=yes
  119. do_refscale=yes
  120. do_rt=yes
  121. do_kvfree=yes
  122. do_kasan=yes
  123. do_kcsan=yes
  124. do_clocksourcewd=yes
  125. do_srcu_lockdep=yes
  126. ;;
  127. --do-allmodconfig|--do-no-allmodconfig|--no-allmodconfig)
  128. do_allmodconfig=`doyesno "$1" --do-allmodconfig`
  129. ;;
  130. --do-clocksourcewd|--do-no-clocksourcewd|--no-clocksourcewd)
  131. do_clocksourcewd=`doyesno "$1" --do-clocksourcewd`
  132. ;;
  133. --do-kasan|--do-no-kasan|--no-kasan)
  134. do_kasan=`doyesno "$1" --do-kasan`
  135. ;;
  136. --do-kcsan|--do-no-kcsan|--no-kcsan)
  137. do_kcsan=`doyesno "$1" --do-kcsan`
  138. ;;
  139. --do-kvfree|--do-no-kvfree|--no-kvfree)
  140. do_kvfree=`doyesno "$1" --do-kvfree`
  141. ;;
  142. --do-locktorture|--do-no-locktorture|--no-locktorture)
  143. do_locktorture=`doyesno "$1" --do-locktorture`
  144. ;;
  145. --do-none|--donone)
  146. do_allmodconfig=no
  147. do_rcutasksflavors=no
  148. do_rcutorture=no
  149. do_locktorture=no
  150. do_scftorture=no
  151. do_rcuscale=no
  152. do_refscale=no
  153. do_rt=no
  154. do_kvfree=no
  155. do_kasan=no
  156. do_kcsan=no
  157. do_clocksourcewd=no
  158. do_srcu_lockdep=no
  159. ;;
  160. --do-rcuscale|--do-no-rcuscale|--no-rcuscale)
  161. do_rcuscale=`doyesno "$1" --do-rcuscale`
  162. ;;
  163. --do-rcutasksflavors|--do-no-rcutasksflavors|--no-rcutasksflavors)
  164. do_rcutasksflavors=`doyesno "$1" --do-rcutasksflavors`
  165. ;;
  166. --do-rcutorture|--do-no-rcutorture|--no-rcutorture)
  167. do_rcutorture=`doyesno "$1" --do-rcutorture`
  168. ;;
  169. --do-refscale|--do-no-refscale|--no-refscale)
  170. do_refscale=`doyesno "$1" --do-refscale`
  171. ;;
  172. --do-rt|--do-no-rt|--no-rt)
  173. do_rt=`doyesno "$1" --do-rt`
  174. ;;
  175. --do-scftorture|--do-no-scftorture|--no-scftorture)
  176. do_scftorture=`doyesno "$1" --do-scftorture`
  177. ;;
  178. --do-srcu-lockdep|--do-no-srcu-lockdep|--no-srcu-lockdep)
  179. do_srcu_lockdep=`doyesno "$1" --do-srcu-lockdep`
  180. ;;
  181. --duration)
  182. checkarg --duration "(minutes)" $# "$2" '^[0-9][0-9]*\(m\|h\|d\|\)$' '^error'
  183. mult=1
  184. if echo "$2" | grep -q 'm$'
  185. then
  186. mult=1
  187. elif echo "$2" | grep -q 'h$'
  188. then
  189. mult=60
  190. elif echo "$2" | grep -q 'd$'
  191. then
  192. mult=1440
  193. fi
  194. ts=`echo $2 | sed -e 's/[smhd]$//'`
  195. duration_base=$(($ts*mult))
  196. shift
  197. ;;
  198. --guest-cpu-limit|--guest-cpu-lim)
  199. checkarg --guest-cpu-limit "(number)" "$#" "$2" '^[0-9]*$' '^--'
  200. if (("$2" <= "$TORTURE_ALLOTED_CPUS" / 2))
  201. then
  202. SCALE_ALLOTED_CPUS="$2"
  203. VERBOSE_BATCH_CPUS="$((SCALE_ALLOTED_CPUS/8))"
  204. if (("$VERBOSE_BATCH_CPUS" < 2))
  205. then
  206. VERBOSE_BATCH_CPUS=0
  207. fi
  208. else
  209. echo "Ignoring value of $2 for --guest-cpu-limit which is greater than (("$TORTURE_ALLOTED_CPUS" / 2))."
  210. fi
  211. shift
  212. ;;
  213. --kcsan-kmake-arg|--kcsan-kmake-args)
  214. checkarg --kcsan-kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$'
  215. kcsan_kmake_args="`echo "$kcsan_kmake_args $2" | sed -e 's/^ *//' -e 's/ *$//'`"
  216. shift
  217. ;;
  218. *)
  219. echo Unknown argument $1
  220. usage
  221. ;;
  222. esac
  223. shift
  224. done
  225. ds="`date +%Y.%m.%d-%H.%M.%S`-torture"
  226. startdate="`date`"
  227. starttime="`get_starttime`"
  228. T="`mktemp -d ${TMPDIR-/tmp}/torture.sh.XXXXXX`"
  229. trap 'rm -rf $T' 0 2
  230. echo " --- " $scriptname $args | tee -a $T/log
  231. echo " --- Results directory: " $ds | tee -a $T/log
  232. # Calculate rcutorture defaults and apportion time
  233. if test -z "$configs_rcutorture"
  234. then
  235. configs_rcutorture=CFLIST
  236. fi
  237. duration_rcutorture=$((duration_base*duration_rcutorture_frac/10))
  238. if test "$duration_rcutorture" -eq 0
  239. then
  240. echo " --- Zero time for rcutorture, disabling" | tee -a $T/log
  241. do_rcutorture=no
  242. fi
  243. # Calculate locktorture defaults and apportion time
  244. if test -z "$configs_locktorture"
  245. then
  246. configs_locktorture=CFLIST
  247. fi
  248. duration_locktorture=$((duration_base*duration_locktorture_frac/10))
  249. if test "$duration_locktorture" -eq 0
  250. then
  251. echo " --- Zero time for locktorture, disabling" | tee -a $T/log
  252. do_locktorture=no
  253. fi
  254. # Calculate scftorture defaults and apportion time
  255. if test -z "$configs_scftorture"
  256. then
  257. configs_scftorture=CFLIST
  258. fi
  259. duration_scftorture=$((duration_base*duration_scftorture_frac/10))
  260. if test "$duration_scftorture" -eq 0
  261. then
  262. echo " --- Zero time for scftorture, disabling" | tee -a $T/log
  263. do_scftorture=no
  264. fi
  265. touch $T/failures
  266. touch $T/successes
  267. # torture_one - Does a single kvm.sh run.
  268. #
  269. # Usage:
  270. # torture_bootargs="[ kernel boot arguments ]"
  271. # torture_one flavor [ kvm.sh arguments ]
  272. #
  273. # Note that "flavor" is an arbitrary string. Supply --torture if needed.
  274. # Note that quoting is problematic. So on the command line, pass multiple
  275. # values with multiple kvm.sh argument instances.
  276. function torture_one {
  277. local cur_bootargs=
  278. local boottag=
  279. echo " --- $curflavor:" Start `date` | tee -a $T/log
  280. if test -n "$torture_bootargs"
  281. then
  282. boottag="--bootargs"
  283. cur_bootargs="$torture_bootargs"
  284. fi
  285. "$@" $boottag "$cur_bootargs" --datestamp "$ds/results-$curflavor" > $T/$curflavor.out 2>&1
  286. retcode=$?
  287. resdir="`grep '^Results directory: ' $T/$curflavor.out | tail -1 | sed -e 's/^Results directory: //'`"
  288. if test -z "$resdir"
  289. then
  290. cat $T/$curflavor.out | tee -a $T/log
  291. echo retcode=$retcode | tee -a $T/log
  292. else
  293. echo $resdir > $T/last-resdir
  294. fi
  295. if test "$retcode" == 0
  296. then
  297. echo "$curflavor($retcode)" $resdir >> $T/successes
  298. else
  299. echo "$curflavor($retcode)" $resdir >> $T/failures
  300. fi
  301. }
  302. # torture_set - Does a set of tortures with and without KASAN and KCSAN.
  303. #
  304. # Usage:
  305. # torture_bootargs="[ kernel boot arguments ]"
  306. # torture_set flavor [ kvm.sh arguments ]
  307. #
  308. # Note that "flavor" is an arbitrary string that does not affect kvm.sh
  309. # in any way. So also supply --torture if you need something other than
  310. # the default.
  311. function torture_set {
  312. local cur_kcsan_kmake_args=
  313. local kcsan_kmake_tag=
  314. local flavor=$1
  315. shift
  316. curflavor=$flavor
  317. torture_one "$@"
  318. mv $T/last-resdir $T/last-resdir-nodebug || :
  319. if test "$do_kasan" = "yes"
  320. then
  321. curflavor=${flavor}-kasan
  322. torture_one "$@" --kasan
  323. mv $T/last-resdir $T/last-resdir-kasan || :
  324. fi
  325. if test "$do_kcsan" = "yes"
  326. then
  327. curflavor=${flavor}-kcsan
  328. if test -n "$kcsan_kmake_args"
  329. then
  330. kcsan_kmake_tag="--kmake-args"
  331. cur_kcsan_kmake_args="$kcsan_kmake_args"
  332. fi
  333. torture_one "$@" --kconfig "CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y" $kcsan_kmake_tag $cur_kcsan_kmake_args --kcsan
  334. mv $T/last-resdir $T/last-resdir-kcsan || :
  335. fi
  336. }
  337. # make allmodconfig
  338. if test "$do_allmodconfig" = "yes"
  339. then
  340. echo " --- allmodconfig:" Start `date` | tee -a $T/log
  341. amcdir="tools/testing/selftests/rcutorture/res/$ds/allmodconfig"
  342. mkdir -p "$amcdir"
  343. echo " --- make clean" | tee $amcdir/log > "$amcdir/Make.out" 2>&1
  344. make -j$MAKE_ALLOTED_CPUS clean >> "$amcdir/Make.out" 2>&1
  345. retcode=$?
  346. buildphase='"make clean"'
  347. if test "$retcode" -eq 0
  348. then
  349. echo " --- make allmodconfig" | tee -a $amcdir/log >> "$amcdir/Make.out" 2>&1
  350. cp .config $amcdir
  351. make -j$MAKE_ALLOTED_CPUS allmodconfig >> "$amcdir/Make.out" 2>&1
  352. retcode=$?
  353. buildphase='"make allmodconfig"'
  354. fi
  355. if test "$retcode" -eq 0
  356. then
  357. echo " --- make " | tee -a $amcdir/log >> "$amcdir/Make.out" 2>&1
  358. make -j$MAKE_ALLOTED_CPUS >> "$amcdir/Make.out" 2>&1
  359. retcode="$?"
  360. echo $retcode > "$amcdir/Make.exitcode"
  361. buildphase='"make"'
  362. fi
  363. if test "$retcode" -eq 0
  364. then
  365. echo "allmodconfig($retcode)" $amcdir >> $T/successes
  366. echo Success >> $amcdir/log
  367. else
  368. echo "allmodconfig($retcode)" $amcdir >> $T/failures
  369. echo " --- allmodconfig Test summary:" >> $amcdir/log
  370. echo " --- Summary: Exit code $retcode from $buildphase, see Make.out" >> $amcdir/log
  371. fi
  372. fi
  373. # Test building RCU Tasks flavors in isolation, both SMP and !SMP
  374. if test "$do_rcutasksflavors" = "yes"
  375. then
  376. echo " --- rcutasksflavors:" Start `date` | tee -a $T/log
  377. rtfdir="tools/testing/selftests/rcutorture/res/$ds/results-rcutasksflavors"
  378. mkdir -p "$rtfdir"
  379. cat > $T/rcutasksflavors << __EOF__
  380. #CHECK#CONFIG_TASKS_RCU=n
  381. #CHECK#CONFIG_TASKS_RUDE_RCU=n
  382. #CHECK#CONFIG_TASKS_TRACE_RCU=n
  383. __EOF__
  384. for flavor in CONFIG_TASKS_RCU CONFIG_TASKS_RUDE_RCU CONFIG_TASKS_TRACE_RCU
  385. do
  386. forceflavor="`echo $flavor | sed -e 's/^CONFIG/CONFIG_FORCE/'`"
  387. deselectedflavors="`grep -v $flavor $T/rcutasksflavors | tr '\012' ' ' | tr -s ' ' | sed -e 's/ *$//'`"
  388. echo " --- Running RCU Tasks Trace flavor $flavor `date`" >> $rtfdir/log
  389. tools/testing/selftests/rcutorture/bin/kvm.sh --datestamp "$ds/results-rcutasksflavors/$flavor" --buildonly --configs "TINY01 TREE04" --kconfig "CONFIG_RCU_EXPERT=y CONFIG_RCU_SCALE_TEST=y CONFIG_KPROBES=n CONFIG_RCU_TRACE=n CONFIG_TRACING=n CONFIG_BLK_DEV_IO_TRACE=n CONFIG_UPROBE_EVENTS=n $forceflavor=y $deselectedflavors" --trust-make > $T/$flavor.out 2>&1
  390. retcode=$?
  391. if test "$retcode" -ne 0
  392. then
  393. break
  394. fi
  395. done
  396. if test "$retcode" -eq 0
  397. then
  398. echo "rcutasksflavors($retcode)" $rtfdir >> $T/successes
  399. echo Success >> $rtfdir/log
  400. else
  401. echo "rcutasksflavors($retcode)" $rtfdir >> $T/failures
  402. echo " --- rcutasksflavors Test summary:" >> $rtfdir/log
  403. echo " --- Summary: Exit code $retcode from $flavor, see Make.out" >> $rtfdir/log
  404. fi
  405. fi
  406. # --torture rcu
  407. if test "$do_rcutorture" = "yes"
  408. then
  409. torture_bootargs="rcupdate.rcu_cpu_stall_suppress_at_boot=1 torture.disable_onoff_at_boot rcupdate.rcu_task_stall_timeout=30000"
  410. torture_set "rcutorture" tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration "$duration_rcutorture" --configs "$configs_rcutorture" --trust-make
  411. fi
  412. if test "$do_locktorture" = "yes"
  413. then
  414. torture_bootargs="torture.disable_onoff_at_boot"
  415. torture_set "locktorture" tools/testing/selftests/rcutorture/bin/kvm.sh --torture lock --allcpus --duration "$duration_locktorture" --configs "$configs_locktorture" --trust-make
  416. fi
  417. if test "$do_scftorture" = "yes"
  418. then
  419. # Scale memory based on the number of CPUs.
  420. scfmem=$((3+SCALE_ALLOTED_CPUS/16))
  421. torture_bootargs="scftorture.nthreads=$SCALE_ALLOTED_CPUS torture.disable_onoff_at_boot csdlock_debug=1"
  422. torture_set "scftorture" tools/testing/selftests/rcutorture/bin/kvm.sh --torture scf --allcpus --duration "$duration_scftorture" --configs "$configs_scftorture" --kconfig "CONFIG_NR_CPUS=$SCALE_ALLOTED_CPUS" --memory ${scfmem}G --trust-make
  423. fi
  424. if test "$do_rt" = "yes"
  425. then
  426. # With all post-boot grace periods forced to normal.
  427. torture_bootargs="rcupdate.rcu_cpu_stall_suppress_at_boot=1 torture.disable_onoff_at_boot rcupdate.rcu_task_stall_timeout=30000 rcupdate.rcu_normal=1"
  428. torture_set "rcurttorture" tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration "$duration_rcutorture" --configs "TREE03" --trust-make
  429. # With all post-boot grace periods forced to expedited.
  430. torture_bootargs="rcupdate.rcu_cpu_stall_suppress_at_boot=1 torture.disable_onoff_at_boot rcupdate.rcu_task_stall_timeout=30000 rcupdate.rcu_expedited=1"
  431. torture_set "rcurttorture-exp" tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration "$duration_rcutorture" --configs "TREE03" --trust-make
  432. fi
  433. if test "$do_srcu_lockdep" = "yes"
  434. then
  435. echo " --- do-srcu-lockdep:" Start `date` | tee -a $T/log
  436. tools/testing/selftests/rcutorture/bin/srcu_lockdep.sh --datestamp "$ds/results-srcu-lockdep" > $T/srcu_lockdep.sh.out 2>&1
  437. retcode=$?
  438. cp $T/srcu_lockdep.sh.out "tools/testing/selftests/rcutorture/res/$ds/results-srcu-lockdep/log"
  439. if test "$retcode" -eq 0
  440. then
  441. echo "srcu_lockdep($retcode)" "tools/testing/selftests/rcutorture/res/$ds/results-srcu-lockdep" >> $T/successes
  442. echo Success >> "tools/testing/selftests/rcutorture/res/$ds/results-srcu-lockdep/log"
  443. else
  444. echo "srcu_lockdep($retcode)" "tools/testing/selftests/rcutorture/res/$ds/results-srcu-lockdep" >> $T/failures
  445. echo " --- srcu_lockdep Test Summary:" >> "tools/testing/selftests/rcutorture/res/$ds/results-srcu-lockdep/log"
  446. echo " --- Summary: Exit code $retcode from srcu_lockdep.sh, see ds/results-srcu-lockdep" >> "tools/testing/selftests/rcutorture/res/$ds/results-srcu-lockdep/log"
  447. fi
  448. fi
  449. if test "$do_refscale" = yes
  450. then
  451. primlist="`grep '\.name[ ]*=' kernel/rcu/refscale.c | sed -e 's/^[^"]*"//' -e 's/".*$//'`"
  452. else
  453. primlist=
  454. fi
  455. firsttime=1
  456. do_kasan_save="$do_kasan"
  457. do_kcsan_save="$do_kcsan"
  458. for prim in $primlist
  459. do
  460. if test -n "$firsttime"
  461. then
  462. torture_bootargs="refscale.scale_type="$prim" refscale.nreaders=$SCALE_ALLOTED_CPUS refscale.loops=10000 refscale.holdoff=20 torture.disable_onoff_at_boot"
  463. torture_set "refscale-$prim" tools/testing/selftests/rcutorture/bin/kvm.sh --torture refscale --allcpus --duration 5 --kconfig "CONFIG_TASKS_TRACE_RCU=y CONFIG_NR_CPUS=$SCALE_ALLOTED_CPUS" --bootargs "refscale.verbose_batched=$VERBOSE_BATCH_CPUS torture.verbose_sleep_frequency=8 torture.verbose_sleep_duration=$VERBOSE_BATCH_CPUS" --trust-make
  464. mv $T/last-resdir-nodebug $T/first-resdir-nodebug || :
  465. if test -f "$T/last-resdir-kasan"
  466. then
  467. mv $T/last-resdir-kasan $T/first-resdir-kasan || :
  468. fi
  469. if test -f "$T/last-resdir-kcsan"
  470. then
  471. mv $T/last-resdir-kcsan $T/first-resdir-kcsan || :
  472. fi
  473. firsttime=
  474. do_kasan=
  475. do_kcsan=
  476. else
  477. torture_bootargs=
  478. for i in $T/first-resdir-*
  479. do
  480. case "$i" in
  481. *-nodebug)
  482. torture_suffix=
  483. ;;
  484. *-kasan)
  485. torture_suffix="-kasan"
  486. ;;
  487. *-kcsan)
  488. torture_suffix="-kcsan"
  489. ;;
  490. esac
  491. torture_set "refscale-$prim$torture_suffix" tools/testing/selftests/rcutorture/bin/kvm-again.sh "`cat "$i"`" --duration 5 --bootargs "refscale.scale_type=$prim"
  492. done
  493. fi
  494. done
  495. do_kasan="$do_kasan_save"
  496. do_kcsan="$do_kcsan_save"
  497. if test "$do_rcuscale" = yes
  498. then
  499. primlist="`grep '\.name[ ]*=' kernel/rcu/rcuscale.c | sed -e 's/^[^"]*"//' -e 's/".*$//'`"
  500. else
  501. primlist=
  502. fi
  503. firsttime=1
  504. do_kasan_save="$do_kasan"
  505. do_kcsan_save="$do_kcsan"
  506. for prim in $primlist
  507. do
  508. if test -n "$firsttime"
  509. then
  510. torture_bootargs="rcuscale.scale_type="$prim" rcuscale.nwriters=$SCALE_ALLOTED_CPUS rcuscale.holdoff=20 torture.disable_onoff_at_boot"
  511. torture_set "rcuscale-$prim" tools/testing/selftests/rcutorture/bin/kvm.sh --torture rcuscale --allcpus --duration 5 --kconfig "CONFIG_TASKS_TRACE_RCU=y CONFIG_NR_CPUS=$SCALE_ALLOTED_CPUS" --trust-make
  512. mv $T/last-resdir-nodebug $T/first-resdir-nodebug || :
  513. if test -f "$T/last-resdir-kasan"
  514. then
  515. mv $T/last-resdir-kasan $T/first-resdir-kasan || :
  516. fi
  517. if test -f "$T/last-resdir-kcsan"
  518. then
  519. mv $T/last-resdir-kcsan $T/first-resdir-kcsan || :
  520. fi
  521. firsttime=
  522. do_kasan=
  523. do_kcsan=
  524. else
  525. torture_bootargs=
  526. for i in $T/first-resdir-*
  527. do
  528. case "$i" in
  529. *-nodebug)
  530. torture_suffix=
  531. ;;
  532. *-kasan)
  533. torture_suffix="-kasan"
  534. ;;
  535. *-kcsan)
  536. torture_suffix="-kcsan"
  537. ;;
  538. esac
  539. torture_set "rcuscale-$prim$torture_suffix" tools/testing/selftests/rcutorture/bin/kvm-again.sh "`cat "$i"`" --duration 5 --bootargs "rcuscale.scale_type=$prim"
  540. done
  541. fi
  542. done
  543. do_kasan="$do_kasan_save"
  544. do_kcsan="$do_kcsan_save"
  545. if test "$do_kvfree" = "yes"
  546. then
  547. torture_bootargs="rcuscale.kfree_rcu_test=1 rcuscale.kfree_nthreads=16 rcuscale.holdoff=20 rcuscale.kfree_loops=10000 torture.disable_onoff_at_boot"
  548. torture_set "rcuscale-kvfree" tools/testing/selftests/rcutorture/bin/kvm.sh --torture rcuscale --allcpus --duration $duration_rcutorture --kconfig "CONFIG_NR_CPUS=$SCALE_ALLOTED_CPUS" --memory 2G --trust-make
  549. fi
  550. if test "$do_clocksourcewd" = "yes"
  551. then
  552. torture_bootargs="rcupdate.rcu_cpu_stall_suppress_at_boot=1 torture.disable_onoff_at_boot rcupdate.rcu_task_stall_timeout=30000 tsc=watchdog"
  553. torture_set "clocksourcewd-1" tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration 45s --configs TREE03 --kconfig "CONFIG_TEST_CLOCKSOURCE_WATCHDOG=y" --trust-make
  554. torture_bootargs="rcupdate.rcu_cpu_stall_suppress_at_boot=1 torture.disable_onoff_at_boot rcupdate.rcu_task_stall_timeout=30000 tsc=watchdog"
  555. torture_set "clocksourcewd-2" tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration 45s --configs TREE03 --kconfig "CONFIG_TEST_CLOCKSOURCE_WATCHDOG=y" --trust-make
  556. # In case our work is already done...
  557. if test "$do_rcutorture" != "yes"
  558. then
  559. torture_bootargs="rcupdate.rcu_cpu_stall_suppress_at_boot=1 torture.disable_onoff_at_boot rcupdate.rcu_task_stall_timeout=30000 tsc=watchdog"
  560. torture_set "clocksourcewd-3" tools/testing/selftests/rcutorture/bin/kvm.sh --allcpus --duration 45s --configs TREE03 --trust-make
  561. fi
  562. fi
  563. echo " --- " $scriptname $args
  564. echo " --- " Done `date` | tee -a $T/log
  565. ret=0
  566. nsuccesses=0
  567. echo SUCCESSES: | tee -a $T/log
  568. if test -s "$T/successes"
  569. then
  570. cat "$T/successes" | tee -a $T/log
  571. nsuccesses="`wc -l "$T/successes" | awk '{ print $1 }'`"
  572. fi
  573. nfailures=0
  574. echo FAILURES: | tee -a $T/log
  575. if test -s "$T/failures"
  576. then
  577. awk < "$T/failures" -v sq="'" '{ print "echo " sq $0 sq; print "sed -e " sq "1,/^ --- .* Test summary:$/d" sq " " $2 "/log | grep Summary: | sed -e " sq "s/^[^S]*/ /" sq; }' | sh | tee -a $T/log | tee "$T/failuresum"
  578. nfailures="`wc -l "$T/failures" | awk '{ print $1 }'`"
  579. grep "^ Summary: " "$T/failuresum" |
  580. grep -v '^ Summary: Bugs: [0-9]* (all bugs kcsan)$' > "$T/nonkcsan"
  581. if test -s "$T/nonkcsan"
  582. then
  583. nonkcsanbug="yes"
  584. fi
  585. ret=2
  586. fi
  587. if test "$do_kcsan" = "yes"
  588. then
  589. TORTURE_KCONFIG_KCSAN_ARG=1 tools/testing/selftests/rcutorture/bin/kcsan-collapse.sh tools/testing/selftests/rcutorture/res/$ds > tools/testing/selftests/rcutorture/res/$ds/kcsan.sum
  590. fi
  591. echo Started at $startdate, ended at `date`, duration `get_starttime_duration $starttime`. | tee -a $T/log
  592. echo Summary: Successes: $nsuccesses Failures: $nfailures. | tee -a $T/log
  593. tdir="`cat $T/successes $T/failures | head -1 | awk '{ print $NF }' | sed -e 's,/[^/]\+/*$,,'`"
  594. find "$tdir" -name 'ConfigFragment.diags' -print > $T/configerrors
  595. find "$tdir" -name 'Make.out.diags' -print > $T/builderrors
  596. if test -s "$T/configerrors"
  597. then
  598. echo " Scenarios with .config errors: `wc -l "$T/configerrors" | awk '{ print $1 }'`"
  599. nonkcsanbug="yes"
  600. fi
  601. if test -s "$T/builderrors"
  602. then
  603. echo " Scenarios with build errors: `wc -l "$T/builderrors" | awk '{ print $1 }'`"
  604. nonkcsanbug="yes"
  605. fi
  606. if test -z "$nonkcsanbug" && test -s "$T/failuresum"
  607. then
  608. echo " All bugs were KCSAN failures."
  609. fi
  610. if test -n "$tdir" && test $compress_concurrency -gt 0
  611. then
  612. # KASAN vmlinux files can approach 1GB in size, so compress them.
  613. echo Looking for K[AC]SAN files to compress: `date` > "$tdir/log-xz" 2>&1
  614. find "$tdir" -type d -name '*-k[ac]san' -print > $T/xz-todo-all
  615. find "$tdir" -type f -name 're-run' -print | sed -e 's,/re-run,,' |
  616. grep -e '-k[ac]san$' > $T/xz-todo-copy
  617. sort $T/xz-todo-all $T/xz-todo-copy | uniq -u > $T/xz-todo
  618. ncompresses=0
  619. batchno=1
  620. if test -s $T/xz-todo
  621. then
  622. for i in `cat $T/xz-todo`
  623. do
  624. find $i -name 'vmlinux*' -print
  625. done | wc -l | awk '{ print $1 }' > $T/xz-todo-count
  626. n2compress="`cat $T/xz-todo-count`"
  627. echo Size before compressing $n2compress files: `du -sh $tdir | awk '{ print $1 }'` `date` 2>&1 | tee -a "$tdir/log-xz" | tee -a $T/log
  628. for i in `cat $T/xz-todo`
  629. do
  630. echo Compressing vmlinux files in ${i}: `date` >> "$tdir/log-xz" 2>&1
  631. for j in $i/*/vmlinux
  632. do
  633. xz "$j" >> "$tdir/log-xz" 2>&1 &
  634. ncompresses=$((ncompresses+1))
  635. if test $ncompresses -ge $compress_concurrency
  636. then
  637. echo Waiting for batch $batchno of $ncompresses compressions `date` | tee -a "$tdir/log-xz" | tee -a $T/log
  638. wait
  639. ncompresses=0
  640. batchno=$((batchno+1))
  641. fi
  642. done
  643. done
  644. if test $ncompresses -gt 0
  645. then
  646. echo Waiting for final batch $batchno of $ncompresses compressions `date` | tee -a "$tdir/log-xz" | tee -a $T/log
  647. fi
  648. wait
  649. if test -s $T/xz-todo-copy
  650. then
  651. # The trick here is that we need corresponding
  652. # vmlinux files from corresponding scenarios.
  653. echo Linking vmlinux.xz files to re-use scenarios `date` | tee -a "$tdir/log-xz" | tee -a $T/log
  654. dirstash="`pwd`"
  655. for i in `cat $T/xz-todo-copy`
  656. do
  657. cd $i
  658. find . -name vmlinux -print > $T/xz-todo-copy-vmlinux
  659. for v in `cat $T/xz-todo-copy-vmlinux`
  660. do
  661. rm -f "$v"
  662. cp -l `cat $i/re-run`/"$i/$v".xz "`dirname "$v"`"
  663. done
  664. cd "$dirstash"
  665. done
  666. fi
  667. echo Size after compressing $n2compress files: `du -sh $tdir | awk '{ print $1 }'` `date` 2>&1 | tee -a "$tdir/log-xz" | tee -a $T/log
  668. echo Total duration `get_starttime_duration $starttime`. | tee -a $T/log
  669. else
  670. echo No compression needed: `date` >> "$tdir/log-xz" 2>&1
  671. fi
  672. fi
  673. if test -n "$tdir"
  674. then
  675. cp $T/log "$tdir"
  676. fi
  677. exit $ret