summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-04-20 19:25:28 +0000
committeralc <alc@FreeBSD.org>2003-04-20 19:25:28 +0000
commit033a6f0bc724643e7275e0ffad5db4b9deec4c77 (patch)
tree34ad9183686b72f7b8dd9a5d3173f5ef9642c918 /sys/vm
parent4cb4acb5413a4713d2e49344777ecf8fd77108c3 (diff)
downloadFreeBSD-src-033a6f0bc724643e7275e0ffad5db4b9deec4c77.zip
FreeBSD-src-033a6f0bc724643e7275e0ffad5db4b9deec4c77.tar.gz
- Lock the vm_object when performing vm_object_pip_wakeup().
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_fault.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index e16ad8e..d2d7372 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -137,12 +137,16 @@ static void
_unlock_things(struct faultstate *fs, int dealloc)
{
GIANT_REQUIRED;
+ VM_OBJECT_LOCK(fs->object);
vm_object_pip_wakeup(fs->object);
+ VM_OBJECT_UNLOCK(fs->object);
if (fs->object != fs->first_object) {
+ VM_OBJECT_LOCK(fs->first_object);
vm_page_lock_queues();
vm_page_free(fs->first_m);
vm_page_unlock_queues();
vm_object_pip_wakeup(fs->first_object);
+ VM_OBJECT_UNLOCK(fs->first_object);
fs->first_m = NULL;
}
if (dealloc) {
@@ -614,7 +618,9 @@ readrest:
* object with zeros.
*/
if (fs.object != fs.first_object) {
+ VM_OBJECT_LOCK(fs.object);
vm_object_pip_wakeup(fs.object);
+ VM_OBJECT_UNLOCK(fs.object);
fs.object = fs.first_object;
fs.pindex = fs.first_pindex;
@@ -635,7 +641,9 @@ readrest:
break; /* break to PAGE HAS BEEN FOUND */
} else {
if (fs.object != fs.first_object) {
+ VM_OBJECT_LOCK(fs.object);
vm_object_pip_wakeup(fs.object);
+ VM_OBJECT_UNLOCK(fs.object);
}
KASSERT(fs.object != next_object, ("object loop %p", next_object));
fs.object = next_object;
@@ -739,7 +747,9 @@ readrest:
* fs.object != fs.first_object due to above
* conditional
*/
+ VM_OBJECT_LOCK(fs.object);
vm_object_pip_wakeup(fs.object);
+ VM_OBJECT_UNLOCK(fs.object);
/*
* Only use the new page below...
OpenPOWER on IntegriCloud