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) {