git: eb9fac0edbc7 - main - bhyve: Refactor vmexit_suspend() a bit
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 19 Jun 2023 19:54:37 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=eb9fac0edbc7ed5435f693ba3d3826363d8a7110
commit eb9fac0edbc7ed5435f693ba3d3826363d8a7110
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2023-06-19 19:46:32 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-06-19 19:46:32 +0000
bhyve: Refactor vmexit_suspend() a bit
Move some of its logic into fbsdrun_deletecpu(). This makes it easier
to split vmexit handlers into a separate file, which in turn makes
landing arm64 support easier. Also increase the scope of the mutex and
use it to synchronize updates to the vcpu mask. No functional change
intended.
Reviewed by: corvink, jhb
MFC after: 2 weeks
Sponsored by: Innovate UK
Differential Revision: https://reviews.freebsd.org/D40573
---
usr.sbin/bhyve/bhyverun.c | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c
index 888fbe1cd8fc..9eef1ea7225d 100644
--- a/usr.sbin/bhyve/bhyverun.c
+++ b/usr.sbin/bhyve/bhyverun.c
@@ -553,17 +553,31 @@ fbsdrun_addcpu(struct vcpu_info *vi)
assert(error == 0);
}
-static int
+static void
fbsdrun_deletecpu(int vcpu)
{
+ static pthread_mutex_t resetcpu_mtx = PTHREAD_MUTEX_INITIALIZER;
+ static pthread_cond_t resetcpu_cond = PTHREAD_COND_INITIALIZER;
+ pthread_mutex_lock(&resetcpu_mtx);
if (!CPU_ISSET(vcpu, &cpumask)) {
fprintf(stderr, "Attempting to delete unknown cpu %d\n", vcpu);
exit(4);
}
- CPU_CLR_ATOMIC(vcpu, &cpumask);
- return (CPU_EMPTY(&cpumask));
+ CPU_CLR(vcpu, &cpumask);
+
+ if (vcpu != BSP) {
+ pthread_cond_signal(&resetcpu_cond);
+ pthread_mutex_unlock(&resetcpu_mtx);
+ pthread_exit(NULL);
+ /* NOTREACHED */
+ }
+
+ while (!CPU_EMPTY(&cpumask)) {
+ pthread_cond_wait(&resetcpu_cond, &resetcpu_mtx);
+ }
+ pthread_mutex_unlock(&resetcpu_mtx);
}
static int
@@ -818,9 +832,6 @@ fail:
return (VMEXIT_ABORT);
}
-static pthread_mutex_t resetcpu_mtx = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t resetcpu_cond = PTHREAD_COND_INITIALIZER;
-
static int
vmexit_suspend(struct vmctx *ctx, struct vcpu *vcpu, struct vm_run *vmrun)
{
@@ -834,19 +845,6 @@ vmexit_suspend(struct vmctx *ctx, struct vcpu *vcpu, struct vm_run *vmrun)
fbsdrun_deletecpu(vcpuid);
- if (vcpuid != BSP) {
- pthread_mutex_lock(&resetcpu_mtx);
- pthread_cond_signal(&resetcpu_cond);
- pthread_mutex_unlock(&resetcpu_mtx);
- pthread_exit(NULL);
- }
-
- pthread_mutex_lock(&resetcpu_mtx);
- while (!CPU_EMPTY(&cpumask)) {
- pthread_cond_wait(&resetcpu_cond, &resetcpu_mtx);
- }
- pthread_mutex_unlock(&resetcpu_mtx);
-
switch (how) {
case VM_SUSPEND_RESET:
exit(0);