diff options
author | alc <alc@FreeBSD.org> | 2003-11-01 04:54:23 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-11-01 04:54:23 +0000 |
commit | 8ded4dfb69d56c7c1d2b22688776da16d814d18b (patch) | |
tree | fd59294316d15e0ace0bbaa535e6a32376ce6318 /sys/vm/vm_object.c | |
parent | 253c4ff77b893174a214522efdb77664d9048c42 (diff) | |
download | FreeBSD-src-8ded4dfb69d56c7c1d2b22688776da16d814d18b.zip FreeBSD-src-8ded4dfb69d56c7c1d2b22688776da16d814d18b.tar.gz |
- Additional vm object locking in vm_object_split()
- New vm object locking assertions in vm_page_insert() and
vm_object_set_writeable_dirty()
Diffstat (limited to 'sys/vm/vm_object.c')
-rw-r--r-- | sys/vm/vm_object.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 1d71d85..0d904c3 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1196,6 +1196,7 @@ vm_object_split(vm_map_entry_t entry) orig_object->backing_object_offset + offset; new_object->backing_object = source; } + VM_OBJECT_LOCK(new_object); VM_OBJECT_LOCK(orig_object); for (idx = 0; idx < size; idx++) { retry: @@ -1211,15 +1212,22 @@ vm_object_split(vm_map_entry_t entry) * not be changed by this operation. */ vm_page_lock_queues(); - if (vm_page_sleep_if_busy(m, TRUE, "spltwt")) + if ((m->flags & PG_BUSY) || m->busy) { + vm_page_flag_set(m, PG_WANTED | PG_REFERENCED); + VM_OBJECT_UNLOCK(orig_object); + VM_OBJECT_UNLOCK(new_object); + msleep(m, &vm_page_queue_mtx, PDROP | PVM, "spltwt", 0); + VM_OBJECT_LOCK(new_object); + VM_OBJECT_LOCK(orig_object); goto retry; - + } vm_page_busy(m); vm_page_rename(m, new_object, idx); /* page automatically made dirty by rename and cache handled */ vm_page_busy(m); vm_page_unlock_queues(); } + VM_OBJECT_UNLOCK(new_object); if (orig_object->type == OBJT_SWAP) { vm_object_pip_add(orig_object, 1); VM_OBJECT_UNLOCK(orig_object); @@ -1828,6 +1836,7 @@ vm_object_set_writeable_dirty(vm_object_t object) { struct vnode *vp; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); vm_object_set_flag(object, OBJ_WRITEABLE|OBJ_MIGHTBEDIRTY); if (object->type == OBJT_VNODE && (vp = (struct vnode *)object->handle) != NULL) { |