diff options
| author | Alan Cox <alc@FreeBSD.org> | 2003-04-28 17:13:53 +0000 |
|---|---|---|
| committer | Alan Cox <alc@FreeBSD.org> | 2003-04-28 17:13:53 +0000 |
| commit | 17cd3642fe3f703929761dd1d7ab6b6fdfa42583 (patch) | |
| tree | a21d70c3ba89e0def1b9ed44d755ec5d8701e6c2 /sys/vm/vm_glue.c | |
| parent | e519b1a5ee01e82474a989542ebc02b7fcadd45e (diff) | |
Notes
Diffstat (limited to 'sys/vm/vm_glue.c')
| -rw-r--r-- | sys/vm/vm_glue.c | 30 |
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); |
