summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_pageout.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/vm_pageout.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/vm_pageout.c')
-rw-r--r--sys/vm/vm_pageout.c17
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)
OpenPOWER on IntegriCloud