Commit 2a777eac authored by Jesper Dangaard Brouer's avatar Jesper Dangaard Brouer Committed by Linus Torvalds
Browse files

slab: implement bulk alloc in SLAB allocator

This patch implements the alloc side of bulk API for the SLAB allocator.

Further optimization are still possible by changing the call to
__do_cache_alloc() into something that can return multiple objects.
This optimization is left for later, given end results already show in
the area of 80% speedup.

Signed-off-by: default avatarJesper Dangaard Brouer <>
Cc: Christoph Lameter <>
Cc: Pekka Enberg <>
Cc: David Rientjes <>
Cc: Joonsoo Kim <>
Cc: Vladimir Davydov <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent d5e3ed66
......@@ -3392,9 +3392,42 @@ void kmem_cache_free_bulk(struct kmem_cache *s, size_t size, void **p)
int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
void **p)
void **p)
return __kmem_cache_alloc_bulk(s, flags, size, p);
size_t i;
s = slab_pre_alloc_hook(s, flags);
if (!s)
return 0;
cache_alloc_debugcheck_before(s, flags);
for (i = 0; i < size; i++) {
void *objp = __do_cache_alloc(s, flags);
/* this call could be done outside IRQ disabled section */
objp = cache_alloc_debugcheck_after(s, flags, objp, _RET_IP_);
if (unlikely(!objp))
goto error;
p[i] = objp;
/* Clear memory outside IRQ disabled section */
if (unlikely(flags & __GFP_ZERO))
for (i = 0; i < size; i++)
memset(p[i], 0, s->object_size);
slab_post_alloc_hook(s, flags, size, p);
/* FIXME: Trace call missing. Christoph would like a bulk variant */
return size;
slab_post_alloc_hook(s, flags, i, p);
__kmem_cache_free_bulk(s, i, p);
return 0;
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment