]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
memcg: call the free function when allocation of pn fails
authorChen Ridong <chenridong@huawei.com>
Fri, 24 Jan 2025 07:35:12 +0000 (07:35 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 05:05:54 +0000 (22:05 -0700)
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>
mm/memcontrol.c

index 12f45dd0f64abf20f5088adb51f70fd08c1eee44..7fd03425e2c4cda00e8abc26b2f4d98bf647241d 100644 (file)
@@ -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);