summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_mmap.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1996-07-30 03:08:57 +0000
committerdyson <dyson@FreeBSD.org>1996-07-30 03:08:57 +0000
commit01ce9d323a15a1365c3b7802f404edd77da1e38b (patch)
treeac8503dbf428f1dae7c0a8bba152c865f89a493a /sys/vm/vm_mmap.c
parentff1df96f3bbd049cd4de0c3d6652ac34449f19b9 (diff)
downloadFreeBSD-src-01ce9d323a15a1365c3b7802f404edd77da1e38b.zip
FreeBSD-src-01ce9d323a15a1365c3b7802f404edd77da1e38b.tar.gz
Backed out the recent changes/enhancements to the VM code. The
problem with the 'shell scripts' was found, but there was a 'strange' problem found with a 486 laptop that we could not find. This commit backs the code back to 25-jul, and will be re-entered after the snapshot in smaller (more easily tested) chunks.
Diffstat (limited to 'sys/vm/vm_mmap.c')
-rw-r--r--sys/vm/vm_mmap.c229
1 files changed, 33 insertions, 196 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index a1a48a9..047b39e 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.47 1996/07/27 17:21:41 dyson Exp $
+ * $Id: vm_mmap.c,v 1.48 1996/07/28 02:54:09 davidg Exp $
*/
/*
@@ -72,7 +72,6 @@
#include <vm/vm_extern.h>
#include <vm/vm_kern.h>
#include <vm/vm_page.h>
-#include <vm/default_pager.h>
#ifndef _SYS_SYSPROTO_H_
struct sbrk_args {
@@ -690,10 +689,10 @@ mincore(p, uap, retval)
if (m) {
mincoreinfo = MINCORE_INCORE;
if (m->dirty ||
- pmap_tc_modified(m))
+ pmap_is_modified(VM_PAGE_TO_PHYS(m)))
mincoreinfo |= MINCORE_MODIFIED_OTHER;
if ((m->flags & PG_REFERENCED) ||
- pmap_tc_referenced(VM_PAGE_TO_PHYS(m)))
+ pmap_is_referenced(VM_PAGE_TO_PHYS(m)))
mincoreinfo |= MINCORE_REFERENCED_OTHER;
}
}
@@ -845,7 +844,7 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
vm_ooffset_t foff;
{
boolean_t fitit;
- vm_object_t object;
+ vm_object_t object, object2;
struct vnode *vp = NULL;
objtype_t type;
int rv = KERN_SUCCESS;
@@ -883,15 +882,12 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
* Lookup/allocate object.
*/
if (flags & MAP_ANON) {
+ type = OBJT_SWAP;
/*
* Unnamed anonymous regions always start at 0.
*/
- if (handle == 0) {
+ if (handle == 0)
foff = 0;
- type = OBJT_DEFAULT;
- } else {
- type = OBJT_SWAP;
- }
} else {
vp = (struct vnode *) handle;
if (vp->v_type == VCHR) {
@@ -908,15 +904,9 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
type = OBJT_VNODE;
}
}
-
- if (type != OBJT_DEFAULT) {
- object = vm_pager_allocate(type, handle,
- OFF_TO_IDX(objsize), prot, foff);
- if (object == NULL)
- return (type == OBJT_DEVICE ? EINVAL : ENOMEM);
- } else {
- object = NULL;
- }
+ object = vm_pager_allocate(type, handle, OFF_TO_IDX(objsize), prot, foff);
+ if (object == NULL)
+ return (type == OBJT_DEVICE ? EINVAL : ENOMEM);
/*
* Force device mappings to be shared.
@@ -926,13 +916,30 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
flags |= MAP_SHARED;
}
+ object2 = NULL;
docow = 0;
if ((flags & (MAP_ANON|MAP_SHARED)) == 0) {
- docow = MAP_COPY_ON_WRITE|MAP_COPY_NEEDED;
+ docow = MAP_COPY_ON_WRITE;
+ if (objsize < size) {
+ object2 = vm_object_allocate( OBJT_DEFAULT,
+ OFF_TO_IDX(size - (foff & ~PAGE_MASK)));
+ object2->backing_object = object;
+ object2->backing_object_offset = foff;
+ TAILQ_INSERT_TAIL(&object->shadow_head,
+ object2, shadow_list);
+ ++object->shadow_count;
+ } else {
+ docow |= MAP_COPY_NEEDED;
+ }
}
- rv = vm_map_find(map, object, foff, addr, size, fitit,
- prot, maxprot, docow);
+ if (object2)
+ rv = vm_map_find(map, object2, 0, addr, size, fitit,
+ prot, maxprot, docow);
+ else
+ rv = vm_map_find(map, object, foff, addr, size, fitit,
+ prot, maxprot, docow);
+
if (rv != KERN_SUCCESS) {
/*
@@ -940,7 +947,10 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff)
* object if it's an unnamed anonymous mapping
* or named anonymous without other references.
*/
- vm_object_deallocate(object);
+ if (object2)
+ vm_object_deallocate(object2);
+ else
+ vm_object_deallocate(object);
goto out;
}
@@ -975,176 +985,3 @@ out:
return (EINVAL);
}
}
-
-#ifdef notyet
-/*
- * Efficient mapping of a .text+.data+.bss object
- */
-int
-vm_mapaout(map, baseaddr, vp, foff, textsize, datasize, bsssize, addr)
- vm_map_t map;
- vm_offset_t baseaddr;
- struct vnode *vp;
- vm_ooffset_t foff;
- register vm_size_t textsize, datasize, bsssize;
- vm_offset_t *addr;
-{
- vm_object_t object;
- int rv;
- vm_pindex_t objpsize;
- struct proc *p = curproc;
-
- vm_size_t totalsize;
- vm_size_t textend;
- struct vattr vat;
- int error;
-
- textsize = round_page(textsize);
- datasize = round_page(datasize);
- bsssize = round_page(bsssize);
- totalsize = textsize + datasize + bsssize;
-
- vm_map_lock(map);
- /*
- * If baseaddr == -1, then we need to search for space. Otherwise,
- * we need to be loaded into a certain spot.
- */
- if (baseaddr != (vm_offset_t) -1) {
- if (vm_map_findspace(map, baseaddr, totalsize, addr)) {
- goto outnomem;
- }
-
- if(*addr != baseaddr) {
- goto outnomem;
- }
- } else {
- baseaddr = round_page(p->p_vmspace->vm_daddr + MAXDSIZ);
- if (vm_map_findspace(map, baseaddr, totalsize, addr)) {
- goto outnomem;
- }
- }
-
- if (foff & PAGE_MASK) {
- vm_map_unlock(map);
- return EINVAL;
- }
-
- if ((vp->v_object != 0) &&
- ((((vm_object_t)vp->v_object)->flags & OBJ_DEAD) == 0)) {
- object = vp->v_object;
- vm_object_reference(object);
- } else {
- /*
- * get the object size to allocate
- */
- error = VOP_GETATTR(vp, &vat, p->p_ucred, p);
- if (error) {
- vm_map_unlock(map);
- return error;
- }
- objpsize = OFF_TO_IDX(round_page(vat.va_size));
- /*
- * Alloc/reference the object
- */
- object = vm_pager_allocate(OBJT_VNODE, vp,
- objpsize, VM_PROT_ALL, foff);
- if (object == NULL) {
- goto outnomem;
- }
- }
-
- /*
- * Insert .text into the map
- */
- textend = *addr + textsize;
- rv = vm_map_insert(map, object, foff,
- *addr, textend,
- VM_PROT_READ|VM_PROT_EXECUTE, VM_PROT_ALL,
- MAP_COPY_ON_WRITE|MAP_COPY_NEEDED);
- if (rv != KERN_SUCCESS) {
- vm_object_deallocate(object);
- goto out;
- }
-
- /*
- * Insert .data into the map, if there is any to map.
- */
- if (datasize != 0) {
- object->ref_count++;
- rv = vm_map_insert(map, object, foff + textsize,
- textend, textend + datasize,
- VM_PROT_ALL, VM_PROT_ALL,
- MAP_COPY_ON_WRITE|MAP_COPY_NEEDED);
- if (rv != KERN_SUCCESS) {
- --object->ref_count;
- vm_map_delete(map, *addr, textend);
- goto out;
- }
- }
-
- /*
- * Preload the page tables
- */
- pmap_object_init_pt(map->pmap, *addr,
- object, (vm_pindex_t) OFF_TO_IDX(foff),
- textsize + datasize, 1);
-
- /*
- * Get the space for bss.
- */
- if (bsssize != 0) {
- rv = vm_map_insert(map, NULL, 0,
- textend + datasize,
- *addr + totalsize,
- VM_PROT_ALL, VM_PROT_ALL, 0);
- }
- if (rv != KERN_SUCCESS) {
- vm_map_delete(map, *addr, textend + datasize + bsssize);
- }
-
-out:
- vm_map_unlock(map);
- switch (rv) {
- case KERN_SUCCESS:
- return 0;
- case KERN_INVALID_ADDRESS:
- case KERN_NO_SPACE:
- return ENOMEM;
- case KERN_PROTECTION_FAILURE:
- return EACCES;
- default:
- return EINVAL;
- }
-outnomem:
- vm_map_unlock(map);
- return ENOMEM;
-}
-
-
-int
-mapaout(struct proc *p, struct mapaout_args *uap, int *retval)
-{
-
- register struct filedesc *fdp = p->p_fd;
- struct file *fp;
- struct vnode *vp;
- int rtval;
-
- if (((unsigned) uap->fd) >= fdp->fd_nfiles ||
- (fp = fdp->fd_ofiles[uap->fd]) == NULL)
- return (EBADF);
- if (fp->f_type != DTYPE_VNODE)
- return (EINVAL);
-
- vp = (struct vnode *) fp->f_data;
- if ((vp->v_type != VREG) && (vp->v_type != VCHR))
- return (EINVAL);
-
- rtval = vm_mapaout( &p->p_vmspace->vm_map,
- uap->addr, vp, uap->offset,
- uap->textsize, uap->datasize, uap->bsssize,
- (vm_offset_t *)retval);
-
- return rtval;
-}
-#endif
OpenPOWER on IntegriCloud