diff options
author | Alan Cox <alc@FreeBSD.org> | 2003-10-26 06:29:26 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2003-10-26 06:29:26 +0000 |
commit | 43186e53aeed2555e557e11507b9ef7450ad5063 (patch) | |
tree | d4da60eaf1a4e50a1c8bbe05dd56bc128be3e11d /sys/vm/vm_object.c | |
parent | 87931aff1121137a1fb663fd62a54a9b2f50ebc9 (diff) | |
download | src-43186e53aeed2555e557e11507b9ef7450ad5063.tar.gz src-43186e53aeed2555e557e11507b9ef7450ad5063.zip |
- Simplify vm_object_collapse()'s collapse case, reducing the number
of lock acquires and releases performed.
- Move an assertion from vm_object_collapse() to vm_object_zdtor()
because it applies to all cases of object destruction.
Notes
Notes:
svn path=/head/; revision=121562
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r-- | sys/vm/vm_object.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 087959b95cd1..27dd71fa9718 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -160,6 +160,9 @@ vm_object_zdtor(void *mem, int size, void *arg) vm_object_t object; object = (vm_object_t)mem; + KASSERT(TAILQ_EMPTY(&object->memq), + ("object %p has resident pages", + object)); KASSERT(object->paging_in_progress == 0, ("object %p paging_in_progress = %d", object, object->paging_in_progress)); @@ -1585,23 +1588,16 @@ vm_object_collapse(vm_object_t object) if (backing_object->backing_object) { VM_OBJECT_LOCK(backing_object->backing_object); LIST_REMOVE(backing_object, shadow_list); - backing_object->backing_object->shadow_count--; + LIST_INSERT_HEAD( + &backing_object->backing_object->shadow_head, + object, shadow_list); + /* + * The shadow_count has not changed. + */ backing_object->backing_object->generation++; VM_OBJECT_UNLOCK(backing_object->backing_object); } object->backing_object = backing_object->backing_object; - if (object->backing_object) { - VM_OBJECT_LOCK(object->backing_object); - LIST_INSERT_HEAD( - &object->backing_object->shadow_head, - object, - shadow_list - ); - object->backing_object->shadow_count++; - object->backing_object->generation++; - VM_OBJECT_UNLOCK(object->backing_object); - } - object->backing_object_offset += backing_object->backing_object_offset; /* XXX */ VM_OBJECT_UNLOCK(object); @@ -1614,7 +1610,6 @@ vm_object_collapse(vm_object_t object) * necessary is to dispose of it. */ KASSERT(backing_object->ref_count == 1, ("backing_object %p was somehow re-referenced during collapse!", backing_object)); - KASSERT(TAILQ_FIRST(&backing_object->memq) == NULL, ("backing_object %p somehow has left over pages during collapse!", backing_object)); VM_OBJECT_UNLOCK(backing_object); mtx_lock(&vm_object_list_mtx); |