diff mbox series

[kvm-unit-tests,RFC] Workaround (possible) QEMU migration bug

Message ID 20240217162151.144408-1-npiggin@gmail.com (mailing list archive)
State New, archived
Headers show
Series [kvm-unit-tests,RFC] Workaround (possible) QEMU migration bug | expand

Commit Message

Nicholas Piggin Feb. 17, 2024, 4:21 p.m. UTC
Recent updates to machine memory can seemingly be lost across QEMU TCG
migration. This patch stops the machine on the source before migrating,
after which the problem can no longer be reproduced.

This isn't arm64 specific, powerpc could also see corruption using the
reproducer. It must be just that it's getchar implementation was different
enough that it didn't show up there.

arm64 runs the migration selftest okay with this and the uart patch.

I'll try to work out a simpler reproducer patch to report the QEMU issue
with, but in the meantime a sanity check and any suggestions about this
would be appreciated.

Thanks,
Nick

---
 common/selftest-migration.c | 5 -----
 scripts/arch-run.bash       | 5 +++++
 2 files changed, 5 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/common/selftest-migration.c b/common/selftest-migration.c
index 02b102cc5..dd36696fd 100644
--- a/common/selftest-migration.c
+++ b/common/selftest-migration.c
@@ -10,12 +10,7 @@ 
 #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)
 {
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 2214d940c..0d6950c26 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -209,6 +209,9 @@  do_migration ()
 	while ! [ -S ${dst_incoming} ] ; do sleep 0.1 ; done
 	while ! [ -S ${dst_qmp} ] ; do sleep 0.1 ; done
 
+	# Stop the machine before migration. This works around a QEMU
+	# problem with memory updates being lost.
+	qmp ${src_qmp} '"stop"' > ${src_qmpout}
 	qmp ${src_qmp} '"migrate", "arguments": { "uri": "unix:'${dst_incoming}'" }' > ${src_qmpout}
 
 	# Wait for the migration to complete
@@ -232,6 +235,8 @@  do_migration ()
 	done
 
 	qmp ${src_qmp} '"quit"'> ${src_qmpout} 2>/dev/null
+	# Resume the machine after migrate.
+	qmp ${dst_qmp} '"cont"' > ${dst_qmpout}
 
 	# keypress to dst so getchar completes and test continues
 	echo > ${dst_infifo}