|
@@ -2896,6 +2896,7 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
|
|
|
* ordering is imposed by list_lru_node->lock taken by
|
|
|
* memcg_drain_all_list_lrus().
|
|
|
*/
|
|
|
+ rcu_read_lock(); /* can be called from css_free w/o cgroup_mutex */
|
|
|
css_for_each_descendant_pre(css, &memcg->css) {
|
|
|
child = mem_cgroup_from_css(css);
|
|
|
BUG_ON(child->kmemcg_id != kmemcg_id);
|
|
@@ -2903,6 +2904,8 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
|
|
|
if (!memcg->use_hierarchy)
|
|
|
break;
|
|
|
}
|
|
|
+ rcu_read_unlock();
|
|
|
+
|
|
|
memcg_drain_all_list_lrus(kmemcg_id, parent->kmemcg_id);
|
|
|
|
|
|
memcg_free_cache_id(kmemcg_id);
|