diff options
-rw-r--r-- | mm/memcontrol.c | 13 |
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 | } |
1145 | out_css_put: | ||
1146 | if (prev && prev != root) | ||
1147 | css_put(&prev->css); | ||
1148 | |||
1148 | return memcg; | 1149 | return memcg; |
1149 | } | 1150 | } |
1150 | 1151 | ||