summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>1999-05-17 00:53:56 +0000
committeralc <alc@FreeBSD.org>1999-05-17 00:53:56 +0000
commit936a55303324f390417668b877ccabddca5cc384 (patch)
tree710bb6c848d0b2fdbb018a2b9eeaac6b17679b33 /sys
parent1762400fc86f27481374190b1694040c5e805fcc (diff)
downloadFreeBSD-src-936a55303324f390417668b877ccabddca5cc384.zip
FreeBSD-src-936a55303324f390417668b877ccabddca5cc384.tar.gz
Add the options MAP_PREFAULT and MAP_PREFAULT_PARTIAL to vm_map_find/insert,
eliminating the need for the pmap_object_init_pt calls in imgact_* and mmap. Reviewed by: David Greenman <dg@root.com>
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/imgact_aout.c10
-rw-r--r--sys/kern/imgact_elf.c17
-rw-r--r--sys/vm/vm_map.c7
-rw-r--r--sys/vm/vm_map.h4
-rw-r--r--sys/vm/vm_mmap.c12
5 files changed, 17 insertions, 33 deletions
diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c
index f01a6c1..3da5f99 100644
--- a/sys/kern/imgact_aout.c
+++ b/sys/kern/imgact_aout.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: imgact_aout.c,v 1.50 1999/05/09 16:04:06 peter Exp $
+ * $Id: imgact_aout.c,v 1.51 1999/05/14 23:09:00 alc Exp $
*/
#include <sys/param.h>
@@ -190,7 +190,7 @@ exec_aout_imgact(imgp)
file_offset,
virtual_offset, text_end,
VM_PROT_READ | VM_PROT_EXECUTE, VM_PROT_ALL,
- MAP_COPY_ON_WRITE);
+ MAP_COPY_ON_WRITE | MAP_PREFAULT);
if (error) {
vm_map_unlock(map);
return (error);
@@ -202,17 +202,13 @@ exec_aout_imgact(imgp)
file_offset + a_out->a_text,
text_end, data_end,
VM_PROT_ALL, VM_PROT_ALL,
- MAP_COPY_ON_WRITE);
+ MAP_COPY_ON_WRITE | MAP_PREFAULT);
if (error) {
vm_map_unlock(map);
return (error);
}
}
- pmap_object_init_pt(vm_map_pmap(map), virtual_offset,
- object, (vm_pindex_t) OFF_TO_IDX(file_offset),
- a_out->a_text + a_out->a_data, 0);
-
if (bss_size) {
error = vm_map_insert(map, NULL, 0,
data_end, data_end + bss_size,
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 2934b94..e3cceb3 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -26,7 +26,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: imgact_elf.c,v 1.56 1999/05/09 16:04:08 peter Exp $
+ * $Id: imgact_elf.c,v 1.57 1999/05/14 23:09:00 alc Exp $
*/
#include "opt_rlimit.h"
@@ -220,19 +220,11 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
map_addr + map_len,/* virtual end */
prot,
VM_PROT_ALL,
- MAP_COPY_ON_WRITE);
+ MAP_COPY_ON_WRITE | MAP_PREFAULT);
vm_map_unlock(&vmspace->vm_map);
if (rv != KERN_SUCCESS)
return EINVAL;
- /* prefault the page tables */
- pmap_object_init_pt(vmspace_pmap(vmspace),
- map_addr,
- object,
- (vm_pindex_t) OFF_TO_IDX(file_addr),
- map_len,
- 0);
-
/* we can stop now if we've covered it all */
if (memsz == filsz)
return 0;
@@ -270,14 +262,11 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
TRUE,
VM_PROT_READ,
VM_PROT_ALL,
- MAP_COPY_ON_WRITE);
+ MAP_COPY_ON_WRITE | MAP_PREFAULT_PARTIAL);
if (rv != KERN_SUCCESS) {
vm_object_deallocate(object);
return EINVAL;
}
- pmap_object_init_pt(exec_map->pmap, data_buf, object,
- (vm_pindex_t) OFF_TO_IDX(trunc_page(offset + filsz)),
- PAGE_SIZE, 1);
/* send the page fragment to user space */
error = copyout((caddr_t)data_buf, (caddr_t)map_addr, copy_len);
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index d9c3f04..882a81b 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.c,v 1.161 1999/05/14 23:09:32 alc Exp $
+ * $Id: vm_map.c,v 1.162 1999/05/16 05:07:31 alc Exp $
*/
/*
@@ -561,6 +561,11 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
(prev_entry->end >= new_entry->start))
map->first_free = new_entry;
+ if (cow & (MAP_PREFAULT|MAP_PREFAULT_PARTIAL))
+ pmap_object_init_pt(map->pmap, start,
+ object, OFF_TO_IDX(offset), end - start,
+ cow & MAP_PREFAULT_PARTIAL);
+
return (KERN_SUCCESS);
}
diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h
index 2f07515..cb9bb12 100644
--- a/sys/vm/vm_map.h
+++ b/sys/vm/vm_map.h
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.h,v 1.39 1999/05/14 23:09:34 alc Exp $
+ * $Id: vm_map.h,v 1.40 1999/05/16 05:07:33 alc Exp $
*/
/*
@@ -308,6 +308,8 @@ vmspace_resident_count(struct vmspace *vmspace)
#define MAP_UNUSED_01 0x1
#define MAP_COPY_ON_WRITE 0x2
#define MAP_NOFAULT 0x4
+#define MAP_PREFAULT 0x8
+#define MAP_PREFAULT_PARTIAL 0x10
/*
* vm_fault option flags
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index bab8912..b763128 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.97 1999/05/14 23:09:34 alc Exp $
+ * $Id: vm_mmap.c,v 1.98 1999/05/16 05:07:33 alc Exp $
*/
/*
@@ -1035,7 +1035,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
docow = 0;
if ((flags & (MAP_ANON|MAP_SHARED)) == 0) {
- docow = MAP_COPY_ON_WRITE;
+ docow = MAP_COPY_ON_WRITE | MAP_PREFAULT_PARTIAL;
}
#if defined(VM_PROT_READ_IS_EXEC)
@@ -1068,14 +1068,6 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
}
/*
- * "Pre-fault" resident pages.
- */
- if ((map->pmap != NULL) && (object != NULL)) {
- pmap_object_init_pt(map->pmap, *addr,
- object, (vm_pindex_t) OFF_TO_IDX(foff), size, 1);
- }
-
- /*
* Shared memory is also shared with children.
*/
if (flags & (MAP_SHARED|MAP_INHERIT)) {
OpenPOWER on IntegriCloud