svn commit: r304917 - user/alc/PQ_LAUNDRY/sys/vm
Alan Cox
alc at FreeBSD.org
Sat Aug 27 18:51:05 UTC 2016
Author: alc
Date: Sat Aug 27 18:51:04 2016
New Revision: 304917
URL: https://svnweb.freebsd.org/changeset/base/304917
Log:
Changes to vm_pageout_laundry_worker():
Reset "last_launder" on each cycle of a shortfall laundering run, just
like we do for background laundering.
Update a comment about background laundering that has become stale.
Apply a couple style changes for consistency with the rest of the
function.
Add a comment explaining why min() is applied to the return value from
vm_pageout_launder().
Sponsored by: EMC / Isilon Storage Division
Modified:
user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c
Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c
==============================================================================
--- user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c Sat Aug 27 18:12:42 2016 (r304916)
+++ user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c Sat Aug 27 18:51:04 2016 (r304917)
@@ -1158,8 +1158,8 @@ vm_pageout_laundry_worker(void *arg)
*/
if (vm_laundry_target() <= 0 || cycle == 0) {
prev_shortfall = target = 0;
- last_launder = wakeups;
} else {
+ last_launder = wakeups;
launder = target / cycle--;
goto dolaundry;
}
@@ -1171,7 +1171,8 @@ vm_pageout_laundry_worker(void *arg)
*
* 1. The ratio of dirty to clean inactive pages exceeds the
* background laundering threshold and the pagedaemon has
- * recently been woken up, or
+ * been woken up to reclaim pages since our last
+ * laundering, or
* 2. we haven't yet reached the target of the current
* background laundering run.
*
@@ -1188,6 +1189,7 @@ vm_pageout_laundry_worker(void *arg)
last_launder = wakeups;
target = starting_target = vm_background_launder_target;
}
+
/*
* We have a non-zero background laundering target. If we've
* laundered up to our maximum without observing a page daemon
@@ -1197,14 +1199,13 @@ vm_pageout_laundry_worker(void *arg)
* proceed at the background laundering rate.
*/
if (target > 0) {
- if (last_launder != wakeups) {
+ if (wakeups != last_launder) {
last_launder = wakeups;
starting_target = target;
} else if (starting_target - target >=
vm_background_launder_max * PAGE_SIZE / 1024) {
target = 0;
}
-
launder = vm_background_launder_rate * PAGE_SIZE / 1024;
launder /= VM_LAUNDER_INTERVAL;
if (launder < target)
@@ -1212,10 +1213,15 @@ vm_pageout_laundry_worker(void *arg)
}
dolaundry:
- if (launder > 0)
+ if (launder > 0) {
+ /*
+ * Because of I/O clustering, the number of laundered
+ * pages could exceed "target" by the maximum size of
+ * a cluster minus one.
+ */
target -= min(vm_pageout_launder(domain, launder,
prev_shortfall > 0), target);
-
+ }
tsleep(&vm_cnt.v_laundry_count, PVM, "laundr",
hz / VM_LAUNDER_INTERVAL);
}
More information about the svn-src-user
mailing list