On Fri, May 22, 2020 at 08:27:15PM +0200, Vlastimil Babka wrote: > On 4/22/20 10:46 PM, Roman Gushchin wrote: > > Allocate and release memory to store obj_cgroup pointers for each > > non-root slab page. Reuse page->mem_cgroup pointer to store a pointer > > to the allocated space. > > > > To distinguish between obj_cgroups and memcg pointers in case > > when it's not obvious which one is used (as in page_cgroup_ino()), > > let's always set the lowest bit in the obj_cgroup case. > > > > Signed-off-by: Roman Gushchin <guro@xxxxxx> > > Reviewed-by: Vlastimil Babka <vbabka@xxxxxxx> > > But I have a suggestion: > > ... > > > --- a/include/linux/slub_def.h > > +++ b/include/linux/slub_def.h > > @@ -191,4 +191,6 @@ static inline unsigned int obj_to_index(const struct kmem_cache *cache, > > cache->reciprocal_size); > > } > > > > +extern int objs_per_slab(struct kmem_cache *cache); > > + > > #endif /* _LINUX_SLUB_DEF_H */ > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index 7f87a0eeafec..63826e460b3f 100644 > > ... > > > --- a/mm/slub.c > > +++ b/mm/slub.c > > @@ -5992,4 +5992,9 @@ ssize_t slabinfo_write(struct file *file, const char __user *buffer, > > { > > return -EIO; > > } > > + > > +int objs_per_slab(struct kmem_cache *cache) > > +{ > > + return oo_objects(cache->oo); > > +} > > #endif /* CONFIG_SLUB_DEBUG */ > > > > It's somewhat unfortunate to function call just for this. Although perhaps > compiler can be smart enough as charge_slab_page() (that callse objs_per_slab()) > is inline and called from alloc_slab_page() which is also in mm/slub.c. > > But it might be also a bit wasteful in case SLUB doesn't manage to allocate its > desired order, but smaller. The actual number of objects is then in page->objects. > > So ideally this should use something like objs_per_slab_page(cache, page) where > SLAB supplies cache->num and SLUB page->objects, both implementations inline, > and ignoring the other parameter? Good idea! I'll do this in the next version. Thanks!