]> Pileus Git - ~andy/linux/blobdiff - mm/vmscan.c
memcg: enhance memcg iterator to support predicates
[~andy/linux] / mm / vmscan.c
index 1896e7ca494bf9893cab0ac9360af32105bbcf96..f2e35099508bd495c466d222e6cfb0d542b43ad5 100644 (file)
@@ -2151,21 +2151,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, root)) {
-                               memcg = mem_cgroup_iter(root, memcg, &reclaim);
-                               continue;
-                       }
-
                        lruvec = mem_cgroup_zone_lruvec(zone, memcg);
 
                        shrink_lruvec(lruvec, sc);
@@ -2185,8 +2180,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,