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 | |
parent | e519b1a5ee01e82474a989542ebc02b7fcadd45e (diff) | |
download | src-17cd3642fe3f703929761dd1d7ab6b6fdfa42583.tar.gz src-17cd3642fe3f703929761dd1d7ab6b6fdfa42583.zip |
- Lock the vm_object when performing swap_pager_isswapped().
- Assert that the vm_object is locked in swap_pager_isswapped().
Notes
Notes:
svn path=/head/; revision=114166
Diffstat (limited to 'sys')
-rw-r--r-- | sys/vm/swap_pager.c | 1 | ||||
-rw-r--r-- | sys/vm/vm_glue.c | 30 |
2 files changed, 17 insertions, 14 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index d68a46501329..b21d6acccec2 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1648,6 +1648,7 @@ int swap_pager_isswapped(vm_object_t object, int devidx) { int bcount; int i; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); for (bcount = 0; bcount < object->un_pager.swp.swp_bcount; bcount++) { struct swblock *swap; 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); |