Re: [PATCH RFC 12/12] mm/slab: stop allocating objcg pointers when unnecessary
From: Suren Baghdasaryan
Date: Thu Jul 16 2026 - 12:28:58 EST
On Thu, Jul 16, 2026 at 8:08 AM Vlastimil Babka (SUSE)
<vbabka@xxxxxxxxxx> wrote:
>
> On 7/16/26 06:46, Suren Baghdasaryan wrote:
> > Maybe now we should rename static_obj_ext_size() to
> > static_obj_ext_max_size() as it reflects the max possible size of
> > slabobj_ext?
>
> Hm with _max_size() it doesn't have to be called static_ anymore?
Yeah, static_ is an implementation detail anyway.
>
> But maybe we can get rid of it completely.
>
> The only caller is calculate_sizes():
I was thinking the same but either way sounds fine to me. Keeping
obj_ext_max_size() would be a bit more self-documenting I think.
>
> #if defined(CONFIG_SLAB_OBJ_EXT) && defined(CONFIG_64BIT)
> if (slab_args_unmergeable(args, s->flags) &&
> (aligned_size - size >= static_obj_ext_size()))
> s->flags |= SLAB_OBJ_EXT_IN_OBJ;
> #endif
>
> We don't have slab pointer to pass to static_obj_ext_max_size().
> But we should be able to figure it out from the cache via
> cache_needs_objcg().
>
> So we'd need cache_obj_ext_size()?
>
> The static max size here works, but may prevent SLAB_OBJ_EXT_IN_OBJ
> needlessly if padding can only fit codetag_ref and not objcg, but
> we don't need objcg.
> Which is probably only theoretical at this point as kmalloc_normal
> caches (that have no objcg) have no padding, at least without
> slab_debug. But still.
Maybe keep it simple as is for now and then we can optimize it further?
>
> >> + size_t sz = 0;
> >> +
> >> + if (slab_needs_objcg(slab))
> >> + sz += 1;
> >> +
> >> + if (slab_obj_ext_has_codetag())
> >> + sz += 1;
> >> +
> >> + return sizeof(struct slabobj_ext) * sz;
> >> }
> >>
> >> #ifdef CONFIG_SLAB_OBJ_EXT
> >> @@ -741,7 +749,7 @@ static inline struct obj_cgroup **slab_obj_ext_objcgp(struct slabobj_ext *obj_ex
> >> static inline union codetag_ref *
> >> slab_obj_ext_codetag_ref(struct slab *slab, struct slabobj_ext *obj_ext)
> >> {
> >> - if (IS_ENABLED(CONFIG_MEMCG))
> >> + if (slab_needs_objcg(slab))
> >> obj_ext += 1;
> >>
> >> return &obj_ext->_ctref;
> >> diff --git a/mm/slub.c b/mm/slub.c
> >> index 771d73abacb6..09c4931e5435 100644
> >> --- a/mm/slub.c
> >> +++ b/mm/slub.c
> >> @@ -2503,6 +2503,9 @@ void memcg_slab_free_hook(struct kmem_cache *s, struct slab *slab, void **p,
> >> if (likely(!obj_exts))
> >> return;
> >>
> >> + if (!slab_needs_objcg(slab))
> >> + return;
> >> +
> >> get_slab_obj_exts(obj_exts);
> >> __memcg_slab_free_hook(s, slab, p, objects, obj_exts);
> >> put_slab_obj_exts(obj_exts);
> >>
> >> --
> >> 2.55.0
> >>
>