diff options
author | dyson <dyson@FreeBSD.org> | 1996-07-27 17:21:41 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1996-07-27 17:21:41 +0000 |
commit | 566ed4fc29e4818030f059f64eb44a20a85d934d (patch) | |
tree | de4516f0bbfc27af512928aa77725677a04cb693 /sys/vm | |
parent | 915073718db9afd8ddd4780791c6d429dff79bf4 (diff) | |
download | FreeBSD-src-566ed4fc29e4818030f059f64eb44a20a85d934d.zip FreeBSD-src-566ed4fc29e4818030f059f64eb44a20a85d934d.tar.gz |
Allow sequentially created mmap'ed anonymous regions to coalesce. There
is little or no reason to create a swap pager for small mmap's. The
vm_map_insert code will automatically create a swap pager if the object
becomes too large. This fix, per a request from phk.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_mmap.c | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 4d61a8e..3207991 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.45 1996/07/27 03:24:00 dyson Exp $ + * $Id: vm_mmap.c,v 1.46 1996/07/27 04:06:11 dyson Exp $ */ /* @@ -72,9 +72,7 @@ #include <vm/vm_extern.h> #include <vm/vm_kern.h> #include <vm/vm_page.h> -#ifdef notyet -#include <vm/loadaout.h> -#endif +#include <vm/default_pager.h> #ifndef _SYS_SYSPROTO_H_ struct sbrk_args { @@ -889,8 +887,10 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff) /* * Unnamed anonymous regions always start at 0. */ - if (handle == 0) + if (handle == 0) { foff = 0; + type = OBJT_DEFAULT; + } } else { vp = (struct vnode *) handle; if (vp->v_type == VCHR) { @@ -907,9 +907,15 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff) type = OBJT_VNODE; } } - object = vm_pager_allocate(type, handle, OFF_TO_IDX(objsize), prot, foff); - if (object == NULL) - return (type == OBJT_DEVICE ? EINVAL : ENOMEM); + + 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; + } /* * Force device mappings to be shared. @@ -927,7 +933,6 @@ vm_mmap(map, addr, size, prot, maxprot, flags, handle, foff) rv = vm_map_find(map, object, foff, addr, size, fitit, prot, maxprot, docow); - if (rv != KERN_SUCCESS) { /* * Lose the object reference. Will destroy the @@ -1023,23 +1028,28 @@ vm_mapaout(map, baseaddr, vp, foff, textsize, datasize, bsssize, addr) return EINVAL; } - /* - * 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)); - + 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; + object = vm_pager_allocate(OBJT_VNODE, vp, + objpsize, VM_PROT_ALL, foff); + if (object == NULL) { + goto outnomem; + } } /* |