~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/rcutorture/bin/kvm-remote.sh

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #!/bin/bash
  2 # SPDX-License-Identifier: GPL-2.0+
  3 #
  4 # Run a series of tests on remote systems under KVM.
  5 #
  6 # Usage: kvm-remote.sh "systems" [ <kvm.sh args> ]
  7 #        kvm-remote.sh "systems" /path/to/old/run [ <kvm-again.sh args> ]
  8 #
  9 # Copyright (C) 2021 Facebook, Inc.
 10 #
 11 # Authors: Paul E. McKenney <paulmck@kernel.org>
 12 
 13 scriptname=$0
 14 args="$*"
 15 
 16 if ! test -d tools/testing/selftests/rcutorture/bin
 17 then
 18         echo $scriptname must be run from top-level directory of kernel source tree.
 19         exit 1
 20 fi
 21 
 22 RCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
 23 PATH=${RCUTORTURE}/bin:$PATH; export PATH
 24 . functions.sh
 25 
 26 starttime="`get_starttime`"
 27 
 28 systems="$1"
 29 if test -z "$systems"
 30 then
 31         echo $scriptname: Empty list of systems will go nowhere good, giving up.
 32         exit 1
 33 fi
 34 shift
 35 
 36 # Pathnames:
 37 # T:      /tmp/kvm-remote.sh.NNNNNN where "NNNNNN" is set by mktemp
 38 # resdir: /tmp/kvm-remote.sh.NNNNNN/res
 39 # rundir: /tmp/kvm-remote.sh.NNNNNN/res/$ds ("-remote" suffix)
 40 # oldrun: `pwd`/tools/testing/.../res/$otherds
 41 #
 42 # Pathname segments:
 43 # TD:     kvm-remote.sh.NNNNNN
 44 # ds:     yyyy.mm.dd-hh.mm.ss-remote
 45 
 46 T="`mktemp -d ${TMPDIR-/tmp}/kvm-remote.sh.XXXXXX`"
 47 trap 'rm -rf $T' 0
 48 TD="`basename "$T"`"
 49 
 50 resdir="$T/res"
 51 ds=`date +%Y.%m.%d-%H.%M.%S`-remote
 52 rundir=$resdir/$ds
 53 echo Results directory: $rundir
 54 echo $scriptname $args
 55 if echo $1 | grep -q '^--'
 56 then
 57         # Fresh build.  Create a datestamp unless the caller supplied one.
 58         datestamp="`echo "$@" | awk -v ds="$ds" '{
 59                 for (i = 1; i < NF; i++) {
 60                         if ($i == "--datestamp") {
 61                                 ds = "";
 62                                 break;
 63                         }
 64                 }
 65                 if (ds != "")
 66                         print "--datestamp " ds;
 67         }'`"
 68         kvm.sh --remote "$@" $datestamp --buildonly > $T/kvm.sh.out 2>&1
 69         ret=$?
 70         if test "$ret" -ne 0
 71         then
 72                 echo $scriptname: kvm.sh failed exit code $?
 73                 cat $T/kvm.sh.out
 74                 exit 2
 75         fi
 76         oldrun="`grep -m 1 "^Results directory: " $T/kvm.sh.out | awk '{ print $3 }'`"
 77         touch "$oldrun/remote-log"
 78         echo $scriptname $args >> "$oldrun/remote-log"
 79         echo | tee -a "$oldrun/remote-log"
 80         echo " ----" kvm.sh output: "(`date`)" | tee -a "$oldrun/remote-log"
 81         cat $T/kvm.sh.out | tee -a "$oldrun/remote-log"
 82         # We are going to run this, so remove the buildonly files.
 83         rm -f "$oldrun"/*/buildonly
 84         kvm-again.sh $oldrun --dryrun --remote --rundir "$rundir" > $T/kvm-again.sh.out 2>&1
 85         ret=$?
 86         if test "$ret" -ne 0
 87         then
 88                 echo $scriptname: kvm-again.sh failed exit code $? | tee -a "$oldrun/remote-log"
 89                 cat $T/kvm-again.sh.out | tee -a "$oldrun/remote-log"
 90                 exit 2
 91         fi
 92 else
 93         # Re-use old run.
 94         oldrun="$1"
 95         if ! echo $oldrun | grep -q '^/'
 96         then
 97                 oldrun="`pwd`/$oldrun"
 98         fi
 99         shift
100         touch "$oldrun/remote-log"
101         echo $scriptname $args >> "$oldrun/remote-log"
102         kvm-again.sh "$oldrun" "$@" --dryrun --remote --rundir "$rundir" > $T/kvm-again.sh.out 2>&1
103         ret=$?
104         if test "$ret" -ne 0
105         then
106                 echo $scriptname: kvm-again.sh failed exit code $? | tee -a "$oldrun/remote-log"
107                 cat $T/kvm-again.sh.out | tee -a "$oldrun/remote-log"
108                 exit 2
109         fi
110         cp -a "$rundir" "$RCUTORTURE/res/"
111         oldrun="$RCUTORTURE/res/$ds"
112 fi
113 echo | tee -a "$oldrun/remote-log"
114 echo " ----" kvm-again.sh output: "(`date`)" | tee -a "$oldrun/remote-log"
115 cat $T/kvm-again.sh.out
116 echo | tee -a "$oldrun/remote-log"
117 echo Remote run directory: $rundir | tee -a "$oldrun/remote-log"
118 echo Local build-side run directory: $oldrun | tee -a "$oldrun/remote-log"
119 
120 # Create the kvm-remote-N.sh scripts in the bin directory.
121 awk < "$rundir"/scenarios -v dest="$T/bin" -v rundir="$rundir" '
122 {
123         n = $1;
124         sub(/\./, "", n);
125         fn = dest "/kvm-remote-" n ".sh"
126         print "kvm-remote-noreap.sh " rundir " &" > fn;
127         scenarios = "";
128         for (i = 2; i <= NF; i++)
129                 scenarios = scenarios " " $i;
130         print "kvm-test-1-run-batch.sh" scenarios >> fn;
131         print "sync" >> fn;
132         print "rm " rundir "/remote.run" >> fn;
133 }'
134 chmod +x $T/bin/kvm-remote-*.sh
135 ( cd "`dirname $T`"; tar -chzf $T/binres.tgz "$TD/bin" "$TD/res" )
136 
137 # Check first to avoid the need for cleanup for system-name typos
138 for i in $systems
139 do
140         ssh -o BatchMode=yes $i getconf _NPROCESSORS_ONLN > $T/ssh.stdout 2> $T/ssh.stderr
141         ret=$?
142         if test "$ret" -ne 0
143         then
144                 echo "System $i unreachable ($ret), giving up." | tee -a "$oldrun/remote-log"
145                 echo ' --- ssh stdout: vvv' | tee -a "$oldrun/remote-log"
146                 cat $T/ssh.stdout | tee -a "$oldrun/remote-log"
147                 echo ' --- ssh stdout: ^^^' | tee -a "$oldrun/remote-log"
148                 echo ' --- ssh stderr: vvv' | tee -a "$oldrun/remote-log"
149                 cat $T/ssh.stderr | tee -a "$oldrun/remote-log"
150                 echo ' --- ssh stderr: ^^^' | tee -a "$oldrun/remote-log"
151                 exit 4
152         fi
153         echo $i: `cat $T/ssh.stdout` CPUs " " `date` | tee -a "$oldrun/remote-log"
154 done
155 
156 # Download and expand the tarball on all systems.
157 echo Build-products tarball: `du -h $T/binres.tgz` | tee -a "$oldrun/remote-log"
158 for i in $systems
159 do
160         echo Downloading tarball to $i `date` | tee -a "$oldrun/remote-log"
161         cat $T/binres.tgz | ssh -o BatchMode=yes $i "cd /tmp; tar -xzf -"
162         ret=$?
163         tries=0
164         while test "$ret" -ne 0
165         do
166                 echo Unable to download $T/binres.tgz to system $i, waiting and then retrying.  $tries prior retries. | tee -a "$oldrun/remote-log"
167                 sleep 60
168                 cat $T/binres.tgz | ssh -o BatchMode=yes $i "cd /tmp; tar -xzf -"
169                 ret=$?
170                 if test "$ret" -ne 0
171                 then
172                         if test "$tries" > 5
173                         then
174                                 echo Unable to download $T/binres.tgz to system $i, giving up. | tee -a "$oldrun/remote-log"
175                                 exit 10
176                         fi
177                 fi
178                 tries=$((tries+1))
179         done
180 done
181 
182 # Function to check for presence of a file on the specified system.
183 # Complain if the system cannot be reached, and retry after a wait.
184 # Currently just waits forever if a machine disappears.
185 #
186 # Usage: checkremotefile system pathname
187 checkremotefile () {
188         local ret
189         local sleeptime=60
190 
191         while :
192         do
193                 ssh -o BatchMode=yes $1 "test -f \"$2\""
194                 ret=$?
195                 if test "$ret" -eq 255
196                 then
197                         echo " ---" ssh failure to $1 checking for file $2, retry after $sleeptime seconds. `date` | tee -a "$oldrun/remote-log"
198                 elif test "$ret" -eq 0
199                 then
200                         return 0
201                 elif test "$ret" -eq 1
202                 then
203                         echo " ---" File \"$2\" not found: ssh $1 test -f \"$2\" | tee -a "$oldrun/remote-log"
204                         return 1
205                 else
206                         echo " ---" Exit code $ret: ssh $1 test -f \"$2\", retry after $sleeptime seconds. `date` | tee -a "$oldrun/remote-log"
207                         return $ret
208                 fi
209                 sleep $sleeptime
210         done
211 }
212 
213 # Function to start batches on idle remote $systems
214 #
215 # Usage: startbatches curbatch nbatches
216 #
217 # Batches are numbered starting at 1.  Returns the next batch to start.
218 # Be careful to redirect all debug output to FD 2 (stderr).
219 startbatches () {
220         local curbatch="$1"
221         local nbatches="$2"
222         local ret
223 
224         # Each pass through the following loop examines one system.
225         for i in $systems
226         do
227                 if test "$curbatch" -gt "$nbatches"
228                 then
229                         echo $((nbatches + 1))
230                         return 0
231                 fi
232                 if checkremotefile "$i" "$resdir/$ds/remote.run" 1>&2
233                 then
234                         continue # System still running last test, skip.
235                 fi
236                 ssh -o BatchMode=yes "$i" "cd \"$resdir/$ds\"; touch remote.run; PATH=\"$T/bin:$PATH\" nohup kvm-remote-$curbatch.sh > kvm-remote-$curbatch.sh.out 2>&1 &" 1>&2
237                 ret=$?
238                 if test "$ret" -ne 0
239                 then
240                         echo ssh $i failed: exitcode $ret 1>&2
241                         exit 11
242                 fi
243                 echo " ----" System $i Batch `head -n $curbatch < "$rundir"/scenarios | tail -1` `date` 1>&2
244                 curbatch=$((curbatch + 1))
245         done
246         echo $curbatch
247 }
248 
249 # Launch all the scenarios.
250 nbatches="`wc -l "$rundir"/scenarios | awk '{ print $1 }'`"
251 curbatch=1
252 while test "$curbatch" -le "$nbatches"
253 do
254         startbatches $curbatch $nbatches > $T/curbatch 2> $T/startbatches.stderr
255         curbatch="`cat $T/curbatch`"
256         if test -s "$T/startbatches.stderr"
257         then
258                 cat "$T/startbatches.stderr" | tee -a "$oldrun/remote-log"
259         fi
260         if test "$curbatch" -le "$nbatches"
261         then
262                 sleep 30
263         fi
264 done
265 echo All batches started. `date` | tee -a "$oldrun/remote-log"
266 
267 # Wait for all remaining scenarios to complete and collect results.
268 for i in $systems
269 do
270         echo " ---" Waiting for $i `date` | tee -a "$oldrun/remote-log"
271         while checkremotefile "$i" "$resdir/$ds/remote.run"
272         do
273                 sleep 30
274         done
275         echo " ---" Collecting results from $i `date` | tee -a "$oldrun/remote-log"
276         ( cd "$oldrun"; ssh -o BatchMode=yes $i "cd $rundir; tar -czf - kvm-remote-*.sh.out */console.log */kvm-test-1-run*.sh.out */qemu[_-]pid */qemu-retval */qemu-affinity; rm -rf $T > /dev/null 2>&1" | tar -xzf - )
277 done
278 
279 ( kvm-end-run-stats.sh "$oldrun" "$starttime"; echo $? > $T/exitcode ) | tee -a "$oldrun/remote-log"
280 exit "`cat $T/exitcode`"

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php