From: Vladimir Davydov <vdavy...@virtuozzo.com> Since commit 73f576c04b94 ("mm: memcontrol: fix cgroup creation failure after many small jobs") swap entries do not pin memcg->css.refcnt directly. Instead, they pin memcg->id.ref. So we should adjust the reference counters accordingly when moving swap charges between cgroups.
Fixes: 73f576c04b941 ("mm: memcontrol: fix cgroup creation failure after many small jobs") Link: http://lkml.kernel.org/r/9ce297c64954a42dc90b543bc76106c4a94f07e8.1470219853.git.vdavy...@virtuozzo.com Signed-off-by: Vladimir Davydov <vdavy...@virtuozzo.com> Acked-by: Michal Hocko <mho...@suse.com> Acked-by: Johannes Weiner <han...@cmpxchg.org> Cc: <sta...@vger.kernel.org> [3.19+] Signed-off-by: Andrew Morton <a...@linux-foundation.org> Signed-off-by: Linus Torvalds <torva...@linux-foundation.org> Changes: original patch also did: - css_put_many(&mc.from->css, mc.moved_swap); + css_put_many(&mc.to->css, mc.moved_swap); but this change seems strange and unrelated to me, let's skip it. https://jira.vzint.dev/browse/PSBM-147036 (cherry picked from commit 615d66c37c755c49ce022c9e5ac0875d27d2603d) Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> --- mm/memcontrol.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a9a1fb354d33..8b78c7c8d3e3 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -6674,9 +6674,9 @@ unsigned short mem_cgroup_id(struct mem_cgroup *memcg) return memcg->id.id; } -static void mem_cgroup_id_get(struct mem_cgroup *memcg) +static void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n) { - atomic_inc(&memcg->id.ref); + atomic_add(n, &memcg->id.ref); } static struct mem_cgroup *mem_cgroup_id_get_online(struct mem_cgroup *memcg) @@ -6697,9 +6697,9 @@ static struct mem_cgroup *mem_cgroup_id_get_online(struct mem_cgroup *memcg) return memcg; } -static void mem_cgroup_id_put(struct mem_cgroup *memcg) +static void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n) { - if (atomic_dec_and_test(&memcg->id.ref)) { + if (atomic_sub_and_test(n, &memcg->id.ref)) { idr_remove(&mem_cgroup_idr, memcg->id.id); memcg->id.id = 0; @@ -6708,6 +6708,16 @@ static void mem_cgroup_id_put(struct mem_cgroup *memcg) } } +static inline void mem_cgroup_id_get(struct mem_cgroup *memcg) +{ + mem_cgroup_id_get_many(memcg, 1); +} + +static inline void mem_cgroup_id_put(struct mem_cgroup *memcg) +{ + mem_cgroup_id_put_many(memcg, 1); +} + /** * mem_cgroup_from_id - look up a memcg from a memcg id * @id: the memcg id to look up @@ -7442,6 +7452,8 @@ static void __mem_cgroup_clear_mc(void) if (!mem_cgroup_is_root(mc.from)) page_counter_uncharge(&mc.from->memsw, mc.moved_swap); + mem_cgroup_id_put_many(mc.from, mc.moved_swap); + for (i = 0; i < mc.moved_swap; i++) css_put(&mc.from->css); @@ -7452,7 +7464,9 @@ static void __mem_cgroup_clear_mc(void) */ page_counter_uncharge(&mc.to->memory, mc.moved_swap); } - /* we've already done css_get(mc.to) */ + + mem_cgroup_id_get_many(mc.to, mc.moved_swap); + mc.moved_swap = 0; } if (do_swap_account) { -- 2.40.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel