aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2003-10-26 06:29:26 +0000
committerAlan Cox <alc@FreeBSD.org>2003-10-26 06:29:26 +0000
commit43186e53aeed2555e557e11507b9ef7450ad5063 (patch)
treed4da60eaf1a4e50a1c8bbe05dd56bc128be3e11d /sys
parent87931aff1121137a1fb663fd62a54a9b2f50ebc9 (diff)
downloadsrc-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')
-rw-r--r--sys/vm/vm_object.c23
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);