On 11/27/22 11:54, Hyeonggon Yoo wrote: > On Mon, Nov 21, 2022 at 06:11:59PM +0100, Vlastimil Babka wrote: >> In the following patch we want to introduce CONFIG_SLUB_TINY allocation >> paths that don't use the percpu slab. To prepare, refactor the >> allocation functions: >> >> Split out __slab_alloc_node() from slab_alloc_node() where the former >> does the actual allocation and the latter calls the pre/post hooks. >> >> Analogically, split out __kmem_cache_alloc_bulk() from >> kmem_cache_alloc_bulk(). >> >> Signed-off-by: Vlastimil Babka <vbabka@xxxxxxx> >> --- >> mm/slub.c | 127 +++++++++++++++++++++++++++++++++--------------------- >> 1 file changed, 77 insertions(+), 50 deletions(-) > > [...] > >> + >> +/* Note that interrupts must be enabled when calling this function. */ >> +int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, >> + void **p) >> +{ >> + int i; >> + struct obj_cgroup *objcg = NULL; >> + >> + /* memcg and kmem_cache debug support */ >> + s = slab_pre_alloc_hook(s, NULL, &objcg, size, flags); >> + if (unlikely(!s)) >> + return false; >> + >> + i = __kmem_cache_alloc_bulk(s, flags, size, p, objcg); >> + >> + /* >> + * memcg and kmem_cache debug support and memory initialization. >> + * Done outside of the IRQ disabled fastpath loop. >> + */ >> + if (i != 0) >> + slab_post_alloc_hook(s, objcg, flags, size, p, >> + slab_want_init_on_alloc(flags, s)); > > This patch looks mostly good but wondering what happens if someone calls it with size == 0 > so it does not call slab_post_alloc_hook()? Hmm looks like in that case we miss doing obj_cgroup_put(objcg) in memcg_slab_post_alloc_hook(). Good catch, thanks! Fixing up, also a "return false" from int function (existed also before this patch). ----8<---- diff --git a/mm/slub.c b/mm/slub.c index b74c4664160e..88f0ce49caab 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -3888,10 +3888,13 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, int i; struct obj_cgroup *objcg = NULL; + if (!size) + return 0; + /* memcg and kmem_cache debug support */ s = slab_pre_alloc_hook(s, NULL, &objcg, size, flags); if (unlikely(!s)) - return false; + return 0; i = __kmem_cache_alloc_bulk(s, flags, size, p, objcg);