summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-04-25 16:30:02 +0000
committeralc <alc@FreeBSD.org>2003-04-25 16:30:02 +0000
commit33d0b8466387b00cbd5de7422a9f2b6b39a2790d (patch)
treeeebff4e17ec53d8084ce05c3d9de34663db973ad /sys/vm
parent0162ac550edaf85d0029a69bc6b8328b3cfba95a (diff)
downloadFreeBSD-src-33d0b8466387b00cbd5de7422a9f2b6b39a2790d.zip
FreeBSD-src-33d0b8466387b00cbd5de7422a9f2b6b39a2790d.tar.gz
- Lock the vm_object when iterating over its list of resident pages.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_glue.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
index e211e5d..817c8cb 100644
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -265,6 +265,7 @@ vm_proc_dispose(struct proc *p)
vm_page_t m;
upobj = p->p_upages_obj;
+ VM_OBJECT_LOCK(upobj);
if (upobj->resident_page_count != UAREA_PAGES)
panic("vm_proc_dispose: incorrect number of pages in upobj");
vm_page_lock_queues();
@@ -274,6 +275,7 @@ vm_proc_dispose(struct proc *p)
vm_page_free(m);
}
vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(upobj);
up = (vm_offset_t)p->p_uarea;
pmap_qremove(up, UAREA_PAGES);
kmem_free(kernel_map, up, UAREA_PAGES * PAGE_SIZE);
@@ -292,6 +294,7 @@ vm_proc_swapout(struct proc *p)
vm_page_t m;
upobj = p->p_upages_obj;
+ VM_OBJECT_LOCK(upobj);
if (upobj->resident_page_count != UAREA_PAGES)
panic("vm_proc_dispose: incorrect number of pages in upobj");
vm_page_lock_queues();
@@ -300,6 +303,7 @@ vm_proc_swapout(struct proc *p)
vm_page_unwire(m, 0);
}
vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(upobj);
up = (vm_offset_t)p->p_uarea;
pmap_qremove(up, UAREA_PAGES);
}
@@ -327,6 +331,7 @@ vm_proc_swapin(struct proc *p)
}
ma[i] = m;
}
+ VM_OBJECT_LOCK(upobj);
if (upobj->resident_page_count != UAREA_PAGES)
panic("vm_proc_swapin: lost pages from upobj");
vm_page_lock_queues();
@@ -336,6 +341,7 @@ vm_proc_swapin(struct proc *p)
vm_page_wakeup(m);
}
vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(upobj);
up = (vm_offset_t)p->p_uarea;
pmap_qenter(up, ma, UAREA_PAGES);
}
@@ -362,12 +368,14 @@ retry:
sx_sunlock(&allproc_lock);
faultin(p);
PROC_UNLOCK(p);
+ VM_OBJECT_LOCK(object);
vm_page_lock_queues();
TAILQ_FOREACH(m, &object->memq, listq)
vm_page_dirty(m);
vm_page_unlock_queues();
swap_pager_freespace(object, 0,
object->un_pager.swp.swp_bcount);
+ VM_OBJECT_UNLOCK(object);
goto retry;
}
OpenPOWER on IntegriCloud