diff options
author | alc <alc@FreeBSD.org> | 2003-06-29 23:32:55 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-06-29 23:32:55 +0000 |
commit | 65c6a689bc519fe51f539267d8fd8ec2f7139ed3 (patch) | |
tree | 37a260c8911b82ea6ec735f997dceb09ece0cd66 /sys/vm | |
parent | a810bddc153bedad5167855ef52ee1f9bc9f57cc (diff) | |
download | FreeBSD-src-65c6a689bc519fe51f539267d8fd8ec2f7139ed3.zip FreeBSD-src-65c6a689bc519fe51f539267d8fd8ec2f7139ed3.tar.gz |
Introduce vm_map_pmap_enter(). Presently, this is a stub calling the MD
pmap_object_init_pt().
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_map.c | 26 | ||||
-rw-r--r-- | sys/vm/vm_map.h | 2 |
2 files changed, 21 insertions, 7 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 642afbd..c879bc4 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -911,11 +911,9 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset, #endif if (cow & (MAP_PREFAULT|MAP_PREFAULT_PARTIAL)) { - mtx_lock(&Giant); - pmap_object_init_pt(map->pmap, start, + vm_map_pmap_enter(map, start, object, OFF_TO_IDX(offset), end - start, cow & MAP_PREFAULT_PARTIAL); - mtx_unlock(&Giant); } return (KERN_SUCCESS); @@ -1272,6 +1270,23 @@ vm_map_submap( } /* + * vm_map_pmap_enter: + * + * Preload the mappings for the given object into the specified + * map. This eliminates the soft faults on process startup and + * immediately after an mmap(2). + */ +void +vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, + vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags) +{ + + mtx_lock(&Giant); + pmap_object_init_pt(map->pmap, addr, object, pindex, size, flags); + mtx_unlock(&Giant); +} + +/* * vm_map_protect: * * Sets the protection of the specified address @@ -1491,16 +1506,13 @@ vm_map_madvise( vm_object_madvise(current->object.vm_object, pindex, count, behav); if (behav == MADV_WILLNEED) { - mtx_lock(&Giant); - pmap_object_init_pt( - map->pmap, + vm_map_pmap_enter(map, useStart, current->object.vm_object, pindex, (count << PAGE_SHIFT), MAP_PREFAULT_MADVISE ); - mtx_unlock(&Giant); } } vm_map_unlock_read(map); diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index 6c89f250..62d0124 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -310,6 +310,8 @@ int vm_map_lookup (vm_map_t *, vm_offset_t, vm_prot_t, vm_map_entry_t *, vm_obje void vm_map_lookup_done (vm_map_t, vm_map_entry_t); boolean_t vm_map_lookup_entry (vm_map_t, vm_offset_t, vm_map_entry_t *); int vm_map_clean (vm_map_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t); +void vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, + vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags); int vm_map_protect (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t, boolean_t); int vm_map_remove (vm_map_t, vm_offset_t, vm_offset_t); void vm_map_startup (void); |