summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2014-05-06 03:42:04 +0000
committeralc <alc@FreeBSD.org>2014-05-06 03:42:04 +0000
commitc77af15259222803cfb26e5a699a702be88309ee (patch)
tree862098c525d15d24cc8d81790ea69e9d08986c5f
parentb00ce9da285cbbc1e67d23b8ea385851b90e382e (diff)
downloadFreeBSD-src-c77af15259222803cfb26e5a699a702be88309ee.zip
FreeBSD-src-c77af15259222803cfb26e5a699a702be88309ee.tar.gz
Prior to r254304, a separate function, vm_pageout_page_stats(), was used to
periodically update the reference status of the active pages. This function was called, instead of vm_pageout_scan(), when memory was not scarce. The objective was to provide up to date reference status for active pages in case memory did become scarce and active pages needed to be deactivated. The active page queue scan performed by vm_pageout_page_stats() was virtually identical to that performed by vm_pageout_scan(), and so r254304 eliminated vm_pageout_page_stats(). Instead, vm_pageout_scan() is called with the parameter "pass" set to zero. The intention was that when pass is zero, vm_pageout_scan() would only scan the active queue. However, the variable page_shortage can still be greater than zero when memory is not scarce and vm_pageout_scan() is called with pass equal to zero. Consequently, the inactive queue may be scanned and dirty pages laundered even though that was not intended by r254304. This revision fixes that. Reported by: avg MFC after: 1 week Sponsored by: EMC / Isilon Storage Division
-rw-r--r--sys/vm/vm_pageout.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index 7f80115..65743d7 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -942,13 +942,15 @@ vm_pageout_scan(struct vm_domain *vmd, int pass)
*/
addl_page_shortage = 0;
- deficit = atomic_readandclear_int(&vm_pageout_deficit);
-
/*
* Calculate the number of pages we want to either free or move
* to the cache.
*/
- page_shortage = vm_paging_target() + deficit;
+ if (pass > 0) {
+ deficit = atomic_readandclear_int(&vm_pageout_deficit);
+ page_shortage = vm_paging_target() + deficit;
+ } else
+ page_shortage = deficit = 0;
/*
* maxlaunder limits the number of dirty pages we flush per scan.
OpenPOWER on IntegriCloud