memcg, vmscan: do not attempt soft limit reclaim if it would not scan anything
[platform/adaptation/renesas_rcar/renesas_kernel.git] / mm / vmscan.c
index cf46438..04dca89 100644 (file)
@@ -142,7 +142,9 @@ static bool global_reclaim(struct scan_control *sc)
 
 static bool mem_cgroup_should_soft_reclaim(struct scan_control *sc)
 {
-       return !mem_cgroup_disabled() && global_reclaim(sc);
+       struct mem_cgroup *root = sc->target_mem_cgroup;
+       return !mem_cgroup_disabled() &&
+               mem_cgroup_soft_reclaim_eligible(root, root) != SKIP_TREE;
 }
 #else
 static bool global_reclaim(struct scan_control *sc)
@@ -2151,21 +2153,16 @@ __shrink_zone(struct zone *zone, struct scan_control *sc, bool soft_reclaim)
                        .zone = zone,
                        .priority = sc->priority,
                };
-               struct mem_cgroup *memcg;
+               struct mem_cgroup *memcg = NULL;
+               mem_cgroup_iter_filter filter = (soft_reclaim) ?
+                       mem_cgroup_soft_reclaim_eligible : NULL;
 
                nr_reclaimed = sc->nr_reclaimed;
                nr_scanned = sc->nr_scanned;
 
-               memcg = mem_cgroup_iter(root, NULL, &reclaim);
-               do {
+               while ((memcg = mem_cgroup_iter_cond(root, memcg, &reclaim, filter))) {
                        struct lruvec *lruvec;
 
-                       if (soft_reclaim &&
-                           !mem_cgroup_soft_reclaim_eligible(memcg)) {
-                               memcg = mem_cgroup_iter(root, memcg, &reclaim);
-                               continue;
-                       }
-
                        lruvec = mem_cgroup_zone_lruvec(zone, memcg);
 
                        shrink_lruvec(lruvec, sc);
@@ -2185,8 +2182,7 @@ __shrink_zone(struct zone *zone, struct scan_control *sc, bool soft_reclaim)
                                mem_cgroup_iter_break(root, memcg);
                                break;
                        }
-                       memcg = mem_cgroup_iter(root, memcg, &reclaim);
-               } while (memcg);
+               }
 
                vmpressure(sc->gfp_mask, sc->target_mem_cgroup,
                           sc->nr_scanned - nr_scanned,