memcg: keep prev's css alive for the whole mem_cgroup_iter
[platform/adaptation/renesas_rcar/renesas_kernel.git] / mm / memcontrol.c
index 2b55222..661a2c6 100644 (file)
@@ -1100,12 +1100,9 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
        if (prev && !reclaim)
                id = css_id(&prev->css);
 
-       if (prev && prev != root)
-               css_put(&prev->css);
-
        if (!root->use_hierarchy && root != root_mem_cgroup) {
                if (prev)
-                       return NULL;
+                       goto out_css_put;
                return root;
        }
 
@@ -1121,7 +1118,7 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
                        mz = mem_cgroup_zoneinfo(root, nid, zid);
                        iter = &mz->reclaim_iter[reclaim->priority];
                        if (prev && reclaim->generation != iter->generation)
-                               return NULL;
+                               goto out_css_put;
                        id = iter->position;
                }
 
@@ -1143,8 +1140,12 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
                }
 
                if (prev && !css)
-                       return NULL;
+                       goto out_css_put;
        }
+out_css_put:
+       if (prev && prev != root)
+               css_put(&prev->css);
+
        return memcg;
 }