Module Name:    src
Committed By:   reinoud
Date:           Fri Mar 26 15:59:53 UTC 2021

Modified Files:
        src/sys/dev/nvmm: nvmm.c nvmm.h nvmm_internal.h
        src/sys/dev/nvmm/x86: nvmm_x86.h nvmm_x86_svm.c nvmm_x86_vmx.c

Log Message:
Implement nvmm_vcpu::stop, a race-free exit from nvmm_vcpu_run() without
signals. This introduces a new kernel and userland NVMM version indicating
this support.

Patch by Kamil Rytarowski <ka...@netbsd.org> and committed on his request.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/nvmm/nvmm.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/nvmm/nvmm.h
cvs rdiff -u -r1.19 -r1.20 src/sys/dev/nvmm/nvmm_internal.h
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/nvmm/x86/nvmm_x86.h
cvs rdiff -u -r1.82 -r1.83 src/sys/dev/nvmm/x86/nvmm_x86_svm.c
cvs rdiff -u -r1.81 -r1.82 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/nvmm/nvmm.c
diff -u src/sys/dev/nvmm/nvmm.c:1.41 src/sys/dev/nvmm/nvmm.c:1.42
--- src/sys/dev/nvmm/nvmm.c:1.41	Tue Sep  8 16:58:38 2020
+++ src/sys/dev/nvmm/nvmm.c	Fri Mar 26 15:59:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm.c,v 1.41 2020/09/08 16:58:38 maxv Exp $	*/
+/*	$NetBSD: nvmm.c,v 1.42 2021/03/26 15:59:53 reinoud Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.41 2020/09/08 16:58:38 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.42 2021/03/26 15:59:53 reinoud Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -574,8 +574,7 @@ nvmm_do_vcpu_run(struct nvmm_machine *ma
 
 	while (1) {
 		/* Got a signal? Or pending resched? Leave. */
-		if (__predict_false(nvmm_return_needed())) {
-			exit->reason = NVMM_VCPU_EXIT_NONE;
+		if (__predict_false(nvmm_return_needed(vcpu, exit))) {
 			return 0;
 		}
 
@@ -620,6 +619,7 @@ nvmm_vcpu_run(struct nvmm_owner *owner, 
 
 out:
 	nvmm_machine_put(mach);
+	vcpu->comm->stop = 0;
 	return error;
 }
 

Index: src/sys/dev/nvmm/nvmm.h
diff -u src/sys/dev/nvmm/nvmm.h:1.15 src/sys/dev/nvmm/nvmm.h:1.16
--- src/sys/dev/nvmm/nvmm.h:1.15	Sat Sep  5 07:22:25 2020
+++ src/sys/dev/nvmm/nvmm.h	Fri Mar 26 15:59:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm.h,v 1.15 2020/09/05 07:22:25 maxv Exp $	*/
+/*	$NetBSD: nvmm.h,v 1.16 2021/03/26 15:59:53 reinoud Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -47,7 +47,12 @@ typedef uint32_t	nvmm_cpuid_t;
 #include <dev/nvmm/x86/nvmm_x86.h>
 #endif
 
-#define NVMM_KERN_VERSION		1
+#define NVMM_KERN_VERSION		2
+
+/*
+ * Version 1 - Initial release in NetBSD 9.0.
+ * Version 2 - Added nvmm_vcpu::stop.
+ */
 
 struct nvmm_capability {
 	uint32_t version;
@@ -80,6 +85,9 @@ struct nvmm_comm_page {
 	/* Event. */
 	bool event_commit;
 	struct nvmm_vcpu_event event;
+
+	/* Race-free exit from nvmm_vcpu_run() without signals. */
+	volatile int stop;
 };
 
 /*

Index: src/sys/dev/nvmm/nvmm_internal.h
diff -u src/sys/dev/nvmm/nvmm_internal.h:1.19 src/sys/dev/nvmm/nvmm_internal.h:1.20
--- src/sys/dev/nvmm/nvmm_internal.h:1.19	Sun Sep  6 02:18:53 2020
+++ src/sys/dev/nvmm/nvmm_internal.h	Fri Mar 26 15:59:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_internal.h,v 1.19 2020/09/06 02:18:53 riastradh Exp $	*/
+/*	$NetBSD: nvmm_internal.h,v 1.20 2021/03/26 15:59:53 reinoud Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -136,14 +136,22 @@ extern const struct nvmm_impl nvmm_x86_v
 #endif
 
 static inline bool
-nvmm_return_needed(void)
+nvmm_return_needed(struct nvmm_cpu *vcpu, struct nvmm_vcpu_exit *exit)
 {
+
 	if (preempt_needed()) {
+		exit->reason = NVMM_VCPU_EXIT_NONE;
 		return true;
 	}
 	if (curlwp->l_flag & LW_USERRET) {
+		exit->reason = NVMM_VCPU_EXIT_NONE;
+		return true;
+	}
+	if (vcpu->comm->stop) {
+		exit->reason = NVMM_VCPU_EXIT_STOPPED;
 		return true;
 	}
+
 	return false;
 }
 

Index: src/sys/dev/nvmm/x86/nvmm_x86.h
diff -u src/sys/dev/nvmm/x86/nvmm_x86.h:1.20 src/sys/dev/nvmm/x86/nvmm_x86.h:1.21
--- src/sys/dev/nvmm/x86/nvmm_x86.h:1.20	Sat Sep  5 07:22:26 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86.h	Fri Mar 26 15:59:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_x86.h,v 1.20 2020/09/05 07:22:26 maxv Exp $	*/
+/*	$NetBSD: nvmm_x86.h,v 1.21 2021/03/26 15:59:53 reinoud Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -74,6 +74,7 @@ struct nvmm_x86_exit_invalid {
 
 /* Generic. */
 #define NVMM_VCPU_EXIT_NONE		0x0000000000000000ULL
+#define NVMM_VCPU_EXIT_STOPPED		0xFFFFFFFFFFFFFFFEULL
 #define NVMM_VCPU_EXIT_INVALID		0xFFFFFFFFFFFFFFFFULL
 /* x86: operations. */
 #define NVMM_VCPU_EXIT_MEMORY		0x0000000000000001ULL

Index: src/sys/dev/nvmm/x86/nvmm_x86_svm.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.82 src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.83
--- src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.82	Sat Oct 24 07:14:30 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86_svm.c	Fri Mar 26 15:59:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_x86_svm.c,v 1.82 2020/10/24 07:14:30 mgorny Exp $	*/
+/*	$NetBSD: nvmm_x86_svm.c,v 1.83 2021/03/26 15:59:53 reinoud Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.82 2020/10/24 07:14:30 mgorny Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.83 2021/03/26 15:59:53 reinoud Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1612,7 +1612,7 @@ svm_vcpu_run(struct nvmm_machine *mach, 
 		}
 
 		/* If no reason to return to userland, keep rolling. */
-		if (nvmm_return_needed()) {
+		if (nvmm_return_needed(vcpu, exit)) {
 			break;
 		}
 		if (exit->reason != NVMM_VCPU_EXIT_NONE) {

Index: src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.81 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.82
--- src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.81	Sat Oct 24 07:14:30 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86_vmx.c	Fri Mar 26 15:59:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_x86_vmx.c,v 1.81 2020/10/24 07:14:30 mgorny Exp $	*/
+/*	$NetBSD: nvmm_x86_vmx.c,v 1.82 2021/03/26 15:59:53 reinoud Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.81 2020/10/24 07:14:30 mgorny Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.82 2021/03/26 15:59:53 reinoud Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2337,7 +2337,7 @@ vmx_vcpu_run(struct nvmm_machine *mach, 
 		}
 
 		/* If no reason to return to userland, keep rolling. */
-		if (nvmm_return_needed()) {
+		if (nvmm_return_needed(vcpu, exit)) {
 			break;
 		}
 		if (exit->reason != NVMM_VCPU_EXIT_NONE) {

Reply via email to