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 <[email protected]> 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) {