aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/memcontrol.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 2b552224f5cf..661a2c679f64 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1100,12 +1100,9 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
1100 if (prev && !reclaim) 1100 if (prev && !reclaim)
1101 id = css_id(&prev->css); 1101 id = css_id(&prev->css);
1102 1102
1103 if (prev && prev != root)
1104 css_put(&prev->css);
1105
1106 if (!root->use_hierarchy && root != root_mem_cgroup) { 1103 if (!root->use_hierarchy && root != root_mem_cgroup) {
1107 if (prev) 1104 if (prev)
1108 return NULL; 1105 goto out_css_put;
1109 return root; 1106 return root;
1110 } 1107 }
1111 1108
@@ -1121,7 +1118,7 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
1121 mz = mem_cgroup_zoneinfo(root, nid, zid); 1118 mz = mem_cgroup_zoneinfo(root, nid, zid);
1122 iter = &mz->reclaim_iter[reclaim->priority]; 1119 iter = &mz->reclaim_iter[reclaim->priority];
1123 if (prev && reclaim->generation != iter->generation) 1120 if (prev && reclaim->generation != iter->generation)
1124 return NULL; 1121 goto out_css_put;
1125 id = iter->position; 1122 id = iter->position;
1126 } 1123 }
1127 1124
@@ -1143,8 +1140,12 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
1143 } 1140 }
1144 1141
1145 if (prev && !css) 1142 if (prev && !css)
1146 return NULL; 1143 goto out_css_put;
1147 } 1144 }
1145out_css_put:
1146 if (prev && prev != root)
1147 css_put(&prev->css);
1148
1148 return memcg; 1149 return memcg;
1149} 1150}
1150 1151