* [kvm-unit-tests PATCH v4 1/8] arch-run: Fix TRAP handler recursion to remove temporary files properly
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 2/8] arch-run: Clean up initrd cleanup Nicholas Piggin
` (6 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Migration files were not being removed when the QEMU process is
interrupted (e.g., with ^C). This is becaus the SIGINT propagates to the
bash TRAP handler, which recursively TRAPs due to the 'kill 0' in the
handler. This eventually crashes bash.
This can be observed by interrupting a long-running test program that is
run with MIGRATION=yes, /tmp/mig-helper-* files remain afterwards.
Removing TRAP recursion solves this problem and allows the EXIT handler
to run and clean up the files.
This also moves the trap handler before temp file creation, which closes
the small race between creation trap handler install.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
scripts/arch-run.bash | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index d0864360..11d47a85 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -129,6 +129,9 @@ run_migration ()
return 77
fi
+ trap 'trap - TERM ; kill 0 ; exit 2' INT TERM
+ trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
+
migsock=$(mktemp -u -t mig-helper-socket.XXXXXXXXXX)
migout1=$(mktemp -t mig-helper-stdout1.XXXXXXXXXX)
qmp1=$(mktemp -u -t mig-helper-qmp1.XXXXXXXXXX)
@@ -137,9 +140,6 @@ run_migration ()
qmpout1=/dev/null
qmpout2=/dev/null
- trap 'kill 0; exit 2' INT TERM
- trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
-
eval "$@" -chardev socket,id=mon1,path=${qmp1},server=on,wait=off \
-mon chardev=mon1,mode=control | tee ${migout1} &
live_pid=`jobs -l %+ | grep "eval" | awk '{print$2}'`
@@ -209,11 +209,11 @@ run_panic ()
return 77
fi
- qmp=$(mktemp -u -t panic-qmp.XXXXXXXXXX)
-
- trap 'kill 0; exit 2' INT TERM
+ trap 'trap - TERM ; kill 0 ; exit 2' INT TERM
trap 'rm -f ${qmp}' RETURN EXIT
+ qmp=$(mktemp -u -t panic-qmp.XXXXXXXXXX)
+
# start VM stopped so we don't miss any events
eval "$@" -chardev socket,id=mon1,path=${qmp},server=on,wait=off \
-mon chardev=mon1,mode=control -S &
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* [kvm-unit-tests PATCH v4 2/8] arch-run: Clean up initrd cleanup
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 1/8] arch-run: Fix TRAP handler recursion to remove temporary files properly Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 15:44 ` Thomas Huth
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 3/8] migration: use a more robust way to wait for background job Nicholas Piggin
` (5 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Rather than put a big script into the trap handler, have it call
a function.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
scripts/arch-run.bash | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 11d47a85..c1dd67ab 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -269,10 +269,21 @@ search_qemu_binary ()
export PATH=$save_path
}
+initrd_cleanup ()
+{
+ rm -f $KVM_UNIT_TESTS_ENV
+ if [ "$KVM_UNIT_TESTS_ENV_OLD" ]; then
+ export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD"
+ else
+ unset KVM_UNIT_TESTS_ENV
+ fi
+ unset KVM_UNIT_TESTS_ENV_OLD
+}
+
initrd_create ()
{
if [ "$ENVIRON_DEFAULT" = "yes" ]; then
- trap_exit_push 'rm -f $KVM_UNIT_TESTS_ENV; [ "$KVM_UNIT_TESTS_ENV_OLD" ] && export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD" || unset KVM_UNIT_TESTS_ENV; unset KVM_UNIT_TESTS_ENV_OLD'
+ trap_exit_push 'initrd_cleanup'
[ -f "$KVM_UNIT_TESTS_ENV" ] && export KVM_UNIT_TESTS_ENV_OLD="$KVM_UNIT_TESTS_ENV"
export KVM_UNIT_TESTS_ENV=$(mktemp)
env_params
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [kvm-unit-tests PATCH v4 2/8] arch-run: Clean up initrd cleanup
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 2/8] arch-run: Clean up initrd cleanup Nicholas Piggin
@ 2024-02-09 15:44 ` Thomas Huth
0 siblings, 0 replies; 17+ messages in thread
From: Thomas Huth @ 2024-02-09 15:44 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On 09/02/2024 10.11, Nicholas Piggin wrote:
> Rather than put a big script into the trap handler, have it call
> a function.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> scripts/arch-run.bash | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
> index 11d47a85..c1dd67ab 100644
> --- a/scripts/arch-run.bash
> +++ b/scripts/arch-run.bash
> @@ -269,10 +269,21 @@ search_qemu_binary ()
> export PATH=$save_path
> }
>
> +initrd_cleanup ()
> +{
> + rm -f $KVM_UNIT_TESTS_ENV
> + if [ "$KVM_UNIT_TESTS_ENV_OLD" ]; then
> + export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD"
> + else
> + unset KVM_UNIT_TESTS_ENV
> + fi
> + unset KVM_UNIT_TESTS_ENV_OLD
> +}
> +
> initrd_create ()
> {
> if [ "$ENVIRON_DEFAULT" = "yes" ]; then
> - trap_exit_push 'rm -f $KVM_UNIT_TESTS_ENV; [ "$KVM_UNIT_TESTS_ENV_OLD" ] && export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD" || unset KVM_UNIT_TESTS_ENV; unset KVM_UNIT_TESTS_ENV_OLD'
> + trap_exit_push 'initrd_cleanup'
> [ -f "$KVM_UNIT_TESTS_ENV" ] && export KVM_UNIT_TESTS_ENV_OLD="$KVM_UNIT_TESTS_ENV"
> export KVM_UNIT_TESTS_ENV=$(mktemp)
> env_params
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v4 3/8] migration: use a more robust way to wait for background job
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 1/8] arch-run: Fix TRAP handler recursion to remove temporary files properly Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 2/8] arch-run: Clean up initrd cleanup Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 4/8] migration: Support multiple migrations Nicholas Piggin
` (4 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Starting a pipeline of jobs in the background does not seem to have
a simple way to reliably find the pid of a particular process in the
pipeline (because not all processes are started when the shell
continues to execute).
The way PID of QEMU is derived can result in a failure waiting on a
PID that is not running. This is easier to hit with subsequent
multiple-migration support. Changing this to use $! by swapping the
pipeline for a fifo is more robust.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
scripts/arch-run.bash | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index c1dd67ab..9a5aaddc 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -130,19 +130,22 @@ run_migration ()
fi
trap 'trap - TERM ; kill 0 ; exit 2' INT TERM
- trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
+ trap 'rm -f ${migout1} ${migout_fifo1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
migsock=$(mktemp -u -t mig-helper-socket.XXXXXXXXXX)
migout1=$(mktemp -t mig-helper-stdout1.XXXXXXXXXX)
+ migout_fifo1=$(mktemp -u -t mig-helper-fifo-stdout1.XXXXXXXXXX)
qmp1=$(mktemp -u -t mig-helper-qmp1.XXXXXXXXXX)
qmp2=$(mktemp -u -t mig-helper-qmp2.XXXXXXXXXX)
fifo=$(mktemp -u -t mig-helper-fifo.XXXXXXXXXX)
qmpout1=/dev/null
qmpout2=/dev/null
+ mkfifo ${migout_fifo1}
eval "$@" -chardev socket,id=mon1,path=${qmp1},server=on,wait=off \
- -mon chardev=mon1,mode=control | tee ${migout1} &
- live_pid=`jobs -l %+ | grep "eval" | awk '{print$2}'`
+ -mon chardev=mon1,mode=control > ${migout_fifo1} &
+ live_pid=$!
+ cat ${migout_fifo1} | tee ${migout1} &
# We have to use cat to open the named FIFO, because named FIFO's, unlike
# pipes, will block on open() until the other end is also opened, and that
@@ -150,7 +153,7 @@ run_migration ()
mkfifo ${fifo}
eval "$@" -chardev socket,id=mon2,path=${qmp2},server=on,wait=off \
-mon chardev=mon2,mode=control -incoming unix:${migsock} < <(cat ${fifo}) &
- incoming_pid=`jobs -l %+ | awk '{print$2}'`
+ incoming_pid=$!
# The test must prompt the user to migrate, so wait for the "migrate" keyword
while ! grep -q -i "Now migrate the VM" < ${migout1} ; do
@@ -164,6 +167,10 @@ run_migration ()
sleep 1
done
+ # Wait until the destination has created the incoming and qmp sockets
+ while ! [ -S ${migsock} ] ; do sleep 0.1 ; done
+ while ! [ -S ${qmp2} ] ; do sleep 0.1 ; done
+
qmp ${qmp1} '"migrate", "arguments": { "uri": "unix:'${migsock}'" }' > ${qmpout1}
# Wait for the migration to complete
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* [kvm-unit-tests PATCH v4 4/8] migration: Support multiple migrations
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
` (2 preceding siblings ...)
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 3/8] migration: use a more robust way to wait for background job Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 17:57 ` Thomas Huth
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 5/8] arch-run: rename migration variables Nicholas Piggin
` (3 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Support multiple migrations by flipping dest file/socket variables to
source after the migration is complete, ready to start again. A new
destination is created if the test outputs the migrate line again.
Test cases may now switch to calling migrate() one or more times.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
lib/migrate.c | 8 ++--
lib/migrate.h | 1 +
scripts/arch-run.bash | 86 ++++++++++++++++++++++++++++++++++++-------
3 files changed, 77 insertions(+), 18 deletions(-)
diff --git a/lib/migrate.c b/lib/migrate.c
index 527e63ae..b7721659 100644
--- a/lib/migrate.c
+++ b/lib/migrate.c
@@ -8,8 +8,10 @@
#include <libcflat.h>
#include "migrate.h"
-/* static for now since we only support migrating exactly once per test. */
-static void migrate(void)
+/*
+ * Initiate migration and wait for it to complete.
+ */
+void migrate(void)
{
puts("Now migrate the VM, then press a key to continue...\n");
(void)getchar();
@@ -19,8 +21,6 @@ static void migrate(void)
/*
* Initiate migration and wait for it to complete.
* If this function is called more than once, it is a no-op.
- * Since migrate_cmd can only migrate exactly once this function can
- * simplify the control flow, especially when skipping tests.
*/
void migrate_once(void)
{
diff --git a/lib/migrate.h b/lib/migrate.h
index 3c94e6af..2af06a72 100644
--- a/lib/migrate.h
+++ b/lib/migrate.h
@@ -6,4 +6,5 @@
* Author: Nico Boehr <nrb@linux.ibm.com>
*/
+void migrate(void);
void migrate_once(void);
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 9a5aaddc..c2002d7a 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -129,12 +129,16 @@ run_migration ()
return 77
fi
+ migcmdline=$@
+
trap 'trap - TERM ; kill 0 ; exit 2' INT TERM
- trap 'rm -f ${migout1} ${migout_fifo1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
+ trap 'rm -f ${migout1} ${migout2} ${migout_fifo1} ${migout_fifo2} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
migsock=$(mktemp -u -t mig-helper-socket.XXXXXXXXXX)
migout1=$(mktemp -t mig-helper-stdout1.XXXXXXXXXX)
migout_fifo1=$(mktemp -u -t mig-helper-fifo-stdout1.XXXXXXXXXX)
+ migout2=$(mktemp -t mig-helper-stdout2.XXXXXXXXXX)
+ migout_fifo2=$(mktemp -u -t mig-helper-fifo-stdout2.XXXXXXXXXX)
qmp1=$(mktemp -u -t mig-helper-qmp1.XXXXXXXXXX)
qmp2=$(mktemp -u -t mig-helper-qmp2.XXXXXXXXXX)
fifo=$(mktemp -u -t mig-helper-fifo.XXXXXXXXXX)
@@ -142,20 +146,54 @@ run_migration ()
qmpout2=/dev/null
mkfifo ${migout_fifo1}
- eval "$@" -chardev socket,id=mon1,path=${qmp1},server=on,wait=off \
+ mkfifo ${migout_fifo2}
+
+ eval "$migcmdline" \
+ -chardev socket,id=mon1,path=${qmp1},server=on,wait=off \
-mon chardev=mon1,mode=control > ${migout_fifo1} &
live_pid=$!
cat ${migout_fifo1} | tee ${migout1} &
- # We have to use cat to open the named FIFO, because named FIFO's, unlike
- # pipes, will block on open() until the other end is also opened, and that
- # totally breaks QEMU...
+ # Start the first destination QEMU machine in advance of the test
+ # reaching the migration point, since we expect at least one migration.
+ # Then destination machines are started after the test outputs
+ # subsequent "Now migrate the VM" messages.
+ do_migration || return $?
+
+ while ps -p ${live_pid} > /dev/null ; do
+ # Wait for test exit or further migration messages.
+ if ! grep -q -i "Now migrate the VM" < ${migout1} ; then
+ sleep 0.1
+ else
+ do_migration || return $?
+ fi
+ done
+
+ wait ${live_pid}
+ ret=$?
+
+ while (( $(jobs -r | wc -l) > 0 )); do
+ sleep 0.1
+ done
+
+ return $ret
+}
+
+do_migration ()
+{
+ # We have to use cat to open the named FIFO, because named FIFO's,
+ # unlike pipes, will block on open() until the other end is also
+ # opened, and that totally breaks QEMU...
mkfifo ${fifo}
- eval "$@" -chardev socket,id=mon2,path=${qmp2},server=on,wait=off \
- -mon chardev=mon2,mode=control -incoming unix:${migsock} < <(cat ${fifo}) &
+ eval "$migcmdline" \
+ -chardev socket,id=mon2,path=${qmp2},server=on,wait=off \
+ -mon chardev=mon2,mode=control -incoming unix:${migsock} \
+ < <(cat ${fifo}) > ${migout_fifo2} &
incoming_pid=$!
+ cat ${migout_fifo2} | tee ${migout2} &
- # The test must prompt the user to migrate, so wait for the "migrate" keyword
+ # The test must prompt the user to migrate, so wait for the
+ # "Now migrate VM" console message.
while ! grep -q -i "Now migrate the VM" < ${migout1} ; do
if ! ps -p ${live_pid} > /dev/null ; then
echo "ERROR: Test exit before migration point." >&2
@@ -164,7 +202,7 @@ run_migration ()
qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
return 3
fi
- sleep 1
+ sleep 0.1
done
# Wait until the destination has created the incoming and qmp sockets
@@ -176,7 +214,7 @@ run_migration ()
# Wait for the migration to complete
migstatus=`qmp ${qmp1} '"query-migrate"' | grep return`
while ! grep -q '"completed"' <<<"$migstatus" ; do
- sleep 1
+ sleep 0.1
if ! migstatus=`qmp ${qmp1} '"query-migrate"'`; then
echo "ERROR: Querying migration state failed." >&2
echo > ${fifo}
@@ -192,14 +230,34 @@ run_migration ()
return 2
fi
done
+
qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
+
+ # keypress to dst so getchar completes and test continues
echo > ${fifo}
- wait $incoming_pid
+ rm ${fifo}
+
+ # Ensure the incoming socket is removed, ready for next destination
+ if [ -S ${migsock} ] ; then
+ echo "ERROR: Incoming migration socket not removed after migration." >& 2
+ qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
+ return 2
+ fi
+
+ wait ${live_pid}
ret=$?
- while (( $(jobs -r | wc -l) > 0 )); do
- sleep 0.5
- done
+ # Now flip the variables because dest becomes source
+ live_pid=${incoming_pid}
+ tmp=${migout1}
+ migout1=${migout2}
+ migout2=${tmp}
+ tmp=${migout_fifo1}
+ migout_fifo1=${migout_fifo2}
+ migout_fifo2=${tmp}
+ tmp=${qmp1}
+ qmp1=${qmp2}
+ qmp2=${tmp}
return $ret
}
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [kvm-unit-tests PATCH v4 4/8] migration: Support multiple migrations
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 4/8] migration: Support multiple migrations Nicholas Piggin
@ 2024-02-09 17:57 ` Thomas Huth
0 siblings, 0 replies; 17+ messages in thread
From: Thomas Huth @ 2024-02-09 17:57 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On 09/02/2024 10.11, Nicholas Piggin wrote:
> Support multiple migrations by flipping dest file/socket variables to
> source after the migration is complete, ready to start again. A new
> destination is created if the test outputs the migrate line again.
> Test cases may now switch to calling migrate() one or more times.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> lib/migrate.c | 8 ++--
> lib/migrate.h | 1 +
> scripts/arch-run.bash | 86 ++++++++++++++++++++++++++++++++++++-------
> 3 files changed, 77 insertions(+), 18 deletions(-)
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v4 5/8] arch-run: rename migration variables
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
` (3 preceding siblings ...)
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 4/8] migration: Support multiple migrations Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 6/8] migration: Add quiet migration support Nicholas Piggin
` (2 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Using 1 and 2 for source and destination is confusing, particularly
now with multiple migrations that flip between them. Do a rename
pass to 'src' and 'dst' to tidy things up.
Acked-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
scripts/arch-run.bash | 111 +++++++++++++++++++++---------------------
1 file changed, 56 insertions(+), 55 deletions(-)
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index c2002d7a..c98429e8 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -132,27 +132,27 @@ run_migration ()
migcmdline=$@
trap 'trap - TERM ; kill 0 ; exit 2' INT TERM
- trap 'rm -f ${migout1} ${migout2} ${migout_fifo1} ${migout_fifo2} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
-
- migsock=$(mktemp -u -t mig-helper-socket.XXXXXXXXXX)
- migout1=$(mktemp -t mig-helper-stdout1.XXXXXXXXXX)
- migout_fifo1=$(mktemp -u -t mig-helper-fifo-stdout1.XXXXXXXXXX)
- migout2=$(mktemp -t mig-helper-stdout2.XXXXXXXXXX)
- migout_fifo2=$(mktemp -u -t mig-helper-fifo-stdout2.XXXXXXXXXX)
- qmp1=$(mktemp -u -t mig-helper-qmp1.XXXXXXXXXX)
- qmp2=$(mktemp -u -t mig-helper-qmp2.XXXXXXXXXX)
- fifo=$(mktemp -u -t mig-helper-fifo.XXXXXXXXXX)
- qmpout1=/dev/null
- qmpout2=/dev/null
-
- mkfifo ${migout_fifo1}
- mkfifo ${migout_fifo2}
+ trap 'rm -f ${src_out} ${dst_out} ${src_outfifo} ${dst_outfifo} ${dst_incoming} ${src_qmp} ${dst_qmp} ${dst_infifo}' RETURN EXIT
+
+ dst_incoming=$(mktemp -u -t mig-helper-socket-incoming.XXXXXXXXXX)
+ src_out=$(mktemp -t mig-helper-stdout1.XXXXXXXXXX)
+ src_outfifo=$(mktemp -u -t mig-helper-fifo-stdout1.XXXXXXXXXX)
+ dst_out=$(mktemp -t mig-helper-stdout2.XXXXXXXXXX)
+ dst_outfifo=$(mktemp -u -t mig-helper-fifo-stdout2.XXXXXXXXXX)
+ src_qmp=$(mktemp -u -t mig-helper-qmp1.XXXXXXXXXX)
+ dst_qmp=$(mktemp -u -t mig-helper-qmp2.XXXXXXXXXX)
+ dst_infifo=$(mktemp -u -t mig-helper-fifo-stdin.XXXXXXXXXX)
+ src_qmpout=/dev/null
+ dst_qmpout=/dev/null
+
+ mkfifo ${src_outfifo}
+ mkfifo ${dst_outfifo}
eval "$migcmdline" \
- -chardev socket,id=mon1,path=${qmp1},server=on,wait=off \
- -mon chardev=mon1,mode=control > ${migout_fifo1} &
+ -chardev socket,id=mon,path=${src_qmp},server=on,wait=off \
+ -mon chardev=mon,mode=control > ${src_outfifo} &
live_pid=$!
- cat ${migout_fifo1} | tee ${migout1} &
+ cat ${src_outfifo} | tee ${src_out} &
# Start the first destination QEMU machine in advance of the test
# reaching the migration point, since we expect at least one migration.
@@ -162,7 +162,7 @@ run_migration ()
while ps -p ${live_pid} > /dev/null ; do
# Wait for test exit or further migration messages.
- if ! grep -q -i "Now migrate the VM" < ${migout1} ; then
+ if ! grep -q -i "Now migrate the VM" < ${src_out} ; then
sleep 0.1
else
do_migration || return $?
@@ -184,80 +184,81 @@ do_migration ()
# We have to use cat to open the named FIFO, because named FIFO's,
# unlike pipes, will block on open() until the other end is also
# opened, and that totally breaks QEMU...
- mkfifo ${fifo}
+ mkfifo ${dst_infifo}
eval "$migcmdline" \
- -chardev socket,id=mon2,path=${qmp2},server=on,wait=off \
- -mon chardev=mon2,mode=control -incoming unix:${migsock} \
- < <(cat ${fifo}) > ${migout_fifo2} &
+ -chardev socket,id=mon,path=${dst_qmp},server=on,wait=off \
+ -mon chardev=mon,mode=control -incoming unix:${dst_incoming} \
+ < <(cat ${dst_infifo}) > ${dst_outfifo} &
incoming_pid=$!
- cat ${migout_fifo2} | tee ${migout2} &
+ cat ${dst_outfifo} | tee ${dst_out} &
# The test must prompt the user to migrate, so wait for the
# "Now migrate VM" console message.
- while ! grep -q -i "Now migrate the VM" < ${migout1} ; do
+ while ! grep -q -i "Now migrate the VM" < ${src_out} ; do
if ! ps -p ${live_pid} > /dev/null ; then
echo "ERROR: Test exit before migration point." >&2
- echo > ${fifo}
- qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
- qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
+ echo > ${dst_infifo}
+ qmp ${src_qmp} '"quit"'> ${src_qmpout} 2>/dev/null
+ qmp ${dst_qmp} '"quit"'> ${dst_qmpout} 2>/dev/null
return 3
fi
sleep 0.1
done
# Wait until the destination has created the incoming and qmp sockets
- while ! [ -S ${migsock} ] ; do sleep 0.1 ; done
- while ! [ -S ${qmp2} ] ; do sleep 0.1 ; done
+ while ! [ -S ${dst_incoming} ] ; do sleep 0.1 ; done
+ while ! [ -S ${dst_qmp} ] ; do sleep 0.1 ; done
- qmp ${qmp1} '"migrate", "arguments": { "uri": "unix:'${migsock}'" }' > ${qmpout1}
+ qmp ${src_qmp} '"migrate", "arguments": { "uri": "unix:'${dst_incoming}'" }' > ${src_qmpout}
# Wait for the migration to complete
- migstatus=`qmp ${qmp1} '"query-migrate"' | grep return`
+ migstatus=`qmp ${src_qmp} '"query-migrate"' | grep return`
while ! grep -q '"completed"' <<<"$migstatus" ; do
sleep 0.1
- if ! migstatus=`qmp ${qmp1} '"query-migrate"'`; then
+ if ! migstatus=`qmp ${src_qmp} '"query-migrate"'`; then
echo "ERROR: Querying migration state failed." >&2
- echo > ${fifo}
- qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
+ echo > ${dst_infifo}
+ qmp ${dst_qmp} '"quit"'> ${dst_qmpout} 2>/dev/null
return 2
fi
migstatus=`grep return <<<"$migstatus"`
if grep -q '"failed"' <<<"$migstatus"; then
echo "ERROR: Migration failed." >&2
- echo > ${fifo}
- qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
- qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
+ echo > ${dst_infifo}
+ qmp ${src_qmp} '"quit"'> ${src_qmpout} 2>/dev/null
+ qmp ${dst_qmp} '"quit"'> ${dst_qmpout} 2>/dev/null
return 2
fi
done
- qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
+ qmp ${src_qmp} '"quit"'> ${src_qmpout} 2>/dev/null
# keypress to dst so getchar completes and test continues
- echo > ${fifo}
- rm ${fifo}
+ echo > ${dst_infifo}
+ rm ${dst_infifo}
# Ensure the incoming socket is removed, ready for next destination
- if [ -S ${migsock} ] ; then
+ if [ -S ${dst_incoming} ] ; then
echo "ERROR: Incoming migration socket not removed after migration." >& 2
- qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null
+ qmp ${dst_qmp} '"quit"'> ${dst_qmpout} 2>/dev/null
return 2
fi
wait ${live_pid}
ret=$?
- # Now flip the variables because dest becomes source
+ # Now flip the variables because destination machine becomes source
+ # for the next migration.
live_pid=${incoming_pid}
- tmp=${migout1}
- migout1=${migout2}
- migout2=${tmp}
- tmp=${migout_fifo1}
- migout_fifo1=${migout_fifo2}
- migout_fifo2=${tmp}
- tmp=${qmp1}
- qmp1=${qmp2}
- qmp2=${tmp}
+ tmp=${src_out}
+ src_out=${dst_out}
+ dst_out=${tmp}
+ tmp=${src_outfifo}
+ src_outfifo=${dst_outfifo}
+ dst_outfifo=${tmp}
+ tmp=${src_qmp}
+ src_qmp=${dst_qmp}
+ dst_qmp=${tmp}
return $ret
}
@@ -280,8 +281,8 @@ run_panic ()
qmp=$(mktemp -u -t panic-qmp.XXXXXXXXXX)
# start VM stopped so we don't miss any events
- eval "$@" -chardev socket,id=mon1,path=${qmp},server=on,wait=off \
- -mon chardev=mon1,mode=control -S &
+ eval "$@" -chardev socket,id=mon,path=${qmp},server=on,wait=off \
+ -mon chardev=mon,mode=control -S &
panic_event_count=$(qmp_events ${qmp} | jq -c 'select(.event == "GUEST_PANICKED")' | wc -l)
if [ "$panic_event_count" -lt 1 ]; then
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* [kvm-unit-tests PATCH v4 6/8] migration: Add quiet migration support
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
` (4 preceding siblings ...)
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 5/8] arch-run: rename migration variables Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 18:09 ` Thomas Huth
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 7/8] Add common/ directory for architecture-independent tests Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest Nicholas Piggin
7 siblings, 1 reply; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Console output required to support migration becomes quite noisy
when doing lots of migrations. Provide a migrate_quiet() call that
suppresses console output and doesn't log a message.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
lib/migrate.c | 11 +++++++++++
lib/migrate.h | 1 +
scripts/arch-run.bash | 4 ++--
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/lib/migrate.c b/lib/migrate.c
index b7721659..92d1d957 100644
--- a/lib/migrate.c
+++ b/lib/migrate.c
@@ -18,6 +18,17 @@ void migrate(void)
report_info("Migration complete");
}
+/*
+ * Like migrate() but suppress output and logs, useful for intensive
+ * migration stress testing without polluting logs. Test cases should
+ * provide relevant information about migration in failure reports.
+ */
+void migrate_quiet(void)
+{
+ puts("Now migrate the VM (quiet)\n");
+ (void)getchar();
+}
+
/*
* Initiate migration and wait for it to complete.
* If this function is called more than once, it is a no-op.
diff --git a/lib/migrate.h b/lib/migrate.h
index 2af06a72..95b9102b 100644
--- a/lib/migrate.h
+++ b/lib/migrate.h
@@ -7,4 +7,5 @@
*/
void migrate(void);
+void migrate_quiet(void);
void migrate_once(void);
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index c98429e8..0a98e512 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -152,7 +152,7 @@ run_migration ()
-chardev socket,id=mon,path=${src_qmp},server=on,wait=off \
-mon chardev=mon,mode=control > ${src_outfifo} &
live_pid=$!
- cat ${src_outfifo} | tee ${src_out} &
+ cat ${src_outfifo} | tee ${src_out} | grep -v "Now migrate the VM (quiet)" &
# Start the first destination QEMU machine in advance of the test
# reaching the migration point, since we expect at least one migration.
@@ -190,7 +190,7 @@ do_migration ()
-mon chardev=mon,mode=control -incoming unix:${dst_incoming} \
< <(cat ${dst_infifo}) > ${dst_outfifo} &
incoming_pid=$!
- cat ${dst_outfifo} | tee ${dst_out} &
+ cat ${dst_outfifo} | tee ${dst_out} | grep -v "Now migrate the VM (quiet)" &
# The test must prompt the user to migrate, so wait for the
# "Now migrate VM" console message.
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [kvm-unit-tests PATCH v4 6/8] migration: Add quiet migration support
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 6/8] migration: Add quiet migration support Nicholas Piggin
@ 2024-02-09 18:09 ` Thomas Huth
0 siblings, 0 replies; 17+ messages in thread
From: Thomas Huth @ 2024-02-09 18:09 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On 09/02/2024 10.11, Nicholas Piggin wrote:
> Console output required to support migration becomes quite noisy
> when doing lots of migrations. Provide a migrate_quiet() call that
> suppresses console output and doesn't log a message.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> lib/migrate.c | 11 +++++++++++
> lib/migrate.h | 1 +
> scripts/arch-run.bash | 4 ++--
> 3 files changed, 14 insertions(+), 2 deletions(-)
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v4 7/8] Add common/ directory for architecture-independent tests
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
` (5 preceding siblings ...)
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 6/8] migration: Add quiet migration support Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest Nicholas Piggin
7 siblings, 0 replies; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
x86/sieve.c is used by s390x, arm, and riscv via symbolic link. Make a
new directory common/ for architecture-independent tests and move
sieve.c here.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arm/sieve.c | 2 +-
common/sieve.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++
riscv/sieve.c | 2 +-
s390x/sieve.c | 2 +-
x86/sieve.c | 52 +-------------------------------------------------
5 files changed, 55 insertions(+), 54 deletions(-)
create mode 100644 common/sieve.c
mode change 100644 => 120000 x86/sieve.c
diff --git a/arm/sieve.c b/arm/sieve.c
index 8f14a5c3..fe299f30 120000
--- a/arm/sieve.c
+++ b/arm/sieve.c
@@ -1 +1 @@
-../x86/sieve.c
\ No newline at end of file
+../common/sieve.c
\ No newline at end of file
diff --git a/common/sieve.c b/common/sieve.c
new file mode 100644
index 00000000..8150f2d9
--- /dev/null
+++ b/common/sieve.c
@@ -0,0 +1,51 @@
+#include "alloc.h"
+#include "libcflat.h"
+
+static int sieve(char* data, int size)
+{
+ int i, j, r = 0;
+
+ for (i = 0; i < size; ++i)
+ data[i] = 1;
+
+ data[0] = data[1] = 0;
+
+ for (i = 2; i < size; ++i)
+ if (data[i]) {
+ ++r;
+ for (j = i*2; j < size; j += i)
+ data[j] = 0;
+ }
+ return r;
+}
+
+static void test_sieve(const char *msg, char *data, int size)
+{
+ int r;
+
+ printf("%s:", msg);
+ r = sieve(data, size);
+ printf("%d out of %d\n", r, size);
+}
+
+#define STATIC_SIZE 1000000
+#define VSIZE 100000000
+char static_data[STATIC_SIZE];
+
+int main(void)
+{
+ void *v;
+ int i;
+
+ printf("starting sieve\n");
+ test_sieve("static", static_data, STATIC_SIZE);
+ setup_vm();
+ test_sieve("mapped", static_data, STATIC_SIZE);
+ for (i = 0; i < 3; ++i) {
+ v = malloc(VSIZE);
+ test_sieve("virtual", v, VSIZE);
+ free(v);
+ }
+
+ return 0;
+}
diff --git a/riscv/sieve.c b/riscv/sieve.c
index 8f14a5c3..fe299f30 120000
--- a/riscv/sieve.c
+++ b/riscv/sieve.c
@@ -1 +1 @@
-../x86/sieve.c
\ No newline at end of file
+../common/sieve.c
\ No newline at end of file
diff --git a/s390x/sieve.c b/s390x/sieve.c
index 8f14a5c3..fe299f30 120000
--- a/s390x/sieve.c
+++ b/s390x/sieve.c
@@ -1 +1 @@
-../x86/sieve.c
\ No newline at end of file
+../common/sieve.c
\ No newline at end of file
diff --git a/x86/sieve.c b/x86/sieve.c
deleted file mode 100644
index 8150f2d9..00000000
--- a/x86/sieve.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "alloc.h"
-#include "libcflat.h"
-
-static int sieve(char* data, int size)
-{
- int i, j, r = 0;
-
- for (i = 0; i < size; ++i)
- data[i] = 1;
-
- data[0] = data[1] = 0;
-
- for (i = 2; i < size; ++i)
- if (data[i]) {
- ++r;
- for (j = i*2; j < size; j += i)
- data[j] = 0;
- }
- return r;
-}
-
-static void test_sieve(const char *msg, char *data, int size)
-{
- int r;
-
- printf("%s:", msg);
- r = sieve(data, size);
- printf("%d out of %d\n", r, size);
-}
-
-#define STATIC_SIZE 1000000
-#define VSIZE 100000000
-char static_data[STATIC_SIZE];
-
-int main(void)
-{
- void *v;
- int i;
-
- printf("starting sieve\n");
- test_sieve("static", static_data, STATIC_SIZE);
- setup_vm();
- test_sieve("mapped", static_data, STATIC_SIZE);
- for (i = 0; i < 3; ++i) {
- v = malloc(VSIZE);
- test_sieve("virtual", v, VSIZE);
- free(v);
- }
-
- return 0;
-}
diff --git a/x86/sieve.c b/x86/sieve.c
new file mode 120000
index 00000000..fe299f30
--- /dev/null
+++ b/x86/sieve.c
@@ -0,0 +1 @@
+../common/sieve.c
\ No newline at end of file
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest
2024-02-09 9:11 [kvm-unit-tests PATCH v4 0/8] Multi-migration support Nicholas Piggin
` (6 preceding siblings ...)
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 7/8] Add common/ directory for architecture-independent tests Nicholas Piggin
@ 2024-02-09 9:11 ` Nicholas Piggin
2024-02-16 11:15 ` Thomas Huth
2024-02-16 14:05 ` Thomas Huth
7 siblings, 2 replies; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-09 9:11 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Nicholas Piggin,
Andrew Jones, Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm,
Paolo Bonzini, Claudio Imbrenda, Alexandru Elisei
Add a selftest for migration support in guest library and test harness
code. It performs migrations in a tight loop to irritate races and bugs
in the test harness code.
Include the test in arm, s390, powerpc.
Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com> (s390x)
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arm/Makefile.common | 1 +
arm/selftest-migration.c | 1 +
arm/unittests.cfg | 6 ++++++
common/selftest-migration.c | 34 ++++++++++++++++++++++++++++++++++
powerpc/Makefile.common | 1 +
powerpc/selftest-migration.c | 1 +
powerpc/unittests.cfg | 4 ++++
s390x/Makefile | 1 +
s390x/selftest-migration.c | 1 +
s390x/unittests.cfg | 4 ++++
10 files changed, 54 insertions(+)
create mode 120000 arm/selftest-migration.c
create mode 100644 common/selftest-migration.c
create mode 120000 powerpc/selftest-migration.c
create mode 120000 s390x/selftest-migration.c
diff --git a/arm/Makefile.common b/arm/Makefile.common
index f828dbe0..f107c478 100644
--- a/arm/Makefile.common
+++ b/arm/Makefile.common
@@ -5,6 +5,7 @@
#
tests-common = $(TEST_DIR)/selftest.$(exe)
+tests-common += $(TEST_DIR)/selftest-migration.$(exe)
tests-common += $(TEST_DIR)/spinlock-test.$(exe)
tests-common += $(TEST_DIR)/pci-test.$(exe)
tests-common += $(TEST_DIR)/pmu.$(exe)
diff --git a/arm/selftest-migration.c b/arm/selftest-migration.c
new file mode 120000
index 00000000..bd1eb266
--- /dev/null
+++ b/arm/selftest-migration.c
@@ -0,0 +1 @@
+../common/selftest-migration.c
\ No newline at end of file
diff --git a/arm/unittests.cfg b/arm/unittests.cfg
index fe601cbb..db0e4c9b 100644
--- a/arm/unittests.cfg
+++ b/arm/unittests.cfg
@@ -55,6 +55,12 @@ smp = $MAX_SMP
extra_params = -append 'smp'
groups = selftest
+# Test migration
+[selftest-migration]
+file = selftest-migration.flat
+groups = selftest migration
+arch = arm64
+
# Test PCI emulation
[pci-test]
file = pci-test.flat
diff --git a/common/selftest-migration.c b/common/selftest-migration.c
new file mode 100644
index 00000000..f70c505f
--- /dev/null
+++ b/common/selftest-migration.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Machine independent migration tests
+ *
+ * This is just a very simple test that is intended to stress the migration
+ * support in the test harness. This could be expanded to test more guest
+ * library code, but architecture-specific tests should be used to test
+ * migration of tricky machine state.
+ */
+#include <libcflat.h>
+#include <migrate.h>
+
+#if defined(__arm__) || defined(__aarch64__)
+/* arm can only call getchar 15 times */
+#define NR_MIGRATIONS 15
+#else
+#define NR_MIGRATIONS 100
+#endif
+
+int main(int argc, char **argv)
+{
+ int i = 0;
+
+ report_prefix_push("migration");
+
+ for (i = 0; i < NR_MIGRATIONS; i++)
+ migrate_quiet();
+
+ report(true, "simple harness stress test");
+
+ report_prefix_pop();
+
+ return report_summary();
+}
diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
index eb88398d..da4a7bbb 100644
--- a/powerpc/Makefile.common
+++ b/powerpc/Makefile.common
@@ -6,6 +6,7 @@
tests-common = \
$(TEST_DIR)/selftest.elf \
+ $(TEST_DIR)/selftest-migration.elf \
$(TEST_DIR)/spapr_hcall.elf \
$(TEST_DIR)/rtas.elf \
$(TEST_DIR)/emulator.elf \
diff --git a/powerpc/selftest-migration.c b/powerpc/selftest-migration.c
new file mode 120000
index 00000000..bd1eb266
--- /dev/null
+++ b/powerpc/selftest-migration.c
@@ -0,0 +1 @@
+../common/selftest-migration.c
\ No newline at end of file
diff --git a/powerpc/unittests.cfg b/powerpc/unittests.cfg
index e71140aa..7ce57de0 100644
--- a/powerpc/unittests.cfg
+++ b/powerpc/unittests.cfg
@@ -36,6 +36,10 @@ smp = 2
extra_params = -m 256 -append 'setup smp=2 mem=256'
groups = selftest
+[selftest-migration]
+file = selftest-migration.elf
+groups = selftest migration
+
[spapr_hcall]
file = spapr_hcall.elf
diff --git a/s390x/Makefile b/s390x/Makefile
index b72f7578..344d46d6 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -1,4 +1,5 @@
tests = $(TEST_DIR)/selftest.elf
+tests += $(TEST_DIR)/selftest-migration.elf
tests += $(TEST_DIR)/intercept.elf
tests += $(TEST_DIR)/emulator.elf
tests += $(TEST_DIR)/sieve.elf
diff --git a/s390x/selftest-migration.c b/s390x/selftest-migration.c
new file mode 120000
index 00000000..bd1eb266
--- /dev/null
+++ b/s390x/selftest-migration.c
@@ -0,0 +1 @@
+../common/selftest-migration.c
\ No newline at end of file
diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg
index f5024b6e..a7ad522c 100644
--- a/s390x/unittests.cfg
+++ b/s390x/unittests.cfg
@@ -24,6 +24,10 @@ groups = selftest
# please keep the kernel cmdline in sync with $(TEST_DIR)/selftest.parmfile
extra_params = -append 'test 123'
+[selftest-migration]
+file = selftest-migration.elf
+groups = selftest migration
+
[intercept]
file = intercept.elf
--
2.42.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest Nicholas Piggin
@ 2024-02-16 11:15 ` Thomas Huth
2024-02-17 7:19 ` Nicholas Piggin
2024-02-16 14:05 ` Thomas Huth
1 sibling, 1 reply; 17+ messages in thread
From: Thomas Huth @ 2024-02-16 11:15 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On 09/02/2024 10.11, Nicholas Piggin wrote:
> Add a selftest for migration support in guest library and test harness
> code. It performs migrations in a tight loop to irritate races and bugs
> in the test harness code.
>
> Include the test in arm, s390, powerpc.
>
> Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com> (s390x)
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arm/Makefile.common | 1 +
> arm/selftest-migration.c | 1 +
> arm/unittests.cfg | 6 ++++++
Hi Nicholas,
I just gave the patches a try, but the arm test seems to fail for me: Only
the first getchar() seems to wait for a character, all the subsequent ones
don't wait anymore and just continue immediately ... is this working for
you? Or do I need another patch on top?
Thanks,
Thomas
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest
2024-02-16 11:15 ` Thomas Huth
@ 2024-02-17 7:19 ` Nicholas Piggin
2024-02-19 6:56 ` Thomas Huth
0 siblings, 1 reply; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-17 7:19 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On Fri Feb 16, 2024 at 9:15 PM AEST, Thomas Huth wrote:
> On 09/02/2024 10.11, Nicholas Piggin wrote:
> > Add a selftest for migration support in guest library and test harness
> > code. It performs migrations in a tight loop to irritate races and bugs
> > in the test harness code.
> >
> > Include the test in arm, s390, powerpc.
> >
> > Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com> (s390x)
> > Reviewed-by: Thomas Huth <thuth@redhat.com>
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> > ---
> > arm/Makefile.common | 1 +
> > arm/selftest-migration.c | 1 +
> > arm/unittests.cfg | 6 ++++++
>
> Hi Nicholas,
>
> I just gave the patches a try, but the arm test seems to fail for me: Only
> the first getchar() seems to wait for a character, all the subsequent ones
> don't wait anymore and just continue immediately ... is this working for
> you? Or do I need another patch on top?
Hey sorry missed this comment....
It does seem to work for me, I've mostly tested pseries but I did test
others too (that's how I saw the arm getchar limit).
How are you observing it not waiting for migration? I put some sleeps in
the migration script before echo'ing to the console input and it seems
to be doing the right thing. Admittedly the test contains no way to
programaticaly verify the machine was migrated the expected number of
times, it would be nice to try to match that up somehow.
Thanks,
Nick
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest
2024-02-17 7:19 ` Nicholas Piggin
@ 2024-02-19 6:56 ` Thomas Huth
2024-02-19 12:02 ` Nicholas Piggin
0 siblings, 1 reply; 17+ messages in thread
From: Thomas Huth @ 2024-02-19 6:56 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On 17/02/2024 08.19, Nicholas Piggin wrote:
> On Fri Feb 16, 2024 at 9:15 PM AEST, Thomas Huth wrote:
>> On 09/02/2024 10.11, Nicholas Piggin wrote:
>>> Add a selftest for migration support in guest library and test harness
>>> code. It performs migrations in a tight loop to irritate races and bugs
>>> in the test harness code.
>>>
>>> Include the test in arm, s390, powerpc.
>>>
>>> Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com> (s390x)
>>> Reviewed-by: Thomas Huth <thuth@redhat.com>
>>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>>> ---
>>> arm/Makefile.common | 1 +
>>> arm/selftest-migration.c | 1 +
>>> arm/unittests.cfg | 6 ++++++
>>
>> Hi Nicholas,
>>
>> I just gave the patches a try, but the arm test seems to fail for me: Only
>> the first getchar() seems to wait for a character, all the subsequent ones
>> don't wait anymore and just continue immediately ... is this working for
>> you? Or do I need another patch on top?
>
> Hey sorry missed this comment....
>
> It does seem to work for me, I've mostly tested pseries but I did test
> others too (that's how I saw the arm getchar limit).
>
> How are you observing it not waiting for migration?
According to you other mail, I think you figured it out already, but just
for the records: You can see it when running the guest manually, e.g.
something like:
qemu-system-aarch64 -nodefaults -machine virt -accel tcg -cpu cortex-a57 \
-device virtio-serial-device -device virtconsole,chardev=ctd \
-chardev testdev,id=ctd -device pci-testdev -display none \
-serial mon:stdio -kernel arm/selftest-migration.flat -smp 1
Without my "lib/arm/io: Fix calling getchar() multiple times" patch, the
guest only waits during the first getchar(), all the others simply return
immediately.
Thomas
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest
2024-02-19 6:56 ` Thomas Huth
@ 2024-02-19 12:02 ` Nicholas Piggin
0 siblings, 0 replies; 17+ messages in thread
From: Nicholas Piggin @ 2024-02-19 12:02 UTC (permalink / raw)
To: Thomas Huth
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On Mon Feb 19, 2024 at 4:56 PM AEST, Thomas Huth wrote:
> On 17/02/2024 08.19, Nicholas Piggin wrote:
> > On Fri Feb 16, 2024 at 9:15 PM AEST, Thomas Huth wrote:
> >> On 09/02/2024 10.11, Nicholas Piggin wrote:
> >>> Add a selftest for migration support in guest library and test harness
> >>> code. It performs migrations in a tight loop to irritate races and bugs
> >>> in the test harness code.
> >>>
> >>> Include the test in arm, s390, powerpc.
> >>>
> >>> Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com> (s390x)
> >>> Reviewed-by: Thomas Huth <thuth@redhat.com>
> >>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> >>> ---
> >>> arm/Makefile.common | 1 +
> >>> arm/selftest-migration.c | 1 +
> >>> arm/unittests.cfg | 6 ++++++
> >>
> >> Hi Nicholas,
> >>
> >> I just gave the patches a try, but the arm test seems to fail for me: Only
> >> the first getchar() seems to wait for a character, all the subsequent ones
> >> don't wait anymore and just continue immediately ... is this working for
> >> you? Or do I need another patch on top?
> >
> > Hey sorry missed this comment....
> >
> > It does seem to work for me, I've mostly tested pseries but I did test
> > others too (that's how I saw the arm getchar limit).
> >
> > How are you observing it not waiting for migration?
>
> According to you other mail, I think you figured it out already, but just
> for the records: You can see it when running the guest manually, e.g.
> something like:
>
> qemu-system-aarch64 -nodefaults -machine virt -accel tcg -cpu cortex-a57 \
> -device virtio-serial-device -device virtconsole,chardev=ctd \
> -chardev testdev,id=ctd -device pci-testdev -display none \
> -serial mon:stdio -kernel arm/selftest-migration.flat -smp 1
>
> Without my "lib/arm/io: Fix calling getchar() multiple times" patch, the
> guest only waits during the first getchar(), all the others simply return
> immediately.
Yeah I got it -- I re-ran it on arm and it is obvious since you told
me it's not waiting. At the time I tested I thought it was just arm
migrating really fast :D
Thanks,
Nick
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest
2024-02-09 9:11 ` [kvm-unit-tests PATCH v4 8/8] migration: add a migration selftest Nicholas Piggin
2024-02-16 11:15 ` Thomas Huth
@ 2024-02-16 14:05 ` Thomas Huth
1 sibling, 0 replies; 17+ messages in thread
From: Thomas Huth @ 2024-02-16 14:05 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Laurent Vivier, linux-s390, Nico Boehr, Janosch Frank, kvm,
David Hildenbrand, linuxppc-dev, Shaoqin Huang, Andrew Jones,
Eric Auger, Marc Hartmayer, kvm-riscv, kvmarm, Paolo Bonzini,
Claudio Imbrenda, Alexandru Elisei
On 09/02/2024 10.11, Nicholas Piggin wrote:
> Add a selftest for migration support in guest library and test harness
> code. It performs migrations in a tight loop to irritate races and bugs
> in the test harness code.
>
> Include the test in arm, s390, powerpc.
>
> Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com> (s390x)
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> arm/Makefile.common | 1 +
> arm/selftest-migration.c | 1 +
> arm/unittests.cfg | 6 ++++++
> common/selftest-migration.c | 34 ++++++++++++++++++++++++++++++++++
> powerpc/Makefile.common | 1 +
> powerpc/selftest-migration.c | 1 +
> powerpc/unittests.cfg | 4 ++++
> s390x/Makefile | 1 +
> s390x/selftest-migration.c | 1 +
> s390x/unittests.cfg | 4 ++++
> 10 files changed, 54 insertions(+)
> create mode 120000 arm/selftest-migration.c
> create mode 100644 common/selftest-migration.c
> create mode 120000 powerpc/selftest-migration.c
> create mode 120000 s390x/selftest-migration.c
>
> diff --git a/arm/Makefile.common b/arm/Makefile.common
> index f828dbe0..f107c478 100644
> --- a/arm/Makefile.common
> +++ b/arm/Makefile.common
> @@ -5,6 +5,7 @@
> #
>
> tests-common = $(TEST_DIR)/selftest.$(exe)
> +tests-common += $(TEST_DIR)/selftest-migration.$(exe)
> tests-common += $(TEST_DIR)/spinlock-test.$(exe)
> tests-common += $(TEST_DIR)/pci-test.$(exe)
> tests-common += $(TEST_DIR)/pmu.$(exe)
> diff --git a/arm/selftest-migration.c b/arm/selftest-migration.c
> new file mode 120000
> index 00000000..bd1eb266
> --- /dev/null
> +++ b/arm/selftest-migration.c
> @@ -0,0 +1 @@
> +../common/selftest-migration.c
> \ No newline at end of file
> diff --git a/arm/unittests.cfg b/arm/unittests.cfg
> index fe601cbb..db0e4c9b 100644
> --- a/arm/unittests.cfg
> +++ b/arm/unittests.cfg
> @@ -55,6 +55,12 @@ smp = $MAX_SMP
> extra_params = -append 'smp'
> groups = selftest
>
> +# Test migration
> +[selftest-migration]
> +file = selftest-migration.flat
> +groups = selftest migration
> +arch = arm64
> +
> # Test PCI emulation
> [pci-test]
> file = pci-test.flat
> diff --git a/common/selftest-migration.c b/common/selftest-migration.c
> new file mode 100644
> index 00000000..f70c505f
> --- /dev/null
> +++ b/common/selftest-migration.c
> @@ -0,0 +1,34 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Machine independent migration tests
> + *
> + * This is just a very simple test that is intended to stress the migration
> + * support in the test harness. This could be expanded to test more guest
> + * library code, but architecture-specific tests should be used to test
> + * migration of tricky machine state.
> + */
> +#include <libcflat.h>
> +#include <migrate.h>
> +
> +#if defined(__arm__) || defined(__aarch64__)
> +/* arm can only call getchar 15 times */
> +#define NR_MIGRATIONS 15
> +#else
> +#define NR_MIGRATIONS 100
> +#endif
FYI, I just wrote a patch that will hopefully fix the limitation to 15 times
on arm:
https://lore.kernel.org/kvm/20240216140210.70280-1-thuth@redhat.com/T/#u
Thomas
^ permalink raw reply [flat|nested] 17+ messages in thread