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.

[hillf...@alibaba-inc.com: Force kswapd reclaim no more than needed]
Link: 
http://lkml.kernel.org/r/1466518566-30034-12-git-send-email-mgor...@techsingularity.net
Signed-off-by: Mel Gorman <mgor...@techsingularity.net>
Signed-off-by: Hillf Danton <hillf...@alibaba-inc.com>
Acked-by: Vlastimil Babka <vba...@suse.cz>
---
 mm/vmscan.c | 56 ++++++++++++++++++++++++--------------------------------
 1 file changed, 24 insertions(+), 32 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 911142d25de2..2f898ba2ee2e 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -3141,31 +3141,36 @@ 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 */
-               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 the number of buffer_heads in the machine exceeds the
+                * maximum allowed level then reclaim from all zones. This is
+                * not specific to highmem as highmem may not exist but it is
+                * it is expected that buffer_heads are stripped in writeback.
+                */
+               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 (!zone_balanced(zone, order, 0)) {
                                classzone_idx = i;
                                break;
                        }
                }
 
-               if (i < 0)
-                       goto out;
+               /*
+                * Only reclaim if there are no eligible zones. Check from
+                * high to low zone to avoid prematurely clearing pgdat
+                * congested state.
+                */
+               for (i = classzone_idx; i >= 0; i--) {
+                       zone = pgdat->node_zones + i;
+                       if (!populated_zone(zone))
+                               continue;
+
+                       if (zone_balanced(zone, sc.order, classzone_idx))
+                               goto out;
+               }
 
                /*
                 * Do some background aging of the anon list, to give
@@ -3211,19 +3216,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, 
int classzone_idx)
                        break;
 
                /*
-                * Stop reclaiming if any eligible zone is balanced and clear
-                * node writeback or congested.
-                */
-               for (i = 0; i <= classzone_idx; i++) {
-                       zone = pgdat->node_zones + i;
-                       if (!populated_zone(zone))
-                               continue;
-
-                       if (zone_balanced(zone, sc.order, classzone_idx))
-                               goto out;
-               }
-
-               /*
                 * Raise priority if scanning rate is too low or there was no
                 * progress in reclaiming pages
                 */
-- 
2.6.4

Reply via email to