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:
parent
5e025bcf86
commit
e972780a11
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=47258
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user