mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 15:09:50 -04:00
memcg: call the free function when allocation of pn fails
The 'free_mem_cgroup_per_node_info' function is used to free the 'mem_cgroup_per_node' struct. Using 'pn' as the input for the free_mem_cgroup_per_node_info function will be much clearer. Call 'free_mem_cgroup_per_node_info' when 'alloc_mem_cgroup_per_node_info' fails, to free 'pn' as a whole, which makes the code more cohesive. Link: https://lkml.kernel.org/r/20250124073514.2375622-3-chenridong@huaweicloud.com Signed-off-by: Chen Ridong <chenridong@huawei.com> Reviewed-by: Michal Koutný <mkoutny@suse.com> Acked-by: Shakeel Butt <shakeel.butt@linux.dev> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Roman Gushchin <roman.gushchin@linux.dev> Cc: David Finkel <davidf@vimeo.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: Muchun Song <songmuchun@bytedance.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Wang Weiyang <wangweiyang2@huawei.com> Cc: Yosry Ahmed <yosryahmed@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
1c81f1a699
commit
2059c8e320
@@ -3433,6 +3433,16 @@ struct mem_cgroup *mem_cgroup_get_from_ino(unsigned long ino)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void free_mem_cgroup_per_node_info(struct mem_cgroup_per_node *pn)
|
||||
{
|
||||
if (!pn)
|
||||
return;
|
||||
|
||||
free_percpu(pn->lruvec_stats_percpu);
|
||||
kfree(pn->lruvec_stats);
|
||||
kfree(pn);
|
||||
}
|
||||
|
||||
static bool alloc_mem_cgroup_per_node_info(struct mem_cgroup *memcg, int node)
|
||||
{
|
||||
struct mem_cgroup_per_node *pn;
|
||||
@@ -3457,23 +3467,10 @@ static bool alloc_mem_cgroup_per_node_info(struct mem_cgroup *memcg, int node)
|
||||
memcg->nodeinfo[node] = pn;
|
||||
return true;
|
||||
fail:
|
||||
kfree(pn->lruvec_stats);
|
||||
kfree(pn);
|
||||
free_mem_cgroup_per_node_info(pn);
|
||||
return false;
|
||||
}
|
||||
|
||||
static void free_mem_cgroup_per_node_info(struct mem_cgroup *memcg, int node)
|
||||
{
|
||||
struct mem_cgroup_per_node *pn = memcg->nodeinfo[node];
|
||||
|
||||
if (!pn)
|
||||
return;
|
||||
|
||||
free_percpu(pn->lruvec_stats_percpu);
|
||||
kfree(pn->lruvec_stats);
|
||||
kfree(pn);
|
||||
}
|
||||
|
||||
static void __mem_cgroup_free(struct mem_cgroup *memcg)
|
||||
{
|
||||
int node;
|
||||
@@ -3481,7 +3478,7 @@ static void __mem_cgroup_free(struct mem_cgroup *memcg)
|
||||
obj_cgroup_put(memcg->orig_objcg);
|
||||
|
||||
for_each_node(node)
|
||||
free_mem_cgroup_per_node_info(memcg, node);
|
||||
free_mem_cgroup_per_node_info(memcg->nodeinfo[node]);
|
||||
memcg1_free_events(memcg);
|
||||
kfree(memcg->vmstats);
|
||||
free_percpu(memcg->vmstats_percpu);
|
||||
|
||||
Reference in New Issue
Block a user