All of lore.kernel.org
 help / color / mirror / Atom feed
From: Harry Yoo <harry.yoo@oracle.com>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: akpm@linux-foundation.org, andreyknvl@gmail.com, cl@gentwo.org,
	dvyukov@google.com, glider@google.com, hannes@cmpxchg.org,
	linux-mm@kvack.org, mhocko@kernel.org, muchun.song@linux.dev,
	rientjes@google.com, roman.gushchin@linux.dev,
	ryabinin.a.a@gmail.com, shakeel.butt@linux.dev,
	surenb@google.com, vincenzo.frascino@arm.com,
	yeoreum.yun@arm.com, tytso@mit.edu, adilger.kernel@dilger.ca,
	linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org,
	cgroups@vger.kernel.org, hao.li@linux.dev
Subject: Re: [PATCH V5 4/8] mm/slab: abstract slabobj_ext access via new slab_obj_ext() helper
Date: Thu, 8 Jan 2026 17:03:44 +0900	[thread overview]
Message-ID: <aV9k4Ez22j9ht_vk@hyeyoo> (raw)
In-Reply-To: <473d479c-4eae-4589-b8c2-e2a29e8e6bc1@suse.cz>

On Wed, Jan 07, 2026 at 03:56:41PM +0100, Vlastimil Babka wrote:
> On 1/5/26 09:02, Harry Yoo wrote:
> > Currently, the slab allocator assumes that slab->obj_exts is a pointer
> > to an array of struct slabobj_ext objects. However, to support storage
> > methods where struct slabobj_ext is embedded within objects, the slab
> > allocator should not make this assumption. Instead of directly
> > dereferencing the slabobj_exts array, abstract access to
> > struct slabobj_ext via helper functions.
> > 
> > Introduce a new API slabobj_ext metadata access:
> > 
> >   slab_obj_ext(slab, obj_exts, index) - returns the pointer to
> >   struct slabobj_ext element at the given index.
> > 
> > Directly dereferencing the return value of slab_obj_exts() is no longer
> > allowed. Instead, slab_obj_ext() must always be used to access
> > individual struct slabobj_ext objects.
> > 
> > Convert all users to use these APIs.
> > No functional changes intended.
> > 
> > +/*
> > + * slab_obj_ext - get the pointer to the slab object extension metadata
> > + * associated with an object in a slab.
> > + * @slab: a pointer to the slab struct
> > + * @obj_exts: a pointer to the object extension vector
> > + * @index: an index of the object
> > + *
> > + * Returns a pointer to the object extension associated with the object.
> > + */
> > +static inline struct slabobj_ext *slab_obj_ext(struct slab *slab,
> > +					       unsigned long obj_exts,
> > +					       unsigned int index)
> > +{
> > +	struct slabobj_ext *obj_ext;
> > +
> > +	VM_WARN_ON_ONCE(!slab_obj_exts(slab));
> > +	VM_WARN_ON_ONCE(obj_exts != slab_obj_exts(slab));
> 
> The first check seems redundant given we have the second one?
> If we get passed obj_ext 0 and slab_obj_exts() is also 0, it will blow up quickly anyway.

Right, will do.

> > +
> > +	obj_ext = (struct slabobj_ext *)obj_exts;
> > +	return &obj_ext[index];
> >  }
> >  
> >  int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s,
> > @@ -533,7 +558,13 @@ int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s,
> >  
> >  #else /* CONFIG_SLAB_OBJ_EXT */
> >  
> > -static inline struct slabobj_ext *slab_obj_exts(struct slab *slab)
> > +static inline unsigned long slab_obj_exts(struct slab *slab)
> > +{
> > +	return 0;
> > +}
> > +
> > +static inline struct slabobj_ext *slab_obj_ext(struct slab *slab,
> > +					       unsigned int index)
> 
> Hmm this is missing the obj_exts parameter? Either will not compile
> !CONFIG_SLAB_OBJ_EXT or isn't reachable in that config anyway?

It seems it's not reachable as it didn't break !CONFIG_SLAB_OBJ_EXT
builds and I'll fix the prototype anyway.

> >  {
> >  	return NULL;
> >  }
> > @@ -550,7 +581,7 @@ static inline enum node_stat_item cache_vmstat_idx(struct kmem_cache *s)
> >  bool __memcg_slab_post_alloc_hook(struct kmem_cache *s, struct list_lru *lru,
> >  				  gfp_t flags, size_t size, void **p);
> >  void __memcg_slab_free_hook(struct kmem_cache *s, struct slab *slab,
> > -			    void **p, int objects, struct slabobj_ext *obj_exts);
> > +			    void **p, int objects, unsigned long obj_exts);
> >  #endif
> >  
> >  void kvfree_rcu_cb(struct rcu_head *head);
> > diff --git a/mm/slub.c b/mm/slub.c
> > index 0e32f6420a8a..84bd4f23dc4a 100644
> > --- a/mm/slub.c
> > +++ b/mm/slub.c
> 
> <snip>
> 
> > @@ -2176,7 +2178,7 @@ int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s,
> >  
> >  static inline void free_slab_obj_exts(struct slab *slab)
> >  {
> > -	struct slabobj_ext *obj_exts;
> > +	unsigned long obj_exts;
> 
> I think in this function we could leave it as pointer.
> 
> >  	obj_exts = slab_obj_exts(slab);
> 
> And do a single cast here.
> 
> >  	if (!obj_exts) {
> > @@ -2196,11 +2198,11 @@ static inline void free_slab_obj_exts(struct slab *slab)
> >  	 * NULL, therefore replace NULL with CODETAG_EMPTY to indicate that
> >  	 * the extension for obj_exts is expected to be NULL.
> >  	 */
> > -	mark_objexts_empty(obj_exts);
> > +	mark_objexts_empty((struct slabobj_ext *)obj_exts);
> >  	if (unlikely(READ_ONCE(slab->obj_exts) & OBJEXTS_NOSPIN_ALLOC))
> > -		kfree_nolock(obj_exts);
> > +		kfree_nolock((void *)obj_exts);
> >  	else
> > -		kfree(obj_exts);
> > +		kfree((void *)obj_exts);
> >  	slab->obj_exts = 0;
> >  }
> 
> And avoid those 3 above.

That works for me, will do.

-- 
Cheers,
Harry / Hyeonggon

  reply	other threads:[~2026-01-08  8:04 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-05  8:02 [PATCH V5 0/8] mm/slab: reduce slab accounting memory overhead by allocating slabobj_ext metadata within unsed slab space Harry Yoo
2026-01-05  8:02 ` [PATCH V5 1/8] mm/slab: use unsigned long for orig_size to ensure proper metadata align Harry Yoo
2026-01-07 11:43   ` Vlastimil Babka
2026-01-08  7:12     ` Harry Yoo
2026-01-08 11:39   ` Alexander Potapenko
2026-01-09  1:52     ` Harry Yoo
2026-01-09  9:30       ` Alexander Potapenko
2026-01-12  6:28         ` Harry Yoo
2026-01-05  8:02 ` [PATCH V5 2/8] mm/slab: allow specifying free pointer offset when using constructor Harry Yoo
2026-01-05  8:02 ` [PATCH V5 3/8] ext4: specify the free pointer offset for ext4_inode_cache Harry Yoo
2026-01-07 13:54   ` Vlastimil Babka
2026-01-08  7:14     ` Harry Yoo
2026-01-05  8:02 ` [PATCH V5 4/8] mm/slab: abstract slabobj_ext access via new slab_obj_ext() helper Harry Yoo
2026-01-07 14:53   ` Hao Li
2026-01-08  7:21     ` Harry Yoo
2026-01-07 14:56   ` Vlastimil Babka
2026-01-08  8:03     ` Harry Yoo [this message]
2026-01-05  8:02 ` [PATCH V5 5/8] mm/slab: use stride to access slabobj_ext Harry Yoo
2026-01-05  8:02 ` [PATCH V5 6/8] mm/memcontrol,alloc_tag: handle slabobj_ext access under KASAN poison Harry Yoo
2026-01-05  8:02 ` [PATCH V5 7/8] mm/slab: save memory by allocating slabobj_ext array from leftover Harry Yoo
2026-01-07 17:08   ` Vlastimil Babka
2026-01-05  8:02 ` [PATCH V5 8/8] mm/slab: place slabobj_ext metadata in unused space within s->size Harry Yoo
2026-01-07 17:33   ` Vlastimil Babka
2026-01-08  9:02     ` Harry Yoo
2026-01-08  5:52   ` Hao Li
2026-01-08  8:41     ` Harry Yoo
2026-01-08  9:52       ` Hao Li
2026-01-08 10:28         ` Harry Yoo
2026-01-08 10:44         ` Harry Yoo
2026-01-08 10:52           ` Vlastimil Babka
2026-01-08 12:48             ` Hao Li
2026-01-09  2:32             ` Harry Yoo
2026-01-08 11:57           ` Hao Li
2026-01-05  8:05 ` [PATCH V5 0/8] mm/slab: reduce slab accounting memory overhead by allocating slabobj_ext metadata within unsed slab space Harry Yoo
2026-01-07 17:43 ` Vlastimil Babka
2026-01-08  7:05   ` Harry Yoo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aV9k4Ez22j9ht_vk@hyeyoo \
    --to=harry.yoo@oracle.com \
    --cc=adilger.kernel@dilger.ca \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=cl@gentwo.org \
    --cc=dvyukov@google.com \
    --cc=glider@google.com \
    --cc=hannes@cmpxchg.org \
    --cc=hao.li@linux.dev \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=muchun.song@linux.dev \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=ryabinin.a.a@gmail.com \
    --cc=shakeel.butt@linux.dev \
    --cc=surenb@google.com \
    --cc=tytso@mit.edu \
    --cc=vbabka@suse.cz \
    --cc=vincenzo.frascino@arm.com \
    --cc=yeoreum.yun@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.