Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/nvmm Use the fd_clone approach, to avoid losing refe...
details: https://anonhg.NetBSD.org/src/rev/e2b38304ea48
branches: trunk
changeset: 998135:e2b38304ea48
user: maxv <maxv%NetBSD.org@localhost>
date: Mon Apr 08 18:21:42 2019 +0000
description:
Use the fd_clone approach, to avoid losing references to the registered
VMs during fork(). We attach an nvmm_owner struct to the fd, reference it
in each VM, and identify the process' VMs by just comparing the pointer.
diffstat:
sys/dev/nvmm/nvmm.c | 230 +++++++++++++++++++++++++-----------------
sys/dev/nvmm/nvmm_internal.h | 8 +-
2 files changed, 142 insertions(+), 96 deletions(-)
diffs (truncated from 500 to 300 lines):
diff -r b54cd0dba2b0 -r e2b38304ea48 sys/dev/nvmm/nvmm.c
--- a/sys/dev/nvmm/nvmm.c Mon Apr 08 15:35:57 2019 +0000
+++ b/sys/dev/nvmm/nvmm.c Mon Apr 08 18:21:42 2019 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: nvmm.c,v 1.13 2019/04/07 14:05:15 maxv Exp $ */
+/* $NetBSD: nvmm.c,v 1.14 2019/04/08 18:21:42 maxv Exp $ */
/*
- * Copyright (c) 2018 The NetBSD Foundation, Inc.
+ * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.13 2019/04/07 14:05:15 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.14 2019/04/08 18:21:42 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -42,6 +42,8 @@
#include <sys/module.h>
#include <sys/proc.h>
#include <sys/mman.h>
+#include <sys/file.h>
+#include <sys/filedesc.h>
#include <uvm/uvm.h>
#include <uvm/uvm_page.h>
@@ -98,7 +100,8 @@
}
static int
-nvmm_machine_get(nvmm_machid_t machid, struct nvmm_machine **ret, bool writer)
+nvmm_machine_get(struct nvmm_owner *owner, nvmm_machid_t machid,
+ struct nvmm_machine **ret, bool writer)
{
struct nvmm_machine *mach;
krw_t op = writer ? RW_WRITER : RW_READER;
@@ -113,7 +116,7 @@
rw_exit(&mach->lock);
return ENOENT;
}
- if (mach->procid != curproc->p_pid) {
+ if (mach->owner != owner) {
rw_exit(&mach->lock);
return EPERM;
}
@@ -194,7 +197,7 @@
/* -------------------------------------------------------------------------- */
static void
-nvmm_kill_machines(pid_t pid)
+nvmm_kill_machines(struct nvmm_owner *owner)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
@@ -205,7 +208,7 @@
mach = &machines[i];
rw_enter(&mach->lock, RW_WRITER);
- if (!mach->present || mach->procid != pid) {
+ if (!mach->present || mach->owner != owner) {
rw_exit(&mach->lock);
continue;
}
@@ -237,7 +240,7 @@
/* -------------------------------------------------------------------------- */
static int
-nvmm_capability(struct nvmm_ioc_capability *args)
+nvmm_capability(struct nvmm_owner *owner, struct nvmm_ioc_capability *args)
{
args->cap.version = NVMM_CAPABILITY_VERSION;
args->cap.state_size = nvmm_impl->state_size;
@@ -251,7 +254,8 @@
}
static int
-nvmm_machine_create(struct nvmm_ioc_machine_create *args)
+nvmm_machine_create(struct nvmm_owner *owner,
+ struct nvmm_ioc_machine_create *args)
{
struct nvmm_machine *mach;
int error;
@@ -261,7 +265,7 @@
return error;
/* Curproc owns the machine. */
- mach->procid = curproc->p_pid;
+ mach->owner = owner;
/* Zero out the host mappings. */
memset(&mach->hmap, 0, sizeof(mach->hmap));
@@ -280,14 +284,15 @@
}
static int
-nvmm_machine_destroy(struct nvmm_ioc_machine_destroy *args)
+nvmm_machine_destroy(struct nvmm_owner *owner,
+ struct nvmm_ioc_machine_destroy *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
size_t i;
- error = nvmm_machine_get(args->machid, &mach, true);
+ error = nvmm_machine_get(owner, args->machid, &mach, true);
if (error)
return error;
@@ -320,7 +325,8 @@
}
static int
-nvmm_machine_configure(struct nvmm_ioc_machine_configure *args)
+nvmm_machine_configure(struct nvmm_owner *owner,
+ struct nvmm_ioc_machine_configure *args)
{
struct nvmm_machine *mach;
size_t allocsz;
@@ -334,7 +340,7 @@
allocsz = nvmm_impl->conf_sizes[args->op];
data = kmem_alloc(allocsz, KM_SLEEP);
- error = nvmm_machine_get(args->machid, &mach, true);
+ error = nvmm_machine_get(owner, args->machid, &mach, true);
if (error) {
kmem_free(data, allocsz);
return error;
@@ -354,13 +360,13 @@
}
static int
-nvmm_vcpu_create(struct nvmm_ioc_vcpu_create *args)
+nvmm_vcpu_create(struct nvmm_owner *owner, struct nvmm_ioc_vcpu_create *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -383,13 +389,13 @@
}
static int
-nvmm_vcpu_destroy(struct nvmm_ioc_vcpu_destroy *args)
+nvmm_vcpu_destroy(struct nvmm_owner *owner, struct nvmm_ioc_vcpu_destroy *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -407,13 +413,14 @@
}
static int
-nvmm_vcpu_setstate(struct nvmm_ioc_vcpu_setstate *args)
+nvmm_vcpu_setstate(struct nvmm_owner *owner,
+ struct nvmm_ioc_vcpu_setstate *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -436,13 +443,14 @@
}
static int
-nvmm_vcpu_getstate(struct nvmm_ioc_vcpu_getstate *args)
+nvmm_vcpu_getstate(struct nvmm_owner *owner,
+ struct nvmm_ioc_vcpu_getstate *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -460,13 +468,13 @@
}
static int
-nvmm_vcpu_inject(struct nvmm_ioc_vcpu_inject *args)
+nvmm_vcpu_inject(struct nvmm_owner *owner, struct nvmm_ioc_vcpu_inject *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -504,13 +512,13 @@
}
static int
-nvmm_vcpu_run(struct nvmm_ioc_vcpu_run *args)
+nvmm_vcpu_run(struct nvmm_owner *owner, struct nvmm_ioc_vcpu_run *args)
{
struct nvmm_machine *mach;
struct nvmm_cpu *vcpu;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -636,7 +644,7 @@
}
static int
-nvmm_hva_map(struct nvmm_ioc_hva_map *args)
+nvmm_hva_map(struct nvmm_owner *owner, struct nvmm_ioc_hva_map *args)
{
struct vmspace *vmspace = curproc->p_vmspace;
struct nvmm_machine *mach;
@@ -644,7 +652,7 @@
vaddr_t uva;
int error;
- error = nvmm_machine_get(args->machid, &mach, true);
+ error = nvmm_machine_get(owner, args->machid, &mach, true);
if (error)
return error;
@@ -680,12 +688,12 @@
}
static int
-nvmm_hva_unmap(struct nvmm_ioc_hva_unmap *args)
+nvmm_hva_unmap(struct nvmm_owner *owner, struct nvmm_ioc_hva_unmap *args)
{
struct nvmm_machine *mach;
int error;
- error = nvmm_machine_get(args->machid, &mach, true);
+ error = nvmm_machine_get(owner, args->machid, &mach, true);
if (error)
return error;
@@ -698,7 +706,7 @@
/* -------------------------------------------------------------------------- */
static int
-nvmm_gpa_map(struct nvmm_ioc_gpa_map *args)
+nvmm_gpa_map(struct nvmm_owner *owner, struct nvmm_ioc_gpa_map *args)
{
struct nvmm_machine *mach;
struct uvm_object *uobj;
@@ -706,7 +714,7 @@
size_t off;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -768,13 +776,13 @@
}
static int
-nvmm_gpa_unmap(struct nvmm_ioc_gpa_unmap *args)
+nvmm_gpa_unmap(struct nvmm_owner *owner, struct nvmm_ioc_gpa_unmap *args)
{
struct nvmm_machine *mach;
gpaddr_t gpa;
int error;
- error = nvmm_machine_get(args->machid, &mach, false);
+ error = nvmm_machine_get(owner, args->machid, &mach, false);
if (error)
return error;
@@ -855,71 +863,14 @@
Home |
Main Index |
Thread Index |
Old Index