ZVC/zone_reclaim: Leave 1% of unmapped pagecache pages for file I/O

Christoph Lameter
2006-06-30T02:51:38Z

It turns out that it is advantageous to leave a small portion of
unmapped file backed pages if a zone is overallocated.

This allows recently used file I/O buffers to stay on the node and
reduces the times that zone reclaim is invoked if file I/O occurs
when we run out of memory in a zone.

Signed-off-by: Christoph Lameter <clameter@sgi.com>

Index: linux-2.6.17-mm4/mm/vmscan.c
===================================================================
--- linux-2.6.17-mm4.orig/mm/vmscan.c 2006-06-29 13:34:13.128150411 -0700
+++ linux-2.6.17-mm4/mm/vmscan.c 2006-06-29 19:44:54.717779791 -0700
@@ -1598,18 +1598,22 @@ int zone_reclaim(struct zone *zone, gfp_
int node_id;

/*
- * Do not reclaim if there are not enough reclaimable pages in this
- * zone that would satify this allocations.
+ * Zone reclaim reclaims unmapped file backed pages.
*
- * All unmapped pagecache pages are reclaimable.
+ * A small portion of unmapped file backed pages is needed for
+ * file I/O otherwise pages read by file I/O will be immediately
+ * thrown out if the zone is overallocated. So we do not reclaim
+ * if less than 1% of the zone is used by unmapped file backed pages.
*
- * Both counters may be temporarily off a bit so we use
- * SWAP_CLUSTER_MAX as the boundary. It may also be good to
- * leave a few frequently used unmapped pagecache pages around.
+ * The division by 128 approximates this and is here because a division
+ * would be too expensive in this hot code path.
+ *
+ * Is it be useful to have a way to set the limit via /proc?
*/
if (zone_page_state(zone, NR_FILE_PAGES) -
- zone_page_state(zone, NR_FILE_MAPPED) < SWAP_CLUSTER_MAX)
- return 0;
+ zone_page_state(zone, NR_FILE_MAPPED) <
+ zone->present_pages / 128)
+ return 0;

/*
* Avoid concurrent zone reclaims, do not reclaim in a zone that does