git: 063a8bd908dd - main - vmm: Factor most of sysctl_vmm_destroy() into a separate function
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 28 Aug 2024 19:12:43 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=063a8bd908ddaae9f0ba8c7711dfe837a14f21e7
commit 063a8bd908ddaae9f0ba8c7711dfe837a14f21e7
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-08-28 18:57:12 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-08-28 18:57:12 +0000
vmm: Factor most of sysctl_vmm_destroy() into a separate function
This will make it easy to share code with an ioctl handler which creates
VMs. No functional change intended.
Reviewed by: corvink, jhb
Differential Revision: https://reviews.freebsd.org/D46445
---
sys/dev/vmm/vmm_dev.c | 72 ++++++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 35 deletions(-)
diff --git a/sys/dev/vmm/vmm_dev.c b/sys/dev/vmm/vmm_dev.c
index 94546efd03c9..6bdcb51777d4 100644
--- a/sys/dev/vmm/vmm_dev.c
+++ b/sys/dev/vmm/vmm_dev.c
@@ -732,12 +732,24 @@ vmmdev_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t mapsize,
}
static void
-vmmdev_destroy(void *arg)
+vmmdev_destroy(struct vmmdev_softc *sc)
{
- struct vmmdev_softc *sc = arg;
struct devmem_softc *dsc;
int error __diagused;
+ /*
+ * Destroy all cdevs:
+ *
+ * - any new operations on the 'cdev' will return an error (ENXIO).
+ *
+ * - the 'devmem' cdevs are destroyed before the virtual machine 'cdev'
+ */
+ SLIST_FOREACH(dsc, &sc->devmem, link) {
+ KASSERT(dsc->cdev != NULL, ("devmem cdev already destroyed"));
+ destroy_dev(dsc->cdev);
+ devmem_destroy(dsc);
+ }
+
vm_disable_vcpu_creation(sc->vm);
error = vcpu_lock_all(sc);
KASSERT(error == 0, ("%s: error %d freezing vcpus", __func__, error));
@@ -769,31 +781,16 @@ vmmdev_destroy(void *arg)
}
static int
-sysctl_vmm_destroy(SYSCTL_HANDLER_ARGS)
+vmmdev_lookup_and_destroy(const char *name, struct ucred *cred)
{
- struct devmem_softc *dsc;
- struct vmmdev_softc *sc;
struct cdev *cdev;
- char *buf;
- int error, buflen;
-
- error = vmm_priv_check(req->td->td_ucred);
- if (error)
- return (error);
-
- buflen = VM_MAX_NAMELEN + 1;
- buf = malloc(buflen, M_VMMDEV, M_WAITOK | M_ZERO);
- strlcpy(buf, "beavis", buflen);
- error = sysctl_handle_string(oidp, buf, buflen, req);
- if (error != 0 || req->newptr == NULL)
- goto out;
+ struct vmmdev_softc *sc;
mtx_lock(&vmmdev_mtx);
- sc = vmmdev_lookup(buf);
+ sc = vmmdev_lookup(name);
if (sc == NULL || sc->cdev == NULL) {
mtx_unlock(&vmmdev_mtx);
- error = EINVAL;
- goto out;
+ return (EINVAL);
}
/*
@@ -804,23 +801,28 @@ sysctl_vmm_destroy(SYSCTL_HANDLER_ARGS)
sc->cdev = NULL;
mtx_unlock(&vmmdev_mtx);
- /*
- * Destroy all cdevs:
- *
- * - any new operations on the 'cdev' will return an error (ENXIO).
- *
- * - the 'devmem' cdevs are destroyed before the virtual machine 'cdev'
- */
- SLIST_FOREACH(dsc, &sc->devmem, link) {
- KASSERT(dsc->cdev != NULL, ("devmem cdev already destroyed"));
- destroy_dev(dsc->cdev);
- devmem_destroy(dsc);
- }
destroy_dev(cdev);
vmmdev_destroy(sc);
- error = 0;
-out:
+ return (0);
+}
+
+static int
+sysctl_vmm_destroy(SYSCTL_HANDLER_ARGS)
+{
+ char *buf;
+ int error, buflen;
+
+ error = vmm_priv_check(req->td->td_ucred);
+ if (error)
+ return (error);
+
+ buflen = VM_MAX_NAMELEN + 1;
+ buf = malloc(buflen, M_VMMDEV, M_WAITOK | M_ZERO);
+ strlcpy(buf, "beavis", buflen);
+ error = sysctl_handle_string(oidp, buf, buflen, req);
+ if (error == 0 && req->newptr != NULL)
+ error = vmmdev_lookup_and_destroy(buf, req->td->td_ucred);
free(buf, M_VMMDEV);
return (error);
}