On 7/12/22 15:39, Hyeonggon Yoo wrote: > To unify kmalloc functions in later patch, introduce common alloc/free > functions that does not have tracepoint. > > Signed-off-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx> Reviewed-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > > v3: > Tried to avoid affecting existing functions. > > mm/slab.c | 36 +++++++++++++++++++++++++++++------- > mm/slab.h | 4 ++++ > mm/slub.c | 13 +++++++++++++ > 3 files changed, 46 insertions(+), 7 deletions(-) > > diff --git a/mm/slab.c b/mm/slab.c > index a2f43425a0ae..375e35c14430 100644 > --- a/mm/slab.c > +++ b/mm/slab.c > @@ -3560,6 +3560,14 @@ void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid) > } > EXPORT_SYMBOL(kmem_cache_alloc_node); > > +void *__kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, > + int nodeid, size_t orig_size, > + unsigned long caller) > +{ > + return slab_alloc_node(cachep, NULL, flags, nodeid, > + orig_size, caller); > +} > + > #ifdef CONFIG_TRACING > void *kmem_cache_alloc_node_trace(struct kmem_cache *cachep, > gfp_t flags, > @@ -3645,6 +3653,26 @@ void *__kmalloc(size_t size, gfp_t flags) > } > EXPORT_SYMBOL(__kmalloc); > > +static __always_inline > +void __do_kmem_cache_free(struct kmem_cache *cachep, void *objp, > + unsigned long caller) > +{ > + unsigned long flags; > + > + local_irq_save(flags); > + debug_check_no_locks_freed(objp, cachep->object_size); > + if (!(cachep->flags & SLAB_DEBUG_OBJECTS)) > + debug_check_no_obj_freed(objp, cachep->object_size); > + __cache_free(cachep, objp, caller); > + local_irq_restore(flags); > +} > + > +void __kmem_cache_free(struct kmem_cache *cachep, void *objp, > + unsigned long caller) > +{ > + __do_kmem_cache_free(cachep, objp, caller); > +} > + > /** > * kmem_cache_free - Deallocate an object > * @cachep: The cache the allocation was from. > @@ -3655,18 +3683,12 @@ EXPORT_SYMBOL(__kmalloc); > */ > void kmem_cache_free(struct kmem_cache *cachep, void *objp) > { > - unsigned long flags; > cachep = cache_from_obj(cachep, objp); > if (!cachep) > return; > > trace_kmem_cache_free(_RET_IP_, objp, cachep->name); > - local_irq_save(flags); > - debug_check_no_locks_freed(objp, cachep->object_size); > - if (!(cachep->flags & SLAB_DEBUG_OBJECTS)) > - debug_check_no_obj_freed(objp, cachep->object_size); > - __cache_free(cachep, objp, _RET_IP_); > - local_irq_restore(flags); > + __do_kmem_cache_free(cachep, objp, _RET_IP_); > } > EXPORT_SYMBOL(kmem_cache_free); > > diff --git a/mm/slab.h b/mm/slab.h > index c81c92d421f1..9193e9c1f040 100644 > --- a/mm/slab.h > +++ b/mm/slab.h > @@ -275,6 +275,10 @@ void create_kmalloc_caches(slab_flags_t); > struct kmem_cache *kmalloc_slab(size_t, gfp_t); > > void *kmalloc_large_node_notrace(size_t size, gfp_t flags, int node); > +void *__kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, > + int node, size_t orig_size, > + unsigned long caller); > +void __kmem_cache_free(struct kmem_cache *s, void *x, unsigned long caller); > #endif > > gfp_t kmalloc_fix_flags(gfp_t flags); > diff --git a/mm/slub.c b/mm/slub.c > index 6cb7ca27f3b7..74eb78678c98 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -3262,6 +3262,14 @@ void *kmem_cache_alloc_lru(struct kmem_cache *s, struct list_lru *lru, > } > EXPORT_SYMBOL(kmem_cache_alloc_lru); > > +void *__kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, > + int node, size_t orig_size, > + unsigned long caller) > +{ > + return slab_alloc_node(s, NULL, gfpflags, node, > + caller, orig_size); > +} > + > #ifdef CONFIG_TRACING > void *kmem_cache_alloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size) > { > @@ -3526,6 +3534,11 @@ void ___cache_free(struct kmem_cache *cache, void *x, unsigned long addr) > } > #endif > > +void __kmem_cache_free(struct kmem_cache *s, void *x, unsigned long caller) > +{ > + slab_free(s, virt_to_slab(x), x, NULL, &x, 1, caller); > +} > + > void kmem_cache_free(struct kmem_cache *s, void *x) > { > s = cache_from_obj(s, x);