summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_mmap.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1996-07-27 17:21:41 +0000
committerdyson <dyson@FreeBSD.org>1996-07-27 17:21:41 +0000
commit566ed4fc29e4818030f059f64eb44a20a85d934d (patch)
treede4516f0bbfc27af512928aa77725677a04cb693 /sys/vm/vm_mmap.c
parent915073718db9afd8ddd4780791c6d429dff79bf4 (diff)
downloadFreeBSD-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/vm_mmap.c')
-rw-r--r--sys/vm/vm_mmap.c56
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;
+ }
}
/*
OpenPOWER on IntegriCloud