diff options
author | alc <alc@FreeBSD.org> | 2003-04-20 03:41:21 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-04-20 03:41:21 +0000 |
commit | 5990076d783520423f3e4ee52281b37b3482e6c2 (patch) | |
tree | fc30655e6327bedf67b01a9b2800edf4b26bfd85 /sys/vm | |
parent | 826ccd96daa4f3f2def23325ff14eab70f645ee6 (diff) | |
download | FreeBSD-src-5990076d783520423f3e4ee52281b37b3482e6c2.zip FreeBSD-src-5990076d783520423f3e4ee52281b37b3482e6c2.tar.gz |
- Lock the vm_object when performing vm_object_pip_add().
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/swap_pager.c | 2 | ||||
-rw-r--r-- | sys/vm/vm_fault.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_object.c | 7 | ||||
-rw-r--r-- | sys/vm/vm_pageout.c | 2 |
4 files changed, 14 insertions, 1 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 2adaf6f..285c269 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 a7780c1..e16ad8e 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 2a8a2ce..1b27b1d 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 8c07be2..0ea8390 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)), |