Currently we don't reclaim memory on memcg offlining.
kmem in memcg pins cgroup indefinitely which don't allow
us to reuse cgroup's id. Since cgroups id count is limited
to ~65K we may exhaust all possible ids.

Try to free all memcg memory during offline. This should
allow us to destroy cgroup almost immedieatly and reuse id.

https://jira.sw.ru/browse/PSBM-83628
Signed-off-by: Andrey Ryabinin <[email protected]>
---
 mm/memcontrol.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index d68650ad7a53..590851f6c1d3 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -6146,6 +6146,19 @@ static void 
mem_cgroup_invalidate_reclaim_iterators(struct mem_cgroup *memcg)
                mem_cgroup_iter_invalidate(root_mem_cgroup);
 }
 
+static void mem_cgroup_free_all(struct mem_cgroup *memcg)
+{
+       int nr_retries = 5;
+
+       lru_add_drain_all();
+
+       while (nr_retries && page_counter_read(&memcg->memory))
+               if (!try_to_free_mem_cgroup_pages(memcg, -1UL, GFP_KERNEL, 0))
+                       nr_retries--;
+
+       lru_add_drain();
+}
+
 static void mem_cgroup_css_offline(struct cgroup *cont)
 {
        struct mem_cgroup *memcg = mem_cgroup_from_cont(cont);
@@ -6175,6 +6188,7 @@ static void mem_cgroup_css_offline(struct cgroup *cont)
                rcu_read_lock();
        }
        rcu_read_unlock();
+       mem_cgroup_free_all(memcg);
        mem_cgroup_reparent_charges(memcg);
 
        /*
-- 
2.16.1

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to