]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
memcg: factor out the replace_stock_objcg function
authorChen Ridong <chenridong@huawei.com>
Fri, 24 Jan 2025 07:35:13 +0000 (07:35 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 05:05:54 +0000 (22:05 -0700)
Factor out the 'replace_stock_objcg' function to make the code more
cohesive.

Link: https://lkml.kernel.org/r/20250124073514.2375622-4-chenridong@huaweicloud.com
Signed-off-by: Chen Ridong <chenridong@huawei.com>
Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: David Finkel <davidf@vimeo.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Michal Koutný <mkoutny@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 7fd03425e2c4cda00e8abc26b2f4d98bf647241d..65056395a1b4ee80dab8f9501e24c0667035b5c7 100644 (file)
@@ -2700,6 +2700,20 @@ void __memcg_kmem_uncharge_page(struct page *page, int order)
        obj_cgroup_put(objcg);
 }
 
+/* Replace the stock objcg with objcg, return the old objcg */
+static struct obj_cgroup *replace_stock_objcg(struct memcg_stock_pcp *stock,
+                                            struct obj_cgroup *objcg)
+{
+       struct obj_cgroup *old = NULL;
+
+       old = drain_obj_stock(stock);
+       obj_cgroup_get(objcg);
+       stock->nr_bytes = atomic_read(&objcg->nr_charged_bytes)
+                       ? atomic_xchg(&objcg->nr_charged_bytes, 0) : 0;
+       WRITE_ONCE(stock->cached_objcg, objcg);
+       return old;
+}
+
 static void mod_objcg_state(struct obj_cgroup *objcg, struct pglist_data *pgdat,
                     enum node_stat_item idx, int nr)
 {
@@ -2717,11 +2731,7 @@ static void mod_objcg_state(struct obj_cgroup *objcg, struct pglist_data *pgdat,
         * changes.
         */
        if (READ_ONCE(stock->cached_objcg) != objcg) {
-               old = drain_obj_stock(stock);
-               obj_cgroup_get(objcg);
-               stock->nr_bytes = atomic_read(&objcg->nr_charged_bytes)
-                               ? atomic_xchg(&objcg->nr_charged_bytes, 0) : 0;
-               WRITE_ONCE(stock->cached_objcg, objcg);
+               old = replace_stock_objcg(stock, objcg);
                stock->cached_pgdat = pgdat;
        } else if (stock->cached_pgdat != pgdat) {
                /* Flush the existing cached vmstat data */
@@ -2875,11 +2885,7 @@ static void refill_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes,
 
        stock = this_cpu_ptr(&memcg_stock);
        if (READ_ONCE(stock->cached_objcg) != objcg) { /* reset if necessary */
-               old = drain_obj_stock(stock);
-               obj_cgroup_get(objcg);
-               WRITE_ONCE(stock->cached_objcg, objcg);
-               stock->nr_bytes = atomic_read(&objcg->nr_charged_bytes)
-                               ? atomic_xchg(&objcg->nr_charged_bytes, 0) : 0;
+               old = replace_stock_objcg(stock, objcg);
                allow_uncharge = true;  /* Allow uncharge when objcg changes */
        }
        stock->nr_bytes += nr_bytes;