Module Name:    src
Committed By:   christos
Date:           Fri Jul 18 12:36:57 UTC 2014

Modified Files:
        src/sys/sys: mman.h
        src/sys/uvm: uvm_map.c

Log Message:
Add MAP_INHERIT_ZERO


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/sys/mman.h
cvs rdiff -u -r1.329 -r1.330 src/sys/uvm/uvm_map.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/sys/mman.h
diff -u src/sys/sys/mman.h:1.46 src/sys/sys/mman.h:1.47
--- src/sys/sys/mman.h:1.46	Mon Jun 30 17:46:33 2014
+++ src/sys/sys/mman.h	Fri Jul 18 08:36:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mman.h,v 1.46 2014/06/30 21:46:33 matt Exp $	*/
+/*	$NetBSD: mman.h,v 1.47 2014/07/18 12:36:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -161,6 +161,7 @@ typedef	__off_t		off_t;		/* file offset 
 #define	MAP_INHERIT_NONE	2	/* absent from child */
 #define	MAP_INHERIT_DONATE_COPY	3	/* copy and delete -- not
 					   implemented in UVM */
+#define	MAP_INHERIT_ZERO	4	/* zero in child */
 #define	MAP_INHERIT_DEFAULT	MAP_INHERIT_COPY
 #endif
 

Index: src/sys/uvm/uvm_map.c
diff -u src/sys/uvm/uvm_map.c:1.329 src/sys/uvm/uvm_map.c:1.330
--- src/sys/uvm/uvm_map.c:1.329	Fri Jul 18 08:19:09 2014
+++ src/sys/uvm/uvm_map.c	Fri Jul 18 08:36:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_map.c,v 1.329 2014/07/18 12:19:09 christos Exp $	*/
+/*	$NetBSD: uvm_map.c,v 1.330 2014/07/18 12:36:57 christos Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.329 2014/07/18 12:19:09 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.330 2014/07/18 12:36:57 christos Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -3097,6 +3097,7 @@ uvm_map_inherit(struct vm_map *map, vadd
 	case MAP_INHERIT_NONE:
 	case MAP_INHERIT_COPY:
 	case MAP_INHERIT_SHARE:
+	case MAP_INHERIT_ZERO:
 		break;
 	default:
 		UVMHIST_LOG(maphist,"<- done (INVALID ARG)",0,0,0,0);
@@ -4346,6 +4347,35 @@ uvm_mapent_forkcopy(struct vm_map *new_m
 }
 
 /*
+ * zero the mapping: the new entry will be zero initialized
+ */
+static void
+uvm_mapent_forkzero(struct vm_map *new_map, struct vm_map *old_map,
+    struct vm_map_entry *old_entry)
+{
+	struct vm_map_entry *new_entry;
+
+	new_entry = uvm_mapent_clone(new_map, old_entry, 0);
+
+	new_entry->etype |=
+	    (UVM_ET_COPYONWRITE|UVM_ET_NEEDSCOPY);
+
+	if (new_entry->aref.ar_amap) {
+		uvm_map_unreference_amap(new_entry, 0);
+		new_entry->aref.ar_pageoff = 0;
+		new_entry->aref.ar_amap = NULL;
+	}
+
+	if (UVM_ET_ISOBJ(new_entry)) {
+		if (new_entry->object.uvm_obj->pgops->pgo_detach)
+			new_entry->object.uvm_obj->pgops->pgo_detach(
+			    new_entry->object.uvm_obj);
+		new_entry->object.uvm_obj = NULL;
+		new_entry->etype &= ~UVM_ET_OBJ;
+	}
+}
+
+/*
  *   F O R K   -   m a i n   e n t r y   p o i n t
  */
 /*
@@ -4405,6 +4435,9 @@ uvmspace_fork(struct vmspace *vm1)
 			uvm_mapent_forkcopy(new_map, old_map, old_entry);
 			break;
 
+		case MAP_INHERIT_ZERO:
+			uvm_mapent_forkzero(new_map, old_map, old_entry);
+			break;
 		default:
 			KASSERT(0);
 			break;

Reply via email to