Re: [PATCH RFC 12/12] mm/slab: stop allocating objcg pointers when unnecessary
Suren Baghdasaryan <[email protected]>
| Newsgroups | org.kernel.vger.cgroups,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <CAJuCfpFicmMa54V5qVY7BYQuNih9u+-bQ+x51VDza7zWPK_mOg@mail.gmail.com> |
On Thu, Jul 16, 2026 at 8:08 AM Vlastimil Babka (SUSE) <[email protected]> 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 > >> >