diff options
author | alc <alc@FreeBSD.org> | 2010-05-08 20:34:01 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-05-08 20:34:01 +0000 |
commit | 40b44f9713de70170857e6291876dfce94b6ef43 (patch) | |
tree | 55e1683864edab13ef62b5f9fac6a4928f23f506 /sys/vm/vm_pageout.c | |
parent | 94ac1169df0fe3609aa671582574d421e89b7ff3 (diff) | |
download | FreeBSD-src-40b44f9713de70170857e6291876dfce94b6ef43.zip FreeBSD-src-40b44f9713de70170857e6291876dfce94b6ef43.tar.gz |
Push down the page queues into vm_page_cache(), vm_page_try_to_cache(), and
vm_page_try_to_free(). Consequently, push down the page queues lock into
pmap_enter_quick(), pmap_page_wired_mapped(), pmap_remove_all(), and
pmap_remove_write().
Push down the page queues lock into Xen's pmap_page_is_mapped(). (I
overlooked the Xen pmap in r207702.)
Switch to a per-processor counter for the total number of pages cached.
Diffstat (limited to 'sys/vm/vm_pageout.c')
-rw-r--r-- | sys/vm/vm_pageout.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 49b6ac9..fde456f 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -490,11 +490,7 @@ vm_pageout_flush(vm_page_t *mc, int count, int flags) ("vm_pageout_flush: partially invalid page %p index %d/%d", mc[i], i, count)); vm_page_io_start(mc[i]); - vm_page_lock(mc[i]); - vm_page_lock_queues(); pmap_remove_write(mc[i]); - vm_page_unlock(mc[i]); - vm_page_unlock_queues(); } vm_object_pip_add(object, count); @@ -503,8 +499,6 @@ vm_pageout_flush(vm_page_t *mc, int count, int flags) for (i = 0; i < count; i++) { vm_page_t mt = mc[i]; - vm_page_lock(mt); - vm_page_lock_queues(); KASSERT(pageout_status[i] == VM_PAGER_PEND || (mt->flags & PG_WRITEABLE) == 0, ("vm_pageout_flush: page %p is not write protected", mt)); @@ -528,7 +522,9 @@ vm_pageout_flush(vm_page_t *mc, int count, int flags) * page so it doesn't clog the inactive list. (We * will try paging out it again later). */ + vm_page_lock(mt); vm_page_activate(mt); + vm_page_unlock(mt); break; case VM_PAGER_AGAIN: break; @@ -543,13 +539,14 @@ vm_pageout_flush(vm_page_t *mc, int count, int flags) if (pageout_status[i] != VM_PAGER_PEND) { vm_object_pip_wakeup(object); vm_page_io_finish(mt); - if (vm_page_count_severe()) + if (vm_page_count_severe()) { + vm_page_lock(mt); vm_page_try_to_cache(mt); + vm_page_unlock(mt); + } } - vm_page_unlock_queues(); - vm_page_unlock(mt); } - return numpagedout; + return (numpagedout); } #if !defined(NO_SWAPPING) |