qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] qemu-iotests: fix -valgrind option for check


From: Jeff Cody
Subject: Re: [Qemu-devel] [PATCH] qemu-iotests: fix -valgrind option for check
Date: Fri, 30 Oct 2015 14:04:11 -0400
User-agent: Mutt/1.5.21 (2010-09-15)

On Fri, Oct 30, 2015 at 06:16:29PM +0100, Max Reitz wrote:
> On 29.10.2015 19:04, Jeff Cody wrote:
> > Commit 934659c switched the iotests to run qemu-io from a bash subshell,
> > in order to catch segfaults.  This method is incompatible with the
> > current valgrind_qemu_io() bash function.
> > 
> > Move the valgrind usage into the exec subshell in _qemu_io_wrapper(),
> > while making sure the original return value is passed back to the
> > caller.
> > 
> > Update test output for tests 039, 061, and 137 as it looks for the
> > specific subshell command when the process is terminated.
> > 
> > Reported-by: Kevin Wolf <address@hidden>
> > Signed-off-by: Jeff Cody <address@hidden>
> > ---
> >  tests/qemu-iotests/039.out       | 30 +++++++++++++++++++++++++-----
> >  tests/qemu-iotests/061.out       | 12 ++++++++++--
> >  tests/qemu-iotests/137.out       |  6 +++++-
> >  tests/qemu-iotests/common        |  9 ++-------
> >  tests/qemu-iotests/common.config | 18 +++++++++++++++++-
> >  tests/qemu-iotests/common.rc     | 10 ----------
> >  6 files changed, 59 insertions(+), 26 deletions(-)
> > 
> > diff --git a/tests/qemu-iotests/039.out b/tests/qemu-iotests/039.out
> > index 03a31c5..32c8846 100644
> > --- a/tests/qemu-iotests/039.out
> > +++ b/tests/qemu-iotests/039.out
> > @@ -11,7 +11,11 @@ No errors were found on the image.
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> >  wrote 512/512 bytes at offset 0
> >  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  incompatible_features     0x1
> >  ERROR cluster 5 refcount=0 reference=1
> >  ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
> > @@ -46,7 +50,11 @@ read 512/512 bytes at offset 0
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> >  wrote 512/512 bytes at offset 0
> >  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  incompatible_features     0x1
> >  ERROR cluster 5 refcount=0 reference=1
> >  Rebuilding refcount structure
> > @@ -60,7 +68,11 @@ incompatible_features     0x0
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> >  wrote 512/512 bytes at offset 0
> >  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  incompatible_features     0x0
> >  No errors were found on the image.
> >  
> > @@ -79,7 +91,11 @@ No errors were found on the image.
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> >  wrote 512/512 bytes at offset 0
> >  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  incompatible_features     0x1
> >  ERROR cluster 5 refcount=0 reference=1
> >  ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
> > @@ -89,7 +105,11 @@ Data may be corrupted, or further writes to the image 
> > may corrupt it.
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> >  wrote 512/512 bytes at offset 0
> >  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  incompatible_features     0x0
> >  No errors were found on the image.
> >  *** done
> > diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
> > index b16bea9..f2598a8 100644
> > --- a/tests/qemu-iotests/061.out
> > +++ b/tests/qemu-iotests/061.out
> > @@ -57,7 +57,11 @@ No errors were found on the image.
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
> >  wrote 131072/131072 bytes at offset 0
> >  128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  magic                     0x514649fb
> >  version                   3
> >  backing_file_offset       0x0
> > @@ -215,7 +219,11 @@ No errors were found on the image.
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
> >  wrote 131072/131072 bytes at offset 0
> >  128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  magic                     0x514649fb
> >  version                   3
> >  backing_file_offset       0x0
> > diff --git a/tests/qemu-iotests/137.out b/tests/qemu-iotests/137.out
> > index cf55a41..88c702c 100644
> > --- a/tests/qemu-iotests/137.out
> > +++ b/tests/qemu-iotests/137.out
> > @@ -31,7 +31,11 @@ Cache clean interval too big
> >  Unsupported value 'blubb' for qcow2 option 'overlap-check'. Allowed are 
> > any of the following: none, constant, cached, all
> >  wrote 512/512 bytes at offset 0
> >  512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > -./common.config: Killed                  ( exec "$QEMU_IO_PROG" 
> > $QEMU_IO_OPTIONS "$@" )
> > +./common.config: Killed                  ( if [ "${VALGRIND_QEMU}" == "y" 
> > ]; then
> > +    exec valgrind --log-file="${VALGRIND_LOGFILE}" --error-exitcode=99 
> > "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +else
> > +    exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@";
> > +fi )
> >  incompatible_features     0x0
> >  Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
> >  wrote 65536/65536 bytes at offset 0
> > diff --git a/tests/qemu-iotests/common b/tests/qemu-iotests/common
> > index 25c351b..ff84f4b 100644
> > --- a/tests/qemu-iotests/common
> > +++ b/tests/qemu-iotests/common
> > @@ -41,7 +41,6 @@ sortme=false
> >  expunge=true
> >  have_test_arg=false
> >  randomize=false
> > -valgrind=false
> >  cachemode=false
> >  rm -f $tmp.list $tmp.tmp $tmp.sed
> >  
> > @@ -53,6 +52,7 @@ export CACHEMODE="writeback"
> >  export QEMU_IO_OPTIONS=""
> >  export CACHEMODE_IS_DEFAULT=true
> >  export QEMU_OPTIONS="-nodefaults"
> > +export VALGRIND_QEMU=
> >  
> >  for r
> >  do
> > @@ -278,7 +278,7 @@ testlist options
> >              ;;
> >  
> >          -valgrind)
> > -            valgrind=true
> > +            VALGRIND_QEMU='y'
> >              xpand=false
> >              ;;
> >  
> > @@ -436,8 +436,3 @@ fi
> >  if [ "$IMGPROTO" = "nbd" ] ; then
> >      [ "$QEMU_NBD" = "" ] && _fatal "qemu-nbd not found"
> >  fi
> > -
> > -if $valgrind; then
> > -    export REAL_QEMU_IO="$QEMU_IO_PROG"
> > -    export QEMU_IO_PROG=valgrind_qemu_io
> > -fi
> > diff --git a/tests/qemu-iotests/common.config 
> > b/tests/qemu-iotests/common.config
> > index 4d8665f..db9702b 100644
> > --- a/tests/qemu-iotests/common.config
> > +++ b/tests/qemu-iotests/common.config
> > @@ -122,7 +122,23 @@ _qemu_img_wrapper()
> >  
> >  _qemu_io_wrapper()
> >  {
> > -    (exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@")
> > +    local VALGRIND_LOGFILE=/tmp/$$.valgrind
> > +    local RETVAL
> > +    (
> > +        if [ "${VALGRIND_QEMU}" == "y" ]; then
> > +            exec valgrind --log-file="${VALGRIND_LOGFILE}" 
> > --error-exitcode=99 "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@"
> > +        else
> > +            exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@"
> > +        fi
> > +    )
> > +    RETVAL=$?
> 
> Er, well, this is nice... When just invoking $QEMU_IO -c 'sigraise 9', I
> get the appropriate error message. ("$PID Killed [...]"). But the
> instant an image is opened, it just disappears. Yes, using -c open makes
> it disappear, too.
> 
> Since all of our qemu-io invocations do use image files (that's its
> purpose after all), that means that all of them seem to exit just fine
> when running under valgrind. That is... strange.
> 
> Is it just me? Maybe I have a broken valgrind, I don't know (3.11.0 here).
>

I have valgrind-3.9.0 here, and I get the same behavior... it is not
just you.  There are also some tests where valgrind itself segfaults.

I was going to suggest using kill -l TERM instead of kill -l KILL.
However, I just tried that with test 137, and it causes valgrind to
segfault. :(

> > +    if [ "${VALGRIND_QEMU}" == "y" ]; then
> > +        if [ $RETVAL != 0 ]; then
> > +            cat "${VALGRIND_LOGFILE}"
> 
> If I got the error message and RETVAL would be correctly set to 137,
> this would print the log file. I'm not sure whether that's what we
> want...? If valgrind exits with any error code but 99, the log file will
> probably not contain anything interesting.
> 
> But if the qemu-io process was killed on purpose, this breaks the test,
> which I don't think is necessary.
>

Good point... How about just:

 if [ $RETVAL == 99 ]; then
      cat "${VALGRIND_LOGFILE}"
 fi


> > +        fi
> > +        rm -f "${VALGRIND_LOGFILE}"
> > +    fi
> > +    (exit $RETVAL)
> >  }
> >  
> >  _qemu_nbd_wrapper()
> > diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
> > index 4878e99..d9913f8 100644
> > --- a/tests/qemu-iotests/common.rc
> > +++ b/tests/qemu-iotests/common.rc
> > @@ -70,16 +70,6 @@ else
> >      TEST_IMG=$IMGPROTO:$TEST_DIR/t.$IMGFMT
> >  fi
> >  
> > -function valgrind_qemu_io()
> > -{
> > -    valgrind --log-file=/tmp/$$.valgrind --error-exitcode=99 $REAL_QEMU_IO 
> > "$@"
> > -    if [ $? != 0 ]; then
> > -        cat /tmp/$$.valgrind
> > -    fi
> > -    rm -f /tmp/$$.valgrind
> > -}
> > -
> > -
> >  _optstr_add()
> >  {
> >      if [ -n "$1" ]; then
> > 
> 
> 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]