From d22bc7101cabd6af405b0f0fe8708f623fddbaa1 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 20 Apr 2003 03:41:21 +0000 Subject: - Lock the vm_object when performing vm_object_pip_add(). --- sys/vm/swap_pager.c | 2 ++ sys/vm/vm_fault.c | 4 ++++ sys/vm/vm_object.c | 7 ++++++- sys/vm/vm_pageout.c | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 2adaf6fa2ee6..285c269d644a 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1690,7 +1690,9 @@ swp_pager_force_pagein(struct swblock *swap, int idx) object = swap->swb_object; pindex = swap->swb_index; + VM_OBJECT_LOCK(object); vm_object_pip_add(object, 1); + VM_OBJECT_UNLOCK(object); m = vm_page_grab(object, pindex + idx, VM_ALLOC_NORMAL|VM_ALLOC_RETRY); if (m->valid == VM_PAGE_BITS_ALL) { VM_OBJECT_LOCK(object); diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index a7780c13bb70..e16ad8e7d914 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -278,7 +278,9 @@ RetryFault:; */ vm_object_reference(fs.first_object); fs.vp = vnode_pager_lock(fs.first_object); + VM_OBJECT_LOCK(fs.first_object); vm_object_pip_add(fs.first_object, 1); + VM_OBJECT_UNLOCK(fs.first_object); fs.lookup_still_valid = TRUE; @@ -637,7 +639,9 @@ readrest: } KASSERT(fs.object != next_object, ("object loop %p", next_object)); fs.object = next_object; + VM_OBJECT_LOCK(fs.object); vm_object_pip_add(fs.object, 1); + VM_OBJECT_UNLOCK(fs.object); } } diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 2a8a2cebdde6..1b27b1dadc47 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1208,7 +1208,9 @@ vm_object_split(vm_map_entry_t entry) vm_page_unlock_queues(); } if (orig_object->type == OBJT_SWAP) { + VM_OBJECT_LOCK(orig_object); vm_object_pip_add(orig_object, 1); + VM_OBJECT_UNLOCK(orig_object); /* * copy orig_object pages into new_object * and destroy unneeded pages in @@ -1514,8 +1516,9 @@ vm_object_collapse(vm_object_t object) * Move the pager from backing_object to object. */ if (backing_object->type == OBJT_SWAP) { + VM_OBJECT_LOCK(backing_object); vm_object_pip_add(backing_object, 1); - + VM_OBJECT_UNLOCK(backing_object); /* * scrap the paging_offset junk and do a * discrete copy. This also removes major @@ -1524,7 +1527,9 @@ vm_object_collapse(vm_object_t object) * new swapper is able to optimize the * destroy-source case. */ + VM_OBJECT_LOCK(object); vm_object_pip_add(object, 1); + VM_OBJECT_UNLOCK(object); swap_pager_copy( backing_object, object, diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 8c07be291b61..0ea8390d8818 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -389,7 +389,9 @@ vm_pageout_flush(mc, count, flags) } object = mc[0]->object; vm_page_unlock_queues(); + VM_OBJECT_LOCK(object); vm_object_pip_add(object, count); + VM_OBJECT_UNLOCK(object); vm_pager_put_pages(object, mc, count, (flags | ((object == kernel_object) ? VM_PAGER_PUT_SYNC : 0)), -- cgit v1.3