summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_glue.c
diff options
context:
space:
mode:
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 e6d204e..765f23c 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);
OpenPOWER on IntegriCloud