Skip to content

Commit b8557d1

Browse files
Matthew Wilcox (Oracle)tehcaster
authored andcommitted
memcg: Convert mem_cgroup_from_obj_folio() to mem_cgroup_from_obj_slab()
In preparation for splitting struct slab from struct page and struct folio, convert the pointer to a slab rather than a folio. This means we can end up passing a NULL slab pointer to mem_cgroup_from_obj_slab() if the pointer is not to a page allocated to slab, and we handle that appropriately by returning NULL. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@kernel.org> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Muchun Song <muchun.song@linux.dev> Cc: cgroups@vger.kernel.org Link: https://patch.msgid.link/20251113000932.1589073-15-willy@infradead.org Acked-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
1 parent 5934b1b commit b8557d1

1 file changed

Lines changed: 16 additions & 24 deletions

File tree

mm/memcontrol.c

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2557,38 +2557,25 @@ static inline void mod_objcg_mlstate(struct obj_cgroup *objcg,
25572557
}
25582558

25592559
static __always_inline
2560-
struct mem_cgroup *mem_cgroup_from_obj_folio(struct folio *folio, void *p)
2560+
struct mem_cgroup *mem_cgroup_from_obj_slab(struct slab *slab, void *p)
25612561
{
25622562
/*
25632563
* Slab objects are accounted individually, not per-page.
25642564
* Memcg membership data for each individual object is saved in
25652565
* slab->obj_exts.
25662566
*/
2567-
if (folio_test_slab(folio)) {
2568-
struct slabobj_ext *obj_exts;
2569-
struct slab *slab;
2570-
unsigned int off;
2571-
2572-
slab = folio_slab(folio);
2573-
obj_exts = slab_obj_exts(slab);
2574-
if (!obj_exts)
2575-
return NULL;
2576-
2577-
off = obj_to_index(slab->slab_cache, slab, p);
2578-
if (obj_exts[off].objcg)
2579-
return obj_cgroup_memcg(obj_exts[off].objcg);
2567+
struct slabobj_ext *obj_exts;
2568+
unsigned int off;
25802569

2570+
obj_exts = slab_obj_exts(slab);
2571+
if (!obj_exts)
25812572
return NULL;
2582-
}
25832573

2584-
/*
2585-
* folio_memcg_check() is used here, because in theory we can encounter
2586-
* a folio where the slab flag has been cleared already, but
2587-
* slab->obj_exts has not been freed yet
2588-
* folio_memcg_check() will guarantee that a proper memory
2589-
* cgroup pointer or NULL will be returned.
2590-
*/
2591-
return folio_memcg_check(folio);
2574+
off = obj_to_index(slab->slab_cache, slab, p);
2575+
if (obj_exts[off].objcg)
2576+
return obj_cgroup_memcg(obj_exts[off].objcg);
2577+
2578+
return NULL;
25922579
}
25932580

25942581
/*
@@ -2602,10 +2589,15 @@ struct mem_cgroup *mem_cgroup_from_obj_folio(struct folio *folio, void *p)
26022589
*/
26032590
struct mem_cgroup *mem_cgroup_from_slab_obj(void *p)
26042591
{
2592+
struct slab *slab;
2593+
26052594
if (mem_cgroup_disabled())
26062595
return NULL;
26072596

2608-
return mem_cgroup_from_obj_folio(virt_to_folio(p), p);
2597+
slab = virt_to_slab(p);
2598+
if (slab)
2599+
return mem_cgroup_from_obj_slab(slab, p);
2600+
return folio_memcg_check(virt_to_folio(p));
26092601
}
26102602

26112603
static struct obj_cgroup *__get_obj_cgroup_from_memcg(struct mem_cgroup *memcg)

0 commit comments

Comments
 (0)