Commit bc812d19 authored by Chen Ridong's avatar Chen Ridong Committed by Andrew Morton
Browse files

memcg: factor out the replace_stock_objcg function

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: default avatarChen Ridong <chenridong@huawei.com>
Reviewed-by: default avatarRoman Gushchin <roman.gushchin@linux.dev>
Acked-by: default avatarShakeel Butt <shakeel.butt@linux.dev>
Acked-by: default avatarJohannes 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 2059c8e3
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -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;