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;