summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-04-20 03:41:21 +0000
committeralc <alc@FreeBSD.org>2003-04-20 03:41:21 +0000
commit5990076d783520423f3e4ee52281b37b3482e6c2 (patch)
treefc30655e6327bedf67b01a9b2800edf4b26bfd85 /sys/vm
parent826ccd96daa4f3f2def23325ff14eab70f645ee6 (diff)
downloadFreeBSD-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.c2
-rw-r--r--sys/vm/vm_fault.c4
-rw-r--r--sys/vm/vm_object.c7
-rw-r--r--sys/vm/vm_pageout.c2
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)),
OpenPOWER on IntegriCloud