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
This commit is contained in:
Alan Cox 2014-05-06 03:42:04 +00:00
parent e36ffbdd29
commit 60196cda04
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=265418

View File

@ -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.