The VM currently assumes that an inactive, mapped and referenced file
page is in use and promotes it to the active list.
However, every mapped file page starts out like this and thus a problem
arises when workloads create a stream of such pages that are used only
for a short time. By flooding the active list with those pages, the VM
quickly gets into trouble finding eligible reclaim canditates. The
result is long allocation latencies and eviction of the wrong pages.
This patch reuses the PG_referenced page flag (used for unmapped file
pages) to implement a usage detection that scales with the speed of
LRU list cycling (i.e. memory pressure).
If the scanner encounters those pages, the flag is set and the page
cycled again on the inactive list. Only if it returns with another
page table reference it is activated. Otherwise it is reclaimed as
'not recently used cache'.
This effectively changes the minimum lifetime of a used-once mapped
file page from a full memory cycle to an inactive list cycle, which
allows it to occur in linear streams without affecting the stable
working set of the system.
Signed-off-by: Johannes Weiner<hannes@xxxxxxxxxxx>