summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_object.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1998-04-29 04:28:22 +0000
committerdyson <dyson@FreeBSD.org>1998-04-29 04:28:22 +0000
commitb5a79794cdadebe1ac863e5b8bde8d4b86cb8a5e (patch)
treee81f03d1aec7ca81483ab31e8815b8289c35be97 /sys/vm/vm_object.c
parent67c7bb9c04ed76649b6be0484dcfaa84fa554bcd (diff)
downloadFreeBSD-src-b5a79794cdadebe1ac863e5b8bde8d4b86cb8a5e.zip
FreeBSD-src-b5a79794cdadebe1ac863e5b8bde8d4b86cb8a5e.tar.gz
Tighten up management of memory and swap space during map allocation,
deallocation cycles. This should provide a measurable improvement on swap and memory allocation on loaded systems. It is unlikely a complete solution. Also, provide more map info with procfs. Chuck Cranor spurred on this improvement.
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r--sys/vm/vm_object.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 822b953..f1abad0 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_object.c,v 1.118 1998/03/08 18:05:59 dyson Exp $
+ * $Id: vm_object.c,v 1.119 1998/03/16 01:55:52 dyson Exp $
*/
/*
@@ -135,6 +135,7 @@ static vm_zone_t obj_zone;
static struct vm_zone obj_zone_store;
#define VM_OBJECTS_INIT 256
static struct vm_object vm_objects_init[VM_OBJECTS_INIT];
+static int objidnumber;
void
_vm_object_allocate(type, size, object)
@@ -150,6 +151,9 @@ _vm_object_allocate(type, size, object)
object->size = size;
object->ref_count = 1;
object->flags = 0;
+ object->id = ++objidnumber;
+ if ((object->type == OBJT_DEFAULT) || (object->type == OBJT_SWAP))
+ object->flags |= OBJ_ONEMAPPING;
object->behavior = OBJ_NORMAL;
object->paging_in_progress = 0;
object->resident_page_count = 0;
@@ -312,8 +316,11 @@ vm_object_deallocate(object)
* Here on ref_count of one or two, which are special cases for
* objects.
*/
- if ((object->ref_count == 2) && (object->shadow_count == 1)) {
-
+ if ((object->ref_count == 2) && (object->shadow_count == 0)) {
+ object->flags |= OBJ_ONEMAPPING;
+ object->ref_count--;
+ return;
+ } else if ((object->ref_count == 2) && (object->shadow_count == 1)) {
object->ref_count--;
if ((object->handle == NULL) &&
(object->type == OBJT_DEFAULT ||
@@ -870,6 +877,7 @@ vm_object_shadow(object, offset, length)
result->backing_object = source;
if (source) {
TAILQ_INSERT_TAIL(&source->shadow_head, result, shadow_list);
+ source->flags &= ~OBJ_ONEMAPPING;
source->shadow_count++;
source->generation++;
}
@@ -1100,7 +1108,7 @@ vm_object_collapse(object)
OFF_TO_IDX(backing_object->paging_offset),
object,
OFF_TO_IDX(object->paging_offset),
- OFF_TO_IDX(object->backing_object_offset));
+ OFF_TO_IDX(object->backing_object_offset), TRUE);
vm_object_pip_wakeup(object);
} else {
object->paging_in_progress++;
OpenPOWER on IntegriCloud