[PATCH 5/8] mm: memcontrol: per-node kmem accounting for page charges

From: Alexandre Ghiti

Date: Mon May 11 2026 - 16:37:42 EST


Update __memcg_kmem_charge_page() to use per-node obj_cgroup for
correct NUMA attribution of NR_KMEM.

Signed-off-by: Alexandre Ghiti <alex@xxxxxxxx>
---
mm/memcontrol.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 979a847e542a..66d2beb1c974 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3105,17 +3105,19 @@ static void page_set_objcg(struct page *page, const struct obj_cgroup *objcg)
*/
int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order)
{
- struct obj_cgroup *objcg;
+ struct obj_cgroup *objcg, *nid_objcg;
+ int nid = page_to_nid(page);
int ret = 0;

objcg = current_obj_cgroup();
if (objcg && !obj_cgroup_is_root(objcg)) {
- ret = obj_cgroup_charge_pages(objcg, gfp, 1 << order);
- if (!ret) {
- obj_cgroup_get(objcg);
- page_set_objcg(page, objcg);
- return 0;
- }
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
+ ret = obj_cgroup_charge_pages(nid_objcg, gfp, 1 << order);
+ if (ret)
+ return ret;
+ obj_cgroup_get(nid_objcg);
+ page_set_objcg(page, nid_objcg);
+ return 0;
}
return ret;
}
--
2.54.0