diff options
Diffstat (limited to 'mm/memcontrol.c')
| -rw-r--r-- | mm/memcontrol.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5beea03dd58a..a3b97f103966 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4990,19 +4990,22 @@ static struct mem_cgroup *mem_cgroup_alloc(void)  	unsigned int size;  	int node;  	int __maybe_unused i; +	long error = -ENOMEM;  	size = sizeof(struct mem_cgroup);  	size += nr_node_ids * sizeof(struct mem_cgroup_per_node *);  	memcg = kzalloc(size, GFP_KERNEL);  	if (!memcg) -		return NULL; +		return ERR_PTR(error);  	memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL,  				 1, MEM_CGROUP_ID_MAX,  				 GFP_KERNEL); -	if (memcg->id.id < 0) +	if (memcg->id.id < 0) { +		error = memcg->id.id;  		goto fail; +	}  	memcg->vmstats_local = alloc_percpu(struct memcg_vmstats_percpu);  	if (!memcg->vmstats_local) @@ -5046,7 +5049,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void)  fail:  	mem_cgroup_id_remove(memcg);  	__mem_cgroup_free(memcg); -	return NULL; +	return ERR_PTR(error);  }  static struct cgroup_subsys_state * __ref @@ -5057,8 +5060,8 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)  	long error = -ENOMEM;  	memcg = mem_cgroup_alloc(); -	if (!memcg) -		return ERR_PTR(error); +	if (IS_ERR(memcg)) +		return ERR_CAST(memcg);  	WRITE_ONCE(memcg->high, PAGE_COUNTER_MAX);  	memcg->soft_limit = PAGE_COUNTER_MAX; @@ -5108,7 +5111,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)  fail:  	mem_cgroup_id_remove(memcg);  	mem_cgroup_free(memcg); -	return ERR_PTR(-ENOMEM); +	return ERR_PTR(error);  }  static int mem_cgroup_css_online(struct cgroup_subsys_state *css)  | 
