From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752462AbcFUOSS (ORCPT ); Tue, 21 Jun 2016 10:18:18 -0400 Received: from outbound-smtp07.blacknight.com ([46.22.139.12]:45092 "EHLO outbound-smtp07.blacknight.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750931AbcFUOSP (ORCPT ); Tue, 21 Jun 2016 10:18:15 -0400 From: Mel Gorman To: Andrew Morton , Linux-MM Cc: Rik van Riel , Vlastimil Babka , Johannes Weiner , LKML , Mel Gorman Subject: [PATCH 11/27] mm: vmscan: Do not reclaim from kswapd if there is any eligible zone Date: Tue, 21 Jun 2016 15:15:50 +0100 Message-Id: <1466518566-30034-12-git-send-email-mgorman@techsingularity.net> X-Mailer: git-send-email 2.6.4 In-Reply-To: <1466518566-30034-1-git-send-email-mgorman@techsingularity.net> References: <1466518566-30034-1-git-send-email-mgorman@techsingularity.net> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Acked-by: Vlastimil Babka --- mm/vmscan.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 8347406c75fa..d42a86e603e8 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3132,24 +3132,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