Module Name:    src
Committed By:   maxv
Date:           Thu Mar  7 15:22:22 UTC 2019

Modified Files:
        src/sys/dev/nvmm: nvmm.c nvmm_internal.h

Log Message:
Rename the internal NVMM HVA table entries from "segment" to "hmapping",
less confusing. Also fix the error handling in nvmm_hva_unmap().


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/nvmm/nvmm.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/nvmm/nvmm_internal.h

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.8 src/sys/dev/nvmm/nvmm.c:1.9
--- src/sys/dev/nvmm/nvmm.c:1.8	Mon Feb 18 12:17:45 2019
+++ src/sys/dev/nvmm/nvmm.c	Thu Mar  7 15:22:21 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm.c,v 1.8 2019/02/18 12:17:45 maxv Exp $	*/
+/*	$NetBSD: nvmm.c,v 1.9 2019/03/07 15:22:21 maxv Exp $	*/
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.8 2019/02/18 12:17:45 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.9 2019/03/07 15:22:21 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -218,10 +218,10 @@ nvmm_kill_machines(pid_t pid)
 		uvmspace_free(mach->vm);
 
 		/* Drop the kernel UOBJ refs. */
-		for (j = 0; j < NVMM_MAX_SEGS; j++) {
-			if (!mach->segs[j].present)
+		for (j = 0; j < NVMM_MAX_HMAPPINGS; j++) {
+			if (!mach->hmap[j].present)
 				continue;
-			uao_detach(mach->segs[j].uobj);
+			uao_detach(mach->hmap[j].uobj);
 		}
 
 		nvmm_machine_free(mach);
@@ -259,8 +259,8 @@ nvmm_machine_create(struct nvmm_ioc_mach
 	/* Curproc owns the machine. */
 	mach->procid = curproc->p_pid;
 
-	/* Zero out the segments. */
-	memset(&mach->segs, 0, sizeof(mach->segs));
+	/* Zero out the host mappings. */
+	memset(&mach->hmap, 0, sizeof(mach->hmap));
 
 	/* Create the machine vmspace. */
 	mach->gpa_begin = 0;
@@ -303,10 +303,10 @@ nvmm_machine_destroy(struct nvmm_ioc_mac
 	uvmspace_free(mach->vm);
 
 	/* Drop the kernel UOBJ refs. */
-	for (i = 0; i < NVMM_MAX_SEGS; i++) {
-		if (!mach->segs[i].present)
+	for (i = 0; i < NVMM_MAX_HMAPPINGS; i++) {
+		if (!mach->hmap[i].present)
 			continue;
-		uao_detach(mach->segs[i].uobj);
+		uao_detach(mach->hmap[i].uobj);
 	}
 
 	nvmm_machine_free(mach);
@@ -522,36 +522,21 @@ out:
 /* -------------------------------------------------------------------------- */
 
 static struct uvm_object *
-nvmm_seg_getuobj(struct nvmm_machine *mach, uintptr_t hva, size_t size,
+nvmm_hmapping_getuobj(struct nvmm_machine *mach, uintptr_t hva, size_t size,
    size_t *off)
 {
-	struct nvmm_seg *seg;
+	struct nvmm_hmapping *hmapping;
 	size_t i;
 
-	for (i = 0; i < NVMM_MAX_SEGS; i++) {
-		seg = &mach->segs[i];
-		if (!seg->present) {
+	for (i = 0; i < NVMM_MAX_HMAPPINGS; i++) {
+		hmapping = &mach->hmap[i];
+		if (!hmapping->present) {
 			continue;
 		}
-		if (hva >= seg->hva && hva + size <= seg->hva + seg->size) {
-			*off = hva - seg->hva;
-			return seg->uobj;
-		}
-	}
-
-	return NULL;
-}
-
-static struct nvmm_seg *
-nvmm_seg_find(struct nvmm_machine *mach, uintptr_t hva, size_t size)
-{
-	struct nvmm_seg *seg;
-	size_t i;
-
-	for (i = 0; i < NVMM_MAX_SEGS; i++) {
-		seg = &mach->segs[i];
-		if (seg->present && seg->hva == hva && seg->size == size) {
-			return seg;
+		if (hva >= hmapping->hva &&
+		    hva + size <= hmapping->hva + hmapping->size) {
+			*off = hva - hmapping->hva;
+			return hmapping->uobj;
 		}
 	}
 
@@ -559,9 +544,9 @@ nvmm_seg_find(struct nvmm_machine *mach,
 }
 
 static int
-nvmm_seg_validate(struct nvmm_machine *mach, uintptr_t hva, size_t size)
+nvmm_hmapping_validate(struct nvmm_machine *mach, uintptr_t hva, size_t size)
 {
-	struct nvmm_seg *seg;
+	struct nvmm_hmapping *hmapping;
 	size_t i;
 
 	if ((hva % PAGE_SIZE) != 0 || (size % PAGE_SIZE) != 0) {
@@ -571,24 +556,27 @@ nvmm_seg_validate(struct nvmm_machine *m
 		return EINVAL;
 	}
 
-	for (i = 0; i < NVMM_MAX_SEGS; i++) {
-		seg = &mach->segs[i];
-		if (!seg->present) {
+	for (i = 0; i < NVMM_MAX_HMAPPINGS; i++) {
+		hmapping = &mach->hmap[i];
+		if (!hmapping->present) {
 			continue;
 		}
 
-		if (hva >= seg->hva && hva + size <= seg->hva + seg->size) {
+		if (hva >= hmapping->hva &&
+		    hva + size <= hmapping->hva + hmapping->size) {
 			break;
 		}
 
-		if (hva >= seg->hva && hva < seg->hva + seg->size) {
+		if (hva >= hmapping->hva &&
+		    hva < hmapping->hva + hmapping->size) {
 			return EEXIST;
 		}
-		if (hva + size > seg->hva &&
-		    hva + size <= seg->hva + seg->size) {
+		if (hva + size > hmapping->hva &&
+		    hva + size <= hmapping->hva + hmapping->size) {
 			return EEXIST;
 		}
-		if (hva <= seg->hva && hva + size >= seg->hva + seg->size) {
+		if (hva <= hmapping->hva &&
+		    hva + size >= hmapping->hva + hmapping->size) {
 			return EEXIST;
 		}
 	}
@@ -596,33 +584,48 @@ nvmm_seg_validate(struct nvmm_machine *m
 	return 0;
 }
 
-static struct nvmm_seg *
-nvmm_seg_alloc(struct nvmm_machine *mach)
+static struct nvmm_hmapping *
+nvmm_hmapping_alloc(struct nvmm_machine *mach)
 {
-	struct nvmm_seg *seg;
+	struct nvmm_hmapping *hmapping;
 	size_t i;
 
-	for (i = 0; i < NVMM_MAX_SEGS; i++) {
-		seg = &mach->segs[i];
-		if (!seg->present) {
-			seg->present = true;
-			return seg;
+	for (i = 0; i < NVMM_MAX_HMAPPINGS; i++) {
+		hmapping = &mach->hmap[i];
+		if (!hmapping->present) {
+			hmapping->present = true;
+			return hmapping;
 		}
 	}
 
 	return NULL;
 }
 
-static void
-nvmm_seg_free(struct nvmm_seg *seg)
+static int
+nvmm_hmapping_free(struct nvmm_machine *mach, uintptr_t hva, size_t size)
 {
 	struct vmspace *vmspace = curproc->p_vmspace;
+	struct nvmm_hmapping *hmapping;
+	size_t i;
 
-	uvm_unmap(&vmspace->vm_map, seg->hva, seg->hva + seg->size);
-	uao_detach(seg->uobj);
+	for (i = 0; i < NVMM_MAX_HMAPPINGS; i++) {
+		hmapping = &mach->hmap[i];
+		if (!hmapping->present || hmapping->hva != hva ||
+		    hmapping->size != size) {
+			continue;
+		}
+
+		uvm_unmap(&vmspace->vm_map, hmapping->hva,
+		    hmapping->hva + hmapping->size);
+		uao_detach(hmapping->uobj);
 
-	seg->uobj = NULL;
-	seg->present = false;
+		hmapping->uobj = NULL;
+		hmapping->present = false;
+
+		return 0;
+	}
+
+	return ENOENT;
 }
 
 static int
@@ -630,7 +633,7 @@ nvmm_hva_map(struct nvmm_ioc_hva_map *ar
 {
 	struct vmspace *vmspace = curproc->p_vmspace;
 	struct nvmm_machine *mach;
-	struct nvmm_seg *seg;
+	struct nvmm_hmapping *hmapping;
 	vaddr_t uva;
 	int error;
 
@@ -638,30 +641,30 @@ nvmm_hva_map(struct nvmm_ioc_hva_map *ar
 	if (error)
 		return error;
 
-	error = nvmm_seg_validate(mach, args->hva, args->size);
+	error = nvmm_hmapping_validate(mach, args->hva, args->size);
 	if (error)
 		goto out;
 
-	seg = nvmm_seg_alloc(mach);
-	if (seg == NULL) {
+	hmapping = nvmm_hmapping_alloc(mach);
+	if (hmapping == NULL) {
 		error = ENOBUFS;
 		goto out;
 	}
 
-	seg->hva = args->hva;
-	seg->size = args->size;
-	seg->uobj = uao_create(seg->size, 0);
-	uva = seg->hva;
+	hmapping->hva = args->hva;
+	hmapping->size = args->size;
+	hmapping->uobj = uao_create(hmapping->size, 0);
+	uva = hmapping->hva;
 
 	/* Take a reference for the user. */
-	uao_reference(seg->uobj);
+	uao_reference(hmapping->uobj);
 
 	/* Map the uobj into the user address space, as pageable. */
-	error = uvm_map(&vmspace->vm_map, &uva, seg->size, seg->uobj, 0, 0,
-	    UVM_MAPFLAG(UVM_PROT_RW, UVM_PROT_RW, UVM_INH_SHARE,
+	error = uvm_map(&vmspace->vm_map, &uva, hmapping->size, hmapping->uobj,
+	    0, 0, UVM_MAPFLAG(UVM_PROT_RW, UVM_PROT_RW, UVM_INH_SHARE,
 	    UVM_ADV_RANDOM, UVM_FLAG_FIXED|UVM_FLAG_UNMAP));
 	if (error) {
-		uao_detach(seg->uobj);
+		uao_detach(hmapping->uobj);
 	}
 
 out:
@@ -673,21 +676,16 @@ static int
 nvmm_hva_unmap(struct nvmm_ioc_hva_unmap *args)
 {
 	struct nvmm_machine *mach;
-	struct nvmm_seg *seg;
 	int error;
 
 	error = nvmm_machine_get(args->machid, &mach, true);
 	if (error)
 		return error;
 
-	seg = nvmm_seg_find(mach, args->hva, args->size);
-	if (seg == NULL)
-		return ENOENT;
-
-	nvmm_seg_free(seg);
+	error = nvmm_hmapping_free(mach, args->hva, args->size);
 
 	nvmm_machine_put(mach);
-	return 0;
+	return error;
 }
 
 /* -------------------------------------------------------------------------- */
@@ -728,7 +726,7 @@ nvmm_gpa_map(struct nvmm_ioc_gpa_map *ar
 	}
 	gpa = args->gpa;
 
-	uobj = nvmm_seg_getuobj(mach, args->hva, args->size, &off);
+	uobj = nvmm_hmapping_getuobj(mach, args->hva, args->size, &off);
 	if (uobj == NULL) {
 		error = EINVAL;
 		goto out;

Index: src/sys/dev/nvmm/nvmm_internal.h
diff -u src/sys/dev/nvmm/nvmm_internal.h:1.6 src/sys/dev/nvmm/nvmm_internal.h:1.7
--- src/sys/dev/nvmm/nvmm_internal.h:1.6	Sat Feb 23 12:27:00 2019
+++ src/sys/dev/nvmm/nvmm_internal.h	Thu Mar  7 15:22:21 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmm_internal.h,v 1.6 2019/02/23 12:27:00 maxv Exp $	*/
+/*	$NetBSD: nvmm_internal.h,v 1.7 2019/03/07 15:22:21 maxv Exp $	*/
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 
 #define NVMM_MAX_MACHINES	128
 #define NVMM_MAX_VCPUS		256
-#define NVMM_MAX_SEGS		32
+#define NVMM_MAX_HMAPPINGS	32
 #define NVMM_MAX_RAM		(128ULL * (1 << 30))
 
 struct nvmm_cpu {
@@ -53,7 +53,7 @@ struct nvmm_cpu {
 	void *cpudata;
 };
 
-struct nvmm_seg {
+struct nvmm_hmapping {
 	bool present;
 	uintptr_t hva;
 	size_t size;
@@ -71,8 +71,8 @@ struct nvmm_machine {
 	gpaddr_t gpa_begin;
 	gpaddr_t gpa_end;
 
-	/* Segments */
-	struct nvmm_seg segs[NVMM_MAX_SEGS];
+	/* Host Mappings */
+	struct nvmm_hmapping hmap[NVMM_MAX_HMAPPINGS];
 
 	/* CPU */
 	struct nvmm_cpu cpus[NVMM_MAX_VCPUS];

Reply via email to