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>
This commit is contained in:
Alan Cox 1999-05-17 00:53:56 +00:00
parent 5e025bcf86
commit e972780a11
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=47258
5 changed files with 17 additions and 33 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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)
@ -1067,14 +1067,6 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
goto out;
}
/*
* "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.
*/