diff options
author | peter <peter@FreeBSD.org> | 2002-07-08 01:11:10 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2002-07-08 01:11:10 +0000 |
commit | 61d745fe2cd0fa5f11beb44daebdedcfffd1b33d (patch) | |
tree | 7da9a951637fde03184049d4133829a25523e992 /sys | |
parent | 40ca2ecbc9f6ce1f972e08a815b371f861c6f3a4 (diff) | |
download | FreeBSD-src-61d745fe2cd0fa5f11beb44daebdedcfffd1b33d.zip FreeBSD-src-61d745fe2cd0fa5f11beb44daebdedcfffd1b33d.tar.gz |
Avoid vm_page_lookup() [grabs a spinlock] and just process the upage
object memq instead.
Suggested by: alc
Diffstat (limited to 'sys')
-rw-r--r-- | sys/vm/vm_glue.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 1351c14..ceae013 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -262,21 +262,18 @@ vm_proc_dispose(struct proc *p) vm_object_t upobj; vm_offset_t up; vm_page_t m; - int i; upobj = p->p_upages_obj; - up = (vm_offset_t)p->p_uarea; - for (i = 0; i < UAREA_PAGES; i++) { - m = vm_page_lookup(upobj, i); - if (m == NULL) - panic("vm_proc_dispose: upage already missing?"); + if (upobj->resident_page_count != UAREA_PAGES) + panic("vm_proc_dispose: incorrect number of pages in upobj"); + while ((m = TAILQ_FIRST(&upobj->memq)) != NULL) { vm_page_busy(m); vm_page_unwire(m, 0); vm_page_free(m); } + up = (vm_offset_t)p->p_uarea; pmap_qremove(up, UAREA_PAGES); kmem_free(kernel_map, up, UAREA_PAGES * PAGE_SIZE); - p->p_upages_obj = NULL; vm_object_deallocate(upobj); } @@ -290,17 +287,15 @@ vm_proc_swapout(struct proc *p) vm_object_t upobj; vm_offset_t up; vm_page_t m; - int i; upobj = p->p_upages_obj; - up = (vm_offset_t)p->p_uarea; - for (i = 0; i < UAREA_PAGES; i++) { - m = vm_page_lookup(upobj, i); - if (m == NULL) - panic("vm_proc_swapout: upage already missing?"); + if (upobj->resident_page_count != UAREA_PAGES) + panic("vm_proc_dispose: incorrect number of pages in upobj"); + TAILQ_FOREACH(m, &upobj->memq, listq) { vm_page_dirty(m); vm_page_unwire(m, 0); } + up = (vm_offset_t)p->p_uarea; pmap_qremove(up, UAREA_PAGES); } @@ -318,7 +313,6 @@ vm_proc_swapin(struct proc *p) int i; upobj = p->p_upages_obj; - up = (vm_offset_t)p->p_uarea; for (i = 0; i < UAREA_PAGES; i++) { m = vm_page_grab(upobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); if (m->valid != VM_PAGE_BITS_ALL) { @@ -333,6 +327,7 @@ vm_proc_swapin(struct proc *p) vm_page_wakeup(m); vm_page_flag_set(m, PG_MAPPED | PG_WRITEABLE); } + up = (vm_offset_t)p->p_uarea; pmap_qenter(up, ma, UAREA_PAGES); } #endif |