summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_object.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-11-02 21:30:10 +0000
committeralc <alc@FreeBSD.org>2003-11-02 21:30:10 +0000
commit28e8cd183d9fd704019eb7317587d2a78d408bcb (patch)
treec444bccc0d758d1bb535604fed810ebf0d768d08 /sys/vm/vm_object.c
parent1bf95a39a6f845be3664583fb266063bcd3a003f (diff)
downloadFreeBSD-src-28e8cd183d9fd704019eb7317587d2a78d408bcb.zip
FreeBSD-src-28e8cd183d9fd704019eb7317587d2a78d408bcb.tar.gz
- Introduce and use vm_object_reference_locked(). Unlike
vm_object_reference(), this function must not be used to reanimate dead vm objects. This restriction simplifies locking. Reviewed by: tegge
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r--sys/vm/vm_object.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 2a03568..be68111 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -377,6 +377,28 @@ vm_object_reference(vm_object_t object)
}
/*
+ * vm_object_reference_locked:
+ *
+ * Gets another reference to the given object.
+ *
+ * The object must be locked.
+ */
+void
+vm_object_reference_locked(vm_object_t object)
+{
+ struct vnode *vp;
+
+ VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
+ KASSERT((object->flags & OBJ_DEAD) == 0,
+ ("vm_object_reference_locked: dead object referenced"));
+ object->ref_count++;
+ if (object->type == OBJT_VNODE) {
+ vp = object->handle;
+ vref(vp);
+ }
+}
+
+/*
* Handle deallocating an object of type OBJT_VNODE.
*/
void
@@ -1184,12 +1206,12 @@ vm_object_split(vm_map_entry_t entry)
source = orig_object->backing_object;
if (source != NULL) {
- vm_object_reference(source); /* Referenced by new_object */
VM_OBJECT_LOCK(source);
LIST_INSERT_HEAD(&source->shadow_head,
new_object, shadow_list);
source->shadow_count++;
source->generation++;
+ vm_object_reference_locked(source); /* for new_object */
vm_object_clear_flag(source, OBJ_ONEMAPPING);
VM_OBJECT_UNLOCK(source);
new_object->backing_object_offset =
@@ -1623,7 +1645,6 @@ vm_object_collapse(vm_object_t 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);
LIST_INSERT_HEAD(
&new_backing_object->shadow_head,
@@ -1632,6 +1653,7 @@ vm_object_collapse(vm_object_t object)
);
new_backing_object->shadow_count++;
new_backing_object->generation++;
+ vm_object_reference_locked(new_backing_object);
VM_OBJECT_UNLOCK(new_backing_object);
object->backing_object_offset +=
backing_object->backing_object_offset;
OpenPOWER on IntegriCloud