aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJohn Dyson <dyson@FreeBSD.org>1996-03-12 02:27:20 +0000
committerJohn Dyson <dyson@FreeBSD.org>1996-03-12 02:27:20 +0000
commit5850152d9508f08ab132b74482bfbdbfebca0ffc (patch)
tree1fc6ceef138470745a712d1e7fbcc7e43e19f5ad /sys
parent82622fe072ec11aa78c2703205be7fa533079763 (diff)
downloadsrc-5850152d9508f08ab132b74482bfbdbfebca0ffc.tar.gz
src-5850152d9508f08ab132b74482bfbdbfebca0ffc.zip
Allow mmap'ed devices to work correctly across forks. The sanest
solution appeared to be to allow the child to maintain the same mapping as the parent.
Notes
Notes: svn path=/head/; revision=14574
Diffstat (limited to 'sys')
-rw-r--r--sys/vm/vm_mmap.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 6de346054363..e1de74319370 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -38,7 +38,7 @@
* from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$
*
* @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94
- * $Id: vm_mmap.c,v 1.37 1996/03/02 02:54:21 dyson Exp $
+ * $Id: vm_mmap.c,v 1.38 1996/03/02 17:14:09 peter Exp $
*/
/*
@@ -753,9 +753,16 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
if (object == NULL)
return (type == OBJT_DEVICE ? EINVAL : ENOMEM);
+ /*
+ * default to MAP_SHARED on a device mapping
+ */
+ if ((type == OBJT_DEVICE) &&
+ (flags & (MAP_SHARED|MAP_COPY|MAP_PRIVATE)) == 0)
+ flags |= MAP_SHARED;
+
object2 = NULL;
docow = 0;
- if ((flags & (MAP_ANON|MAP_SHARED)) == 0 && (type != OBJT_DEVICE)) {
+ if ((flags & (MAP_ANON|MAP_SHARED)) == 0) {
docow = MAP_COPY_ON_WRITE;
if (objsize < size) {
object2 = vm_object_allocate( OBJT_DEFAULT,
@@ -769,6 +776,7 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
docow |= MAP_COPY_NEEDED;
}
}
+
if (object2)
rv = vm_map_find(map, object2, 0, addr, size, fitit,
prot, maxprot, docow);
@@ -802,7 +810,7 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
/*
* Shared memory is also shared with children.
*/
- if (flags & MAP_SHARED) {
+ if (flags & (MAP_SHARED|MAP_INHERIT)) {
rv = vm_map_inherit(map, *addr, *addr + size, VM_INHERIT_SHARE);
if (rv != KERN_SUCCESS) {
(void) vm_map_remove(map, *addr, *addr + size);