X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=mm%2Fmemcontrol.c;h=75e74408cc8f5081228288ed7bfd5d3e3ce9b4cd;hb=68b780598d75fb2be80d70034ec7b46e4fe712da;hp=925b431f3f03cf86402240b5dcc3fa784d808882;hpb=9ba55cf7cfbfd12a7e914d0d55b7581e896b3f0d;p=cascardo%2Flinux.git diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 925b431f3f03..75e74408cc8f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1608,7 +1608,7 @@ static void memcg_oom_recover(struct mem_cgroup *memcg) static void mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int order) { - if (!current->memcg_may_oom || current->memcg_in_oom) + if (!current->memcg_may_oom) return; /* * We are in the middle of the charge context here, so we @@ -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);