summaryrefslogtreecommitdiff
path: root/sys/vm/vm_glue.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2003-04-28 17:13:53 +0000
committerAlan Cox <alc@FreeBSD.org>2003-04-28 17:13:53 +0000
commit17cd3642fe3f703929761dd1d7ab6b6fdfa42583 (patch)
treea21d70c3ba89e0def1b9ed44d755ec5d8701e6c2 /sys/vm/vm_glue.c
parente519b1a5ee01e82474a989542ebc02b7fcadd45e (diff)
Notes
Diffstat (limited to 'sys/vm/vm_glue.c')
-rw-r--r--sys/vm/vm_glue.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
index e6d204e882e6..765f23c64660 100644
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -361,24 +361,26 @@ retry:
sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) {
PROC_LOCK(p);
-
object = p->p_upages_obj;
- if (object != NULL &&
- swap_pager_isswapped(p->p_upages_obj, devidx)) {
- sx_sunlock(&allproc_lock);
- faultin(p);
- PROC_UNLOCK(p);
+ if (object != NULL) {
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);
+ if (swap_pager_isswapped(object, devidx)) {
+ VM_OBJECT_UNLOCK(object);
+ 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;
+ }
VM_OBJECT_UNLOCK(object);
- goto retry;
}
-
PROC_UNLOCK(p);
}
sx_sunlock(&allproc_lock);