Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools/memory-model: Make judgelitmus.sh handle hardware verifications

This commit makes the judgelitmus.sh script check the --hw argument
(AKA the LKMM_HW_MAP_FILE environment variable) and to adjust its
judgment for a run where a C-language litmus test has been translated to
assembly and the assembly version verified. In this case, the assembly
verification output is checked against the C-language script's "Result:"
comment. However, because hardware can be stronger than LKMM requires,
the judgelitmus.sh script forgives verification mismatches featuring
a "Sometimes" in the C-language script and an "Always" or "Never"
assembly-language verification.

Note that deadlock is not forgiven, however, this should not normally be
an issue given that C-language tests containing locking, RCU, or SRCU
cannot be translated to assembly. However, this issue can crop up in
litmus tests that mimic deadlock by using the "filter" clause to ignore
all executions. It can also crop up when certain herd arguments are
used to autofilter everything that does not match the "exists" clause
in cases where the "exists" clause cannot be satisfied.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

+51 -32
+4 -4
tools/memory-model/scripts/README
··· 43 43 44 44 judgelitmus.sh 45 45 46 - Given a .litmus file and its .litmus.out herd7 output, check the 47 - .litmus.out file against the .litmus file's "Result:" comment to 48 - judge whether the test ran correctly. Not normally run manually, 49 - provided instead for use by other scripts. 46 + Given a .litmus file and its herd7 output, check the output file 47 + against the .litmus file's "Result:" comment to judge whether 48 + the test ran correctly. Not normally run manually, provided 49 + instead for use by other scripts. 50 50 51 51 newlitmushist.sh 52 52
+47 -28
tools/memory-model/scripts/judgelitmus.sh
··· 1 1 #!/bin/sh 2 2 # SPDX-License-Identifier: GPL-2.0+ 3 3 # 4 - # Given a .litmus test and the corresponding .litmus.out file, check 5 - # the .litmus.out file against the "Result:" comment to judge whether 6 - # the test ran correctly. 4 + # Given a .litmus test and the corresponding litmus output file, check 5 + # the .litmus.out file against the "Result:" comment to judge whether the 6 + # test ran correctly. If the --hw argument is omitted, check against the 7 + # LKMM output, which is assumed to be in file.litmus.out. If this argument 8 + # is provided, this is assumed to be a hardware test, and the output is 9 + # assumed to be in file.HW.litmus.out, where "HW" is the --hw argument. 10 + # In addition, non-Sometimes verification results will be noted, but 11 + # forgiven. 7 12 # 8 13 # Usage: 9 14 # judgelitmus.sh file.litmus ··· 29 24 echo ' --- ' error: \"$litmus\" is not a readable file 30 25 exit 255 31 26 fi 32 - if test -f "$LKMM_DESTDIR/$litmus".out -a -r "$LKMM_DESTDIR/$litmus".out 27 + if test -z "$LKMM_HW_MAP_FILE" 28 + then 29 + litmusout=$litmus.out 30 + else 31 + litmusout="`echo $litmus | 32 + sed -e 's/\.litmus$/.'${LKMM_HW_MAP_FILE}'.litmus/'`.out" 33 + fi 34 + if test -f "$LKMM_DESTDIR/$litmusout" -a -r "$LKMM_DESTDIR/$litmusout" 33 35 then 34 36 : 35 37 else 36 - echo ' --- ' error: \"$LKMM_DESTDIR/$litmus\".out is not a readable file 38 + echo ' --- ' error: \"$LKMM_DESTDIR/$litmusout is not a readable file 37 39 exit 255 38 40 fi 39 41 if grep -q '^ \* Result: ' $litmus ··· 50 38 outcome=specified 51 39 fi 52 40 53 - grep '^Observation' $LKMM_DESTDIR/$litmus.out 54 - if grep -q '^Observation' $LKMM_DESTDIR/$litmus.out 41 + grep '^Observation' $LKMM_DESTDIR/$litmusout 42 + if grep -q '^Observation' $LKMM_DESTDIR/$litmusout 55 43 then 56 44 : 57 - elif grep ': Unknown macro ' $LKMM_DESTDIR/$litmus.out 45 + elif grep ': Unknown macro ' $LKMM_DESTDIR/$litmusout 58 46 then 59 - badname=`grep ': Unknown macro ' $LKMM_DESTDIR/$litmus.out | 47 + badname=`grep ': Unknown macro ' $LKMM_DESTDIR/$litmusout | 60 48 sed -e 's/^.*: Unknown macro //' | 61 49 sed -e 's/ (User error).*$//'` 62 50 badmsg=' !!! Current LKMM version does not know "'$badname'"'" $litmus" 63 51 echo $badmsg 64 - if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out 52 + if ! grep -q '!!!' $LKMM_DESTDIR/$litmusout 65 53 then 66 - echo ' !!! '$badmsg >> $LKMM_DESTDIR/$litmus.out 2>&1 54 + echo ' !!! '$badmsg >> $LKMM_DESTDIR/$litmusout 2>&1 67 55 fi 68 56 exit 254 69 - elif grep '^Command exited with non-zero status 124' $LKMM_DESTDIR/$litmus.out 57 + elif grep '^Command exited with non-zero status 124' $LKMM_DESTDIR/$litmusout 70 58 then 71 59 echo ' !!! Timeout' $litmus 72 - if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out 60 + if ! grep -q '!!!' $LKMM_DESTDIR/$litmusout 73 61 then 74 - echo ' !!! Timeout' >> $LKMM_DESTDIR/$litmus.out 2>&1 62 + echo ' !!! Timeout' >> $LKMM_DESTDIR/$litmusout 2>&1 75 63 fi 76 64 exit 124 77 65 else 78 66 echo ' !!! Verification error' $litmus 79 - if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out 67 + if ! grep -q '!!!' $LKMM_DESTDIR/$litmusout 80 68 then 81 - echo ' !!! Verification error' >> $LKMM_DESTDIR/$litmus.out 2>&1 69 + echo ' !!! Verification error' >> $LKMM_DESTDIR/$litmusout 2>&1 82 70 fi 83 71 exit 255 84 72 fi 85 73 if test "$outcome" = DEADLOCK 86 74 then 87 - if grep '^Observation' $LKMM_DESTDIR/$litmus.out | grep -q 'Never 0 0$' 75 + if grep '^Observation' $LKMM_DESTDIR/$litmusout | grep -q 'Never 0 0$' 88 76 then 89 77 ret=0 90 78 else 91 79 echo " !!! Unexpected non-$outcome verification" $litmus 92 - if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out 80 + if ! grep -q '!!!' $LKMM_DESTDIR/$litmusout 93 81 then 94 - echo " !!! Unexpected non-$outcome verification" >> $LKMM_DESTDIR/$litmus.out 2>&1 82 + echo " !!! Unexpected non-$outcome verification" >> $LKMM_DESTDIR/$litmusout 2>&1 95 83 fi 96 84 ret=1 97 85 fi 98 - elif grep '^Observation' $LKMM_DESTDIR/$litmus.out | grep -q 'Never 0 0$' 86 + elif grep '^Observation' $LKMM_DESTDIR/$litmusout | grep -q 'Never 0 0$' 99 87 then 100 88 echo " !!! Unexpected non-$outcome deadlock" $litmus 101 - if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out 89 + if ! grep -q '!!!' $LKMM_DESTDIR/$litmusout 102 90 then 103 - echo " !!! Unexpected non-$outcome deadlock" $litmus >> $LKMM_DESTDIR/$litmus.out 2>&1 91 + echo " !!! Unexpected non-$outcome deadlock" $litmus >> $LKMM_DESTDIR/$litmusout 2>&1 104 92 fi 105 93 ret=1 106 - elif grep '^Observation' $LKMM_DESTDIR/$litmus.out | grep -q $outcome || test "$outcome" = Maybe 94 + elif grep '^Observation' $LKMM_DESTDIR/$litmusout | grep -q $outcome || test "$outcome" = Maybe 107 95 then 108 96 ret=0 109 97 else 110 - echo " !!! Unexpected non-$outcome verification" $litmus 111 - if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out 98 + if test -n "$LKMM_HW_MAP_FILE" -a "$outcome" = Sometimes 112 99 then 113 - echo " !!! Unexpected non-$outcome verification" >> $LKMM_DESTDIR/$litmus.out 2>&1 100 + flag="--- Forgiven" 101 + ret=0 102 + else 103 + flag="!!! Unexpected" 104 + ret=1 114 105 fi 115 - ret=1 106 + echo " $flag non-$outcome verification" $litmus 107 + if ! grep -qe "$flag" $LKMM_DESTDIR/$litmusout 108 + then 109 + echo " $flag non-$outcome verification" >> $LKMM_DESTDIR/$litmusout 2>&1 110 + fi 116 111 fi 117 - tail -2 $LKMM_DESTDIR/$litmus.out | head -1 112 + tail -2 $LKMM_DESTDIR/$litmusout | head -1 118 113 exit $ret