OSDN Git Service

mm/memcg: move generation assignment and comparison together
authorWei Yang <richard.weiyang@gmail.com>
Fri, 29 Apr 2022 06:15:59 +0000 (23:15 -0700)
committerakpm <akpm@linux-foundation.org>
Fri, 29 Apr 2022 06:15:59 +0000 (23:15 -0700)
For each round-trip, we assign generation on first invocation and compare
it on subsequent invocations.

Let's move them together to make it more self-explaining. Also this
reduce a check on prev.

[hannes@cmpxchg.org: better comment to explain reclaim model]
Link: https://lkml.kernel.org/r/20220330234719.18340-4-richard.weiyang@gmail.com
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memcontrol.c

index 1b76d56..1ae0a2a 100644 (file)
@@ -1021,7 +1021,13 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
                mz = root->nodeinfo[reclaim->pgdat->node_id];
                iter = &mz->iter;
 
-               if (prev && reclaim->generation != iter->generation)
+               /*
+                * On start, join the current reclaim iteration cycle.
+                * Exit when a concurrent walker completes it.
+                */
+               if (!prev)
+                       reclaim->generation = iter->generation;
+               else if (reclaim->generation != iter->generation)
                        goto out_unlock;
 
                while (1) {
@@ -1083,8 +1089,6 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
 
                if (!memcg)
                        iter->generation++;
-               else if (!prev)
-                       reclaim->generation = iter->generation;
        }
 
 out_unlock: