Path: csiph.com!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod From: Mel Gorman Newsgroups: linux.kernel Subject: [PATCH 11/27] mm: vmscan: Do not reclaim from kswapd if there is any eligible zone Date: Fri, 15 Apr 2016 11:20:04 +0200 Message-ID: References: X-Mailer: git-send-email 2.6.4 Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 63 Organization: linux.* mail to news gateway X-Original-Cc: Rik van Riel , Vlastimil Babka , Johannes Weiner , Jesper Dangaard Brouer , LKML , Mel Gorman X-Original-Date: Fri, 15 Apr 2016 10:13:17 +0100 X-Original-Message-ID: <1460711613-2761-12-git-send-email-mgorman@techsingularity.net> X-Original-References: <1460711613-2761-1-git-send-email-mgorman@techsingularity.net> X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1379608 kswapd scans from highest to lowest for a zone that requires balancing. This was necessary when reclaim was per-zone to fairly age pages on lower zones. Now that we are reclaiming on a per-node basis, any eligible zone can be used and pages will still be aged fairly. This patch avoids reclaiming excessively unless buffer_heads are over the limit and it's necessary to reclaim from a higher zone than requested by the waker of kswapd to relieve low memory pressure. Signed-off-by: Mel Gorman --- mm/vmscan.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 5701f570e4f6..5ee55a0434d9 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3136,24 +3136,30 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) sc.nr_reclaimed = 0; - /* Scan from the highest requested zone to dma */ + /* + * If the number of buffer_heads in the machine exceeds the + * maximum allowed level and this node has a highmem zone, + * force kswapd to reclaim from it to relieve lowmem pressure. + */ + if (buffer_heads_over_limit) { + for (i = MAX_NR_ZONES - 1; i >= 0; i++) { + zone = pgdat->node_zones + i; + if (!populated_zone(zone)) + continue; + + if (is_highmem_idx(i)) + classzone_idx = i; + break; + } + } + + /* Only reclaim if there are no eligible zones */ for (i = classzone_idx; i >= 0; i--) { zone = pgdat->node_zones + i; if (!populated_zone(zone)) continue; - /* - * If the number of buffer_heads in the machine - * exceeds the maximum allowed level and this node - * has a highmem zone, force kswapd to reclaim from - * it to relieve lowmem pressure. - */ - if (buffer_heads_over_limit && is_highmem_idx(i)) { - classzone_idx = i; - break; - } - - if (!zone_balanced(zone, order, 0)) { + if (!zone_balanced(zone, sc.order, classzone_idx)) { classzone_idx = i; break; } -- 2.6.4