From 5c7fd76c9ea99facdd465e12e28fd5d1736d3fe0 Mon Sep 17 00:00:00 2001 From: alc Date: Sun, 20 Apr 2003 23:23:41 +0000 Subject: [PATCH] - Lock the vm_object when performing either vm_object_clear_flag() or vm_object_pip_wakeup(). --- sys/vm/vm_object.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 1b27b1dadc4..d5838492ded 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -721,7 +721,9 @@ vm_object_page_clean(vm_object_t object, vm_pindex_t start, vm_pindex_t end, int */ if (tscan >= tend && (tstart || tend < object->size)) { vm_page_unlock_queues(); + VM_OBJECT_LOCK(object); vm_object_clear_flag(object, OBJ_CLEANING); + VM_OBJECT_UNLOCK(object); return; } pagerflags &= ~VM_PAGER_IGNORE_CLEANCHK; @@ -747,7 +749,9 @@ vm_object_page_clean(vm_object_t object, vm_pindex_t start, vm_pindex_t end, int if (clearobjflags && (tstart == 0) && (tend == object->size)) { struct vnode *vp; + VM_OBJECT_LOCK(object); vm_object_clear_flag(object, OBJ_WRITEABLE|OBJ_MIGHTBEDIRTY); + VM_OBJECT_UNLOCK(object); if (object->type == OBJT_VNODE && (vp = (struct vnode *)object->handle) != NULL) { VI_LOCK(vp); @@ -813,7 +817,9 @@ vm_object_page_clean(vm_object_t object, vm_pindex_t start, vm_pindex_t end, int VOP_FSYNC(vp, NULL, (pagerflags & VM_PAGER_PUT_SYNC)?MNT_WAIT:0, curproc); #endif + VM_OBJECT_LOCK(object); vm_object_clear_flag(object, OBJ_CLEANING); + VM_OBJECT_UNLOCK(object); return; } @@ -1207,8 +1213,8 @@ vm_object_split(vm_map_entry_t entry) vm_page_busy(m); vm_page_unlock_queues(); } + VM_OBJECT_LOCK(orig_object); if (orig_object->type == OBJT_SWAP) { - VM_OBJECT_LOCK(orig_object); vm_object_pip_add(orig_object, 1); VM_OBJECT_UNLOCK(orig_object); /* @@ -1217,8 +1223,10 @@ vm_object_split(vm_map_entry_t entry) * shadow object. */ swap_pager_copy(orig_object, new_object, offidxstart, 0); + VM_OBJECT_LOCK(orig_object); vm_object_pip_wakeup(orig_object); } + VM_OBJECT_UNLOCK(orig_object); vm_page_lock_queues(); TAILQ_FOREACH(m, &new_object->memq, listq) vm_page_wakeup(m); @@ -1534,9 +1542,13 @@ vm_object_collapse(vm_object_t object) backing_object, object, OFF_TO_IDX(object->backing_object_offset), TRUE); + VM_OBJECT_LOCK(object); vm_object_pip_wakeup(object); + VM_OBJECT_UNLOCK(object); + VM_OBJECT_LOCK(backing_object); vm_object_pip_wakeup(backing_object); + VM_OBJECT_UNLOCK(backing_object); } /* * Object now shadows whatever backing_object did. -- 2.45.2