提交 84f1e800 编写于 作者: Y Yafang Shao 提交者: Yang Yingliang

mm, memcg: fix error return value of mem_cgroup_css_alloc()

mainline inclusion
from mainline-v5.7-rc5
commit 11d67612
category: bugfix
bugzilla: 91659
CVE: NA

------------------------------------------------------------------

When I run my memcg testcase which creates lots of memcgs, I found
there're unexpected out of memory logs while there're still enough
available free memory.  The error log is

  mkdir: cannot create directory 'foo.65533': Cannot allocate memory

The reason is when we try to create more than MEM_CGROUP_ID_MAX memcgs,
an -ENOMEM errno will be set by mem_cgroup_css_alloc(), but the right
errno should be -ENOSPC "No space left on device", which is an
appropriate errno for userspace's failed mkdir.

As the errno really misled me, we should make it right.  After this
patch, the error log will be

  mkdir: cannot create directory 'foo.65533': No space left on device

[akpm@linux-foundation.org: s/EBUSY/ENOSPC/, per Michal]
[akpm@linux-foundation.org: s/EBUSY/ENOSPC/, per Michal]
Fixes: 73f576c0 ("mm: memcontrol: fix cgroup creation failure after many small jobs")
Suggested-by: NMatthew Wilcox <willy@infradead.org>
Signed-off-by: NYafang Shao <laoar.shao@gmail.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Acked-by: NMichal Hocko <mhocko@kernel.org>
Acked-by: NJohannes Weiner <hannes@cmpxchg.org>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Link: http://lkml.kernel.org/r/20200407063621.GA18914@dhcp22.suse.cz
Link: http://lkml.kernel.org/r/1586192163-20099-1-git-send-email-laoar.shao@gmail.comSigned-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
Conflict:
	mm/memcontrol.c
Signed-off-by: NLu Jialin <lujialin4@huawei.com>
Reviewed-by: NXiu Jianfeng <xiujianfeng@huawei.com>
Reviewed-by: Nweiyang wang <wangweiyang2@huawei.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 4e106b5c
...@@ -4923,20 +4923,23 @@ static struct mem_cgroup *mem_cgroup_alloc(void) ...@@ -4923,20 +4923,23 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
struct mem_cgroup_extension *memcg_ext; struct mem_cgroup_extension *memcg_ext;
size_t size; size_t size;
int node; int node;
long error = -ENOMEM;
size = sizeof(struct mem_cgroup_extension); size = sizeof(struct mem_cgroup_extension);
size += nr_node_ids * sizeof(struct mem_cgroup_per_node *); size += nr_node_ids * sizeof(struct mem_cgroup_per_node *);
memcg_ext = kzalloc(size, GFP_KERNEL); memcg_ext = kzalloc(size, GFP_KERNEL);
if (!memcg_ext) if (!memcg_ext)
return NULL; return ERR_PTR(error);
memcg = &memcg_ext->memcg; memcg = &memcg_ext->memcg;
memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL, memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL,
1, MEM_CGROUP_ID_MAX, 1, MEM_CGROUP_ID_MAX,
GFP_KERNEL); GFP_KERNEL);
if (memcg->id.id < 0) if (memcg->id.id < 0) {
error = memcg->id.id;
goto fail; goto fail;
}
memcg_ext->vmstats_local = alloc_percpu(struct mem_cgroup_stat_cpu); memcg_ext->vmstats_local = alloc_percpu(struct mem_cgroup_stat_cpu);
if (!memcg_ext->vmstats_local) if (!memcg_ext->vmstats_local)
...@@ -4978,7 +4981,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) ...@@ -4978,7 +4981,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
fail: fail:
mem_cgroup_id_remove(memcg); mem_cgroup_id_remove(memcg);
__mem_cgroup_free(memcg); __mem_cgroup_free(memcg);
return NULL; return ERR_PTR(error);
} }
static struct cgroup_subsys_state * __ref static struct cgroup_subsys_state * __ref
...@@ -4989,8 +4992,8 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) ...@@ -4989,8 +4992,8 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
long error = -ENOMEM; long error = -ENOMEM;
memcg = mem_cgroup_alloc(); memcg = mem_cgroup_alloc();
if (!memcg) if (IS_ERR(memcg))
return ERR_PTR(error); return ERR_CAST(memcg);
memcg->high = PAGE_COUNTER_MAX; memcg->high = PAGE_COUNTER_MAX;
memcg->soft_limit = PAGE_COUNTER_MAX; memcg->soft_limit = PAGE_COUNTER_MAX;
...@@ -5037,7 +5040,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) ...@@ -5037,7 +5040,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
fail: fail:
mem_cgroup_id_remove(memcg); mem_cgroup_id_remove(memcg);
mem_cgroup_free(memcg); mem_cgroup_free(memcg);
return ERR_PTR(-ENOMEM); return ERR_PTR(error);
} }
static int mem_cgroup_css_online(struct cgroup_subsys_state *css) static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册