On 03/09/2017 06:27 PM, Thomas Huth wrote: > To be able to do simple migration tests with kvm-unit-tests, too, > add a helper script that does all the necessary work: Start two > instances of QEMU (source and destination) with QMP sockets for > sending commands to them, then trigger the migration from one > instance to the other and finally signal the end of the migration > to the guest by injecting an NMI. > This helper script is now used automatically for powerpc tests > if the test is put into the "migration" group in the unittests.cfg > file. > > Signed-off-by: Thomas Huth <thuth@xxxxxxxxxx> > --- > powerpc/run | 5 ++++ > scripts/qemu-migration-helper.sh | 51 ++++++++++++++++++++++++++++++++++++++++ > scripts/runtime.bash | 3 +++ > 3 files changed, 59 insertions(+) > create mode 100755 scripts/qemu-migration-helper.sh > > diff --git a/powerpc/run b/powerpc/run > index 6269abb..126fed5 100755 > --- a/powerpc/run > +++ b/powerpc/run > @@ -41,6 +41,11 @@ if ! $qemu -machine '?' 2>&1 | grep 'pseries' > /dev/null; then > exit 2 > fi > > +if [ "$MIGRATION" = "1" ]; then > + export QEMU_BIN="$qemu" > + qemu=`dirname $0`/../scripts/qemu-migration-helper.sh > +fi > + > M='-machine pseries' > M+=",accel=$ACCEL" > command="$qemu -nodefaults $M -bios $FIRMWARE" > diff --git a/scripts/qemu-migration-helper.sh b/scripts/qemu-migration-helper.sh > new file mode 100755 > index 0000000..0cb7e4a > --- /dev/null > +++ b/scripts/qemu-migration-helper.sh > @@ -0,0 +1,51 @@ > +#!/bin/sh > + > +# This script runs two instances of QEMU and then migrates the guest from one > +# instance to the other. The end of the migration is signalled to the guest by > +# injecting an NMI. > + > +if [ "x$QEMU_BIN" = "x" ]; then > + echo "QEMU_BIN must be set to the QEMU binary" > + exit 1 > +fi > + > +if ! command -v nc >/dev/null 2>&1; then > + echo "$0 needs nc (netcat)" > + exit 1 > +fi > + > +qmp_cmd() > +{ > + echo '{ "execute": "qmp_capabilities" }{ "execute":' "$2" '}' | nc -U $1 > +} > + > +tempname=`mktemp` > +qmp1=${tempname}.qmp1 > +qmp2=${tempname}.qmp2 > +qmpout1=${tempname}.qmpout1 > +qmpout2=${tempname}.qmpout2 > +stdout1=${tempname}.stdout1 > +stdout2=${tempname}.stdout2 > +migsock=${tempname}.mig > + > +$QEMU_BIN $* -chardev socket,id=mon1,path=${qmp1},server,nowait \ > + -mon chardev=mon1,mode=control > ${stdout1} & > + > +$QEMU_BIN $* -chardev socket,id=mon2,path=${qmp2},server,nowait \ > + -mon chardev=mon2,mode=control -incoming unix:${migsock} > ${stdout2} & > + > +sleep 1 > + > +qmp_cmd ${qmp1} '"migrate", "arguments": { "uri": "unix:'${migsock}'" }' > ${qmpout1} > +while qmp_cmd ${qmp1} '"query-migrate"' | grep -q '"active"' ; do > + sleep 1 > +done I had to add an extra sleep here, else I was getting : qemu-system-ppc64: Not a migration stream qemu-system-ppc64: load of migration failed: Invalid argument May be the synchronization on completion of the migration needs to be improved. C. > +qmp_cmd ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null > + > +qmp_cmd ${qmp2} '"inject-nmi"'> ${qmpout2} > + > +wait > + > +cat ${stdout1} ${stdout2} > + > +rm -f ${tempname} ${qmpout1} ${qmpout2} ${stdout1} ${stdout2} ${migsock} > diff --git a/scripts/runtime.bash b/scripts/runtime.bash > index 9c1bc3b..b383816 100644 > --- a/scripts/runtime.bash > +++ b/scripts/runtime.bash > @@ -98,6 +98,9 @@ function run() > } > > cmdline=$(get_cmdline $kernel) > + if grep -qw "migration" <<<$groups ; then > + cmdline="MIGRATION=1 $cmdline" > + fi > if [ "$verbose" = "yes" ]; then > echo $cmdline > fi >