diff options
author | alc <alc@FreeBSD.org> | 2003-04-25 16:30:02 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-04-25 16:30:02 +0000 |
commit | 33d0b8466387b00cbd5de7422a9f2b6b39a2790d (patch) | |
tree | eebff4e17ec53d8084ce05c3d9de34663db973ad /sys/vm | |
parent | 0162ac550edaf85d0029a69bc6b8328b3cfba95a (diff) | |
download | FreeBSD-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.c | 8 |
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; } |