diff options
author | alc <alc@FreeBSD.org> | 2003-05-02 04:55:21 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-05-02 04:55:21 +0000 |
commit | da0d4657d38d92512bd969d1b9909e5a263f2bb8 (patch) | |
tree | 354e3b06d203efaf0fbf94781f290baa90bceefe /sys/vm/vm_object.c | |
parent | f449396167e2de3dd281b2134d0c9a7ba76a275d (diff) | |
download | FreeBSD-src-da0d4657d38d92512bd969d1b9909e5a263f2bb8.zip FreeBSD-src-da0d4657d38d92512bd969d1b9909e5a263f2bb8.tar.gz |
Lock the vm_object when updating its shadow list.
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r-- | sys/vm/vm_object.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 693118a..1cce82f 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1529,8 +1529,8 @@ vm_object_collapse(vm_object_t object) /* * Move the pager from backing_object to object. */ + VM_OBJECT_LOCK(backing_object); if (backing_object->type == OBJT_SWAP) { - VM_OBJECT_LOCK(backing_object); vm_object_pip_add(backing_object, 1); VM_OBJECT_UNLOCK(backing_object); /* @@ -1554,7 +1554,6 @@ vm_object_collapse(vm_object_t object) VM_OBJECT_LOCK(backing_object); vm_object_pip_wakeup(backing_object); - VM_OBJECT_UNLOCK(backing_object); } /* * Object now shadows whatever backing_object did. @@ -1570,6 +1569,7 @@ vm_object_collapse(vm_object_t object) backing_object->shadow_count--; backing_object->generation++; if (backing_object->backing_object) { + VM_OBJECT_LOCK(backing_object->backing_object); TAILQ_REMOVE( &backing_object->backing_object->shadow_head, backing_object, @@ -1577,9 +1577,11 @@ vm_object_collapse(vm_object_t object) ); backing_object->backing_object->shadow_count--; 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); TAILQ_INSERT_TAIL( &object->backing_object->shadow_head, object, @@ -1587,6 +1589,7 @@ vm_object_collapse(vm_object_t object) ); object->backing_object->shadow_count++; object->backing_object->generation++; + VM_OBJECT_UNLOCK(object->backing_object); } object->backing_object_offset += @@ -1601,6 +1604,7 @@ vm_object_collapse(vm_object_t object) */ 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); TAILQ_REMOVE( @@ -1629,6 +1633,7 @@ vm_object_collapse(vm_object_t object) * chain. Deallocating backing_object will not remove * it, since its reference count is at least 2. */ + VM_OBJECT_LOCK(backing_object); TAILQ_REMOVE( &backing_object->shadow_head, object, @@ -1636,10 +1641,12 @@ vm_object_collapse(vm_object_t object) ); backing_object->shadow_count--; backing_object->generation++; + VM_OBJECT_UNLOCK(backing_object); new_backing_object = backing_object->backing_object; if ((object->backing_object = new_backing_object) != NULL) { vm_object_reference(new_backing_object); + VM_OBJECT_LOCK(new_backing_object); TAILQ_INSERT_TAIL( &new_backing_object->shadow_head, object, @@ -1647,6 +1654,7 @@ vm_object_collapse(vm_object_t object) ); new_backing_object->shadow_count++; new_backing_object->generation++; + VM_OBJECT_UNLOCK(new_backing_object); object->backing_object_offset += backing_object->backing_object_offset; } |