On Mon, Nov 21, 2022 at 12:19:38PM -0800, Andrew Morton wrote: > On Mon, 21 Nov 2022 21:50:23 +0800 Feng Tang <feng.tang@xxxxxxxxx> wrote: > > > +#ifndef CONFIG_SLOB > > +#define is_kmalloc_cache(s) ((s)->flags & SLAB_KMALLOC) > > +#else > > +#define is_kmalloc_cache(s) (false) > > +#endif > > Could be implemented as a static inline C function, yes? Right, I also did try inline function first, and met compilation error: " ./include/linux/slab.h: In function ‘is_kmalloc_cache’: ./include/linux/slab.h:159:18: error: invalid use of undefined type ‘struct kmem_cache’ 159 | return (s->flags & SLAB_KMALLOC); | ^~ " The reason is 'struct kmem_cache' definition for slab/slub/slob sit separately in slab_def.h, slub_def.h and mm/slab.h, and they are not included in this 'include/linux/slab.h'. So I chose the macro way. Btw, I've worked on some patches related with sl[auo]b recently, and really felt the pain when dealing with 3 allocators, on both reading code and writing patches. And I really like the idea of fading away SLOB as the first step :) > If so, that's always best. For (silly) example, consider the behaviour > of > > x = is_kmalloc_cache(s++); > > with and without CONFIG_SLOB. Another solution I can think of is putting the implementation into slab_common.c, like the below? Thanks, Feng --- diff --git a/include/linux/slab.h b/include/linux/slab.h index 067f0e80be9e..e4fcdbfb3477 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -149,6 +149,17 @@ struct list_lru; struct mem_cgroup; + +#ifndef CONFIG_SLOB +extern bool is_kmalloc_cache(struct kmem_cache *s); +#else +static inline bool is_kmalloc_cache(struct kmem_cache *s) +{ + return false; +} +#endif + /* * struct kmem_cache related prototypes */ diff --git a/mm/slab_common.c b/mm/slab_common.c index a5480d67f391..860e804b7c0a 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -77,6 +77,13 @@ __setup_param("slub_merge", slub_merge, setup_slab_merge, 0); __setup("slab_nomerge", setup_slab_nomerge); __setup("slab_merge", setup_slab_merge); +#ifndef CONFIG_SLOB +bool is_kmalloc_cache(struct kmem_cache *s) +{ + return (s->flags & SLAB_KMALLOC); +} +#endif + /* * Determine the size of a slab object */