Re: [PATCH RFC 12/12] mm/slab: stop allocating objcg pointers when unnecessary

From: Vlastimil Babka (SUSE)

Date: Thu Jul 16 2026 - 11:08:45 EST


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?

But maybe we can get rid of it completely.

The only caller is calculate_sizes():

#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.

>> + 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
>>