diff options
author | alc <alc@FreeBSD.org> | 2002-07-13 19:24:04 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-13 19:24:04 +0000 |
commit | ee4b41f6c5c298c67092747163c8e9c41171419c (patch) | |
tree | 3d08a4951c40ce294b29701865be774c7a89058c /sys/vm/vm_glue.c | |
parent | 1ca394c8d3377f8ca9b2a1516ac08c7c40e0bf6c (diff) | |
download | FreeBSD-src-ee4b41f6c5c298c67092747163c8e9c41171419c.zip FreeBSD-src-ee4b41f6c5c298c67092747163c8e9c41171419c.tar.gz |
o Lock some page queue accesses, in particular, those by vm_page_unwire().
Diffstat (limited to 'sys/vm/vm_glue.c')
-rw-r--r-- | sys/vm/vm_glue.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 505d1e3..870bced 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -266,11 +266,13 @@ vm_proc_dispose(struct proc *p) upobj = p->p_upages_obj; if (upobj->resident_page_count != UAREA_PAGES) panic("vm_proc_dispose: incorrect number of pages in upobj"); + vm_page_lock_queues(); while ((m = TAILQ_FIRST(&upobj->memq)) != NULL) { vm_page_busy(m); vm_page_unwire(m, 0); vm_page_free(m); } + vm_page_unlock_queues(); up = (vm_offset_t)p->p_uarea; pmap_qremove(up, UAREA_PAGES); kmem_free(kernel_map, up, UAREA_PAGES * PAGE_SIZE); @@ -291,10 +293,12 @@ vm_proc_swapout(struct proc *p) upobj = p->p_upages_obj; if (upobj->resident_page_count != UAREA_PAGES) panic("vm_proc_dispose: incorrect number of pages in upobj"); + vm_page_lock_queues(); TAILQ_FOREACH(m, &upobj->memq, listq) { vm_page_dirty(m); vm_page_unwire(m, 0); } + vm_page_unlock_queues(); up = (vm_offset_t)p->p_uarea; pmap_qremove(up, UAREA_PAGES); } |