From: Kirill Tkhai <ktkhai@virtuozzo.com> To: akpm@linux-foundation.org, hannes@cmpxchg.org, mhocko@kernel.org, vdavydov.dev@gmail.com, cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH] memcg: Remove memcg_cgroup::id from IDR on mem_cgroup_css_alloc() failure Date: Thu, 12 Apr 2018 17:52:04 +0300 Message-ID: <152354470916.22460.14397070748001974638.stgit@localhost.localdomain> (raw) In case of memcg_online_kmem() fail, memcg_cgroup::id remains hashed in mem_cgroup_idr even after memcg memory is freed. This leads to leak of ID in mem_cgroup_idr. This patch adds removing into mem_cgroup_css_alloc(), which fixes the problem. For better readability, it adds generic helper, which will be used in mem_cgroup_alloc() and mem_cgroup_id_put_many() too. Fixes 73f576c04b94 "mm: memcontrol: fix cgroup creation failure after many small jobs" Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> --- mm/memcontrol.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3e7942c301a8..448db08d97a0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4263,6 +4263,14 @@ static struct cftype mem_cgroup_legacy_files[] = { static DEFINE_IDR(mem_cgroup_idr); +static void mem_cgroup_id_remove(struct mem_cgroup *memcg) +{ + if (memcg->id.id > 0) { + idr_remove(&mem_cgroup_idr, memcg->id.id); + memcg->id.id = 0; + } +} + static void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n) { VM_BUG_ON(atomic_read(&memcg->id.ref) <= 0); @@ -4273,8 +4281,7 @@ static void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n) { VM_BUG_ON(atomic_read(&memcg->id.ref) < n); if (atomic_sub_and_test(n, &memcg->id.ref)) { - idr_remove(&mem_cgroup_idr, memcg->id.id); - memcg->id.id = 0; + mem_cgroup_id_remove(memcg); /* Memcg ID pins CSS */ css_put(&memcg->css); @@ -4411,8 +4418,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) idr_replace(&mem_cgroup_idr, memcg, memcg->id.id); return memcg; fail: - if (memcg->id.id > 0) - idr_remove(&mem_cgroup_idr, memcg->id.id); + mem_cgroup_id_remove(memcg); __mem_cgroup_free(memcg); return NULL; } @@ -4471,6 +4477,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) return &memcg->css; fail: + mem_cgroup_id_remove(memcg); mem_cgroup_free(memcg); return ERR_PTR(-ENOMEM); }
next reply index Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-04-12 14:52 Kirill Tkhai [this message] 2018-04-13 8:55 ` Michal Hocko 2018-04-13 9:35 ` Kirill Tkhai 2018-04-13 11:02 ` Michal Hocko 2018-04-13 11:06 ` Kirill Tkhai 2018-04-13 11:20 ` Michal Hocko 2018-04-13 11:29 ` Kirill Tkhai 2018-04-13 11:38 ` Michal Hocko 2018-04-13 11:49 ` Kirill Tkhai 2018-04-13 11:54 ` Michal Hocko 2018-04-13 12:07 ` Kirill Tkhai 2018-04-13 12:14 ` Michal Hocko 2018-04-13 12:51 ` Michal Hocko 2018-07-26 23:25 ` Andrew Morton 2018-07-27 19:31 ` Johannes Weiner 2018-07-29 19:26 ` Vladimir Davydov 2018-07-30 15:31 ` Johannes Weiner 2018-07-31 23:39 ` Andrew Morton 2018-08-01 15:55 ` Johannes Weiner 2018-08-01 16:22 ` Vladimir Davydov 2018-08-02 8:03 ` Kirill Tkhai 2018-08-02 8:13 ` [PATCH] memcg: Add comment to mem_cgroup_css_online() Kirill Tkhai 2018-08-01 16:16 ` [PATCH] memcg: Remove memcg_cgroup::id from IDR on mem_cgroup_css_alloc() failure Vladimir Davydov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=152354470916.22460.14397070748001974638.stgit@localhost.localdomain \ --to=ktkhai@virtuozzo.com \ --cc=akpm@linux-foundation.org \ --cc=cgroups@vger.kernel.org \ --cc=hannes@cmpxchg.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mhocko@kernel.org \ --cc=vdavydov.dev@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-mm Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-mm/0 linux-mm/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-mm linux-mm/ https://lore.kernel.org/linux-mm \ linux-mm@kvack.org public-inbox-index linux-mm Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kvack.linux-mm AGPL code for this site: git clone https://public-inbox.org/public-inbox.git