@@ -1130,26 +1130,45 @@ void mem_cgroup_iter_break(struct mem_cgroup *root,
1130
1130
css_put (& prev -> css );
1131
1131
}
1132
1132
1133
- static void invalidate_reclaim_iterators (struct mem_cgroup * dead_memcg )
1133
+ static void __invalidate_reclaim_iterators (struct mem_cgroup * from ,
1134
+ struct mem_cgroup * dead_memcg )
1134
1135
{
1135
- struct mem_cgroup * memcg = dead_memcg ;
1136
1136
struct mem_cgroup_reclaim_iter * iter ;
1137
1137
struct mem_cgroup_per_node * mz ;
1138
1138
int nid ;
1139
1139
int i ;
1140
1140
1141
- for (; memcg ; memcg = parent_mem_cgroup (memcg )) {
1142
- for_each_node (nid ) {
1143
- mz = mem_cgroup_nodeinfo (memcg , nid );
1144
- for (i = 0 ; i <= DEF_PRIORITY ; i ++ ) {
1145
- iter = & mz -> iter [i ];
1146
- cmpxchg (& iter -> position ,
1147
- dead_memcg , NULL );
1148
- }
1141
+ for_each_node (nid ) {
1142
+ mz = mem_cgroup_nodeinfo (from , nid );
1143
+ for (i = 0 ; i <= DEF_PRIORITY ; i ++ ) {
1144
+ iter = & mz -> iter [i ];
1145
+ cmpxchg (& iter -> position ,
1146
+ dead_memcg , NULL );
1149
1147
}
1150
1148
}
1151
1149
}
1152
1150
1151
+ static void invalidate_reclaim_iterators (struct mem_cgroup * dead_memcg )
1152
+ {
1153
+ struct mem_cgroup * memcg = dead_memcg ;
1154
+ struct mem_cgroup * last ;
1155
+
1156
+ do {
1157
+ __invalidate_reclaim_iterators (memcg , dead_memcg );
1158
+ last = memcg ;
1159
+ } while ((memcg = parent_mem_cgroup (memcg )));
1160
+
1161
+ /*
1162
+ * When cgruop1 non-hierarchy mode is used,
1163
+ * parent_mem_cgroup() does not walk all the way up to the
1164
+ * cgroup root (root_mem_cgroup). So we have to handle
1165
+ * dead_memcg from cgroup root separately.
1166
+ */
1167
+ if (last != root_mem_cgroup )
1168
+ __invalidate_reclaim_iterators (root_mem_cgroup ,
1169
+ dead_memcg );
1170
+ }
1171
+
1153
1172
/**
1154
1173
* mem_cgroup_scan_tasks - iterate over tasks of a memory cgroup hierarchy
1155
1174
* @memcg: hierarchy root
0 commit comments