diff options
-rw-r--r-- | mm/memcontrol.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 925b431f3f03..58c69c94402a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -2896,6 +2896,7 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg) | |||
2896 | * ordering is imposed by list_lru_node->lock taken by | 2896 | * ordering is imposed by list_lru_node->lock taken by |
2897 | * memcg_drain_all_list_lrus(). | 2897 | * memcg_drain_all_list_lrus(). |
2898 | */ | 2898 | */ |
2899 | rcu_read_lock(); /* can be called from css_free w/o cgroup_mutex */ | ||
2899 | css_for_each_descendant_pre(css, &memcg->css) { | 2900 | css_for_each_descendant_pre(css, &memcg->css) { |
2900 | child = mem_cgroup_from_css(css); | 2901 | child = mem_cgroup_from_css(css); |
2901 | BUG_ON(child->kmemcg_id != kmemcg_id); | 2902 | BUG_ON(child->kmemcg_id != kmemcg_id); |
@@ -2903,6 +2904,8 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg) | |||
2903 | if (!memcg->use_hierarchy) | 2904 | if (!memcg->use_hierarchy) |
2904 | break; | 2905 | break; |
2905 | } | 2906 | } |
2907 | rcu_read_unlock(); | ||
2908 | |||
2906 | memcg_drain_all_list_lrus(kmemcg_id, parent->kmemcg_id); | 2909 | memcg_drain_all_list_lrus(kmemcg_id, parent->kmemcg_id); |
2907 | 2910 | ||
2908 | memcg_free_cache_id(kmemcg_id); | 2911 | memcg_free_cache_id(kmemcg_id); |