diff mbox

[kvm-unit-tests,3/8] powerpc: don't use NMI's to signal end of migration

Message ID 20180207190334.16516-4-drjones@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Andrew Jones Feb. 7, 2018, 7:03 p.m. UTC
The SPRs test already supports using serial input as the trigger to
proceed after waiting for migration to complete, but the general
test framework uses NMI's (which the SPR test also supported before
this patch). ARM doesn't support NMI injection, so change the general
framework to use serial input instead, and drop the NMI support from
the SPR test.

Cc: Thomas Huth <thuth@redhat.com>
Signed-off-by: Andrew Jones <drjones@redhat.com>
---
 powerpc/sprs.c        | 26 +++++++++-----------------
 scripts/arch-run.bash | 13 ++++++++-----
 2 files changed, 17 insertions(+), 22 deletions(-)

Comments

Thomas Huth Feb. 8, 2018, 10:58 a.m. UTC | #1
On 07.02.2018 20:03, Andrew Jones wrote:
> The SPRs test already supports using serial input as the trigger to
> proceed after waiting for migration to complete, but the general
> test framework uses NMI's (which the SPR test also supported before
> this patch). ARM doesn't support NMI injection, so change the general
> framework to use serial input instead, and drop the NMI support from
> the SPR test.
> 
> Cc: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
>  powerpc/sprs.c        | 26 +++++++++-----------------
>  scripts/arch-run.bash | 13 ++++++++-----
>  2 files changed, 17 insertions(+), 22 deletions(-)

Acked-by: Thomas Huth <thuth@redhat.com>
diff mbox

Patch

diff --git a/powerpc/sprs.c b/powerpc/sprs.c
index c02bcc9fcf32..3b920e9f929a 100644
--- a/powerpc/sprs.c
+++ b/powerpc/sprs.c
@@ -8,13 +8,13 @@ 
  * The basic idea of this test is to check whether the contents of the Special
  * Purpose Registers (SPRs) are preserved correctly during migration. So we
  * fill in the SPRs with a well-known value, read the values back (since not
- * all bits might be retained in the SPRs), then wait for a key or NMI (if the
- * '-w' option has been specified) so that the user has a chance to migrate the
- * VM. Alternatively, the test can also simply sleep a little bit with the
- * H_CEDE hypercall, in the hope that we'll get scheduled to another host CPU
- * and thus register contents might have changed, too (in case of bugs).
- * Finally, we read back the values from the SPRs and compare them with the
- * values before the migration. Mismatches are reported as test failures.
+ * all bits might be retained in the SPRs), then wait for migration to complete
+ * (if the '-w' option has been specified) so that the user has a chance to
+ * migrate the VM. Alternatively, the test can also simply sleep a little bit
+ * with the H_CEDE hypercall, in the hope that we'll get scheduled to another
+ * host CPU and thus register contents might have changed, too (in case of
+ * bugs). Finally, we read back the values from the SPRs and compare them with
+ * the values before the migration. Mismatches are reported as test failures.
  * Note that we do not test all SPRs since some of the registers change their
  * content automatically, and some are only accessible with hypervisor privi-
  * leges or have bad side effects, so we have to omit those registers.
@@ -38,13 +38,6 @@ 
 
 uint64_t before[1024], after[1024];
 
-volatile int nmi_occurred;
-
-static void nmi_handler(struct pt_regs *regs __unused, void *opaque __unused)
-{
-	nmi_occurred = 1;
-}
-
 static int h_get_term_char(uint64_t termno)
 {
 	register uint64_t r3 asm("r3") = 0x54; /* H_GET_TERM_CHAR */
@@ -303,9 +296,8 @@  int main(int argc, char **argv)
 	get_sprs(before);
 
 	if (pause) {
-		handle_exception(0x100, &nmi_handler, NULL);
-		puts("Now migrate the VM, then press a key or send NMI...\n");
-		while (!nmi_occurred && h_get_term_char(0) == 0)
+		puts("Now migrate the VM, then press a key to continue...\n");
+		while (h_get_term_char(0) == 0)
 			cpu_relax();
 	} else {
 		puts("Sleeping...\n");
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 565e299295db..e13af8e8064a 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -115,17 +115,22 @@  run_migration ()
 	migout1=`mktemp -t mig-helper-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
 
 	trap 'kill 0; exit 2' INT TERM
-	trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2}' RETURN EXIT
+	trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT
 
 	eval "$@" -chardev socket,id=mon1,path=${qmp1},server,nowait \
 		-mon chardev=mon1,mode=control | 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...
+	mkfifo ${fifo}
 	eval "$@" -chardev socket,id=mon2,path=${qmp2},server,nowait \
-		-mon chardev=mon2,mode=control -incoming unix:${migsock} &
+		-mon chardev=mon2,mode=control -incoming unix:${migsock} < <(cat ${fifo}) &
 	incoming_pid=`jobs -l %+ | awk '{print$2}'`
 
 	# The test must prompt the user to migrate, so wait for the "migrate" keyword
@@ -148,9 +153,7 @@  run_migration ()
 		fi
 	done
 	qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null
-
-	qmp ${qmp2} '"inject-nmi"'> ${qmpout2}
-
+	echo > ${fifo}
 	wait $incoming_pid
 	ret=$?
 	wait