summaryrefslogtreecommitdiffstats
path: root/sys/vm/swap_pager.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2010-05-08 20:34:01 +0000
committeralc <alc@FreeBSD.org>2010-05-08 20:34:01 +0000
commit40b44f9713de70170857e6291876dfce94b6ef43 (patch)
tree55e1683864edab13ef62b5f9fac6a4928f23f506 /sys/vm/swap_pager.c
parent94ac1169df0fe3609aa671582574d421e89b7ff3 (diff)
downloadFreeBSD-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.c29
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);
}
/*
OpenPOWER on IntegriCloud