summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-04-20 23:23:41 +0000
committeralc <alc@FreeBSD.org>2003-04-20 23:23:41 +0000
commit5c7fd76c9ea99facdd465e12e28fd5d1736d3fe0 (patch)
treec0346441b96aff265bbfdf366da2f60262d53c64 /sys/vm
parente3e9666f33571d10e2a87f75acd04a360a7bbcd9 (diff)
downloadFreeBSD-src-5c7fd76c9ea99facdd465e12e28fd5d1736d3fe0.zip
FreeBSD-src-5c7fd76c9ea99facdd465e12e28fd5d1736d3fe0.tar.gz
- Lock the vm_object when performing either vm_object_clear_flag() or
vm_object_pip_wakeup().
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_object.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 1b27b1d..d583849 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 @@ again:
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.
OpenPOWER on IntegriCloud