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/swap_pager.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/swap_pager.c')
-rw-r--r-- | sys/vm/swap_pager.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 2f97ee8..5e0986f 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -382,8 +382,10 @@ static void swp_pager_free_nrpage(vm_page_t m) { + vm_page_lock(m); if (m->wire_count == 0) vm_page_free(m); + vm_page_unlock(m); } /* @@ -1137,17 +1139,10 @@ swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int reqpage) if (0 < i || j < count) { int k; - - for (k = 0; k < i; ++k) { - vm_page_lock(m[k]); + for (k = 0; k < i; ++k) swp_pager_free_nrpage(m[k]); - vm_page_unlock(m[k]); - } - for (k = j; k < count; ++k) { - vm_page_lock(m[k]); + for (k = j; k < count; ++k) swp_pager_free_nrpage(m[k]); - vm_page_unlock(m[k]); - } } /* @@ -1514,8 +1509,6 @@ swp_pager_async_iodone(struct buf *bp) for (i = 0; i < bp->b_npages; ++i) { vm_page_t m = bp->b_pages[i]; - vm_page_lock(m); - vm_page_lock_queues(); m->oflags &= ~VPO_SWAPINPROG; if (bp->b_ioflags & BIO_ERROR) { @@ -1558,7 +1551,9 @@ swp_pager_async_iodone(struct buf *bp) * then finish the I/O. */ vm_page_dirty(m); + vm_page_lock(m); vm_page_activate(m); + vm_page_unlock(m); vm_page_io_finish(m); } } else if (bp->b_iocmd == BIO_READ) { @@ -1593,11 +1588,12 @@ swp_pager_async_iodone(struct buf *bp) * left busy. */ if (i != bp->b_pager.pg_reqpage) { + vm_page_lock(m); vm_page_deactivate(m); + vm_page_unlock(m); vm_page_wakeup(m); - } else { + } else vm_page_flash(m); - } } else { /* * For write success, clear the dirty @@ -1609,11 +1605,12 @@ swp_pager_async_iodone(struct buf *bp) " protected", m)); vm_page_undirty(m); vm_page_io_finish(m); - if (vm_page_count_severe()) + if (vm_page_count_severe()) { + vm_page_lock(m); vm_page_try_to_cache(m); + vm_page_unlock(m); + } } - vm_page_unlock_queues(); - vm_page_unlock(m); } /* |