diff options
author | dyson <dyson@FreeBSD.org> | 1996-03-12 02:27:20 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1996-03-12 02:27:20 +0000 |
commit | df05bab7f810062df8ab32d8ab97e2dcd9e486f7 (patch) | |
tree | 1fc6ceef138470745a712d1e7fbcc7e43e19f5ad /sys/vm/vm_mmap.c | |
parent | 8a9da25ead273a1a9d8e8f7152426c7d80e0cadd (diff) | |
download | FreeBSD-src-df05bab7f810062df8ab32d8ab97e2dcd9e486f7.zip FreeBSD-src-df05bab7f810062df8ab32d8ab97e2dcd9e486f7.tar.gz |
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.
Diffstat (limited to 'sys/vm/vm_mmap.c')
-rw-r--r-- | sys/vm/vm_mmap.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 6de3460..e1de743 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); |