[PATCH] slab: introduce kmem_cache_zalloc allocator
Introduce a memory-zeroing variant of kmem_cache_alloc. The allocator already exits in XFS and there are potential users for it so this patch makes the allocator available for the general public. Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
871751e25d
commit
a8c0f9a41f
@ -64,6 +64,7 @@ extern kmem_cache_t *kmem_cache_create(const char *, size_t, size_t, unsigned lo
|
||||
extern int kmem_cache_destroy(kmem_cache_t *);
|
||||
extern int kmem_cache_shrink(kmem_cache_t *);
|
||||
extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t);
|
||||
extern void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
|
||||
extern void kmem_cache_free(kmem_cache_t *, void *);
|
||||
extern unsigned int kmem_cache_size(kmem_cache_t *);
|
||||
extern const char *kmem_cache_name(kmem_cache_t *);
|
||||
@ -156,6 +157,7 @@ struct kmem_cache *kmem_cache_create(const char *c, size_t, size_t,
|
||||
void (*)(void *, struct kmem_cache *, unsigned long));
|
||||
int kmem_cache_destroy(struct kmem_cache *c);
|
||||
void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags);
|
||||
void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
|
||||
void kmem_cache_free(struct kmem_cache *c, void *b);
|
||||
const char *kmem_cache_name(struct kmem_cache *);
|
||||
void *kmalloc(size_t size, gfp_t flags);
|
||||
|
17
mm/slab.c
17
mm/slab.c
@ -3107,6 +3107,23 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
|
||||
}
|
||||
EXPORT_SYMBOL(kmem_cache_alloc);
|
||||
|
||||
/**
|
||||
* kmem_cache_alloc - Allocate an object. The memory is set to zero.
|
||||
* @cache: The cache to allocate from.
|
||||
* @flags: See kmalloc().
|
||||
*
|
||||
* Allocate an object from this cache and set the allocated memory to zero.
|
||||
* The flags are only relevant if the cache has no available objects.
|
||||
*/
|
||||
void *kmem_cache_zalloc(struct kmem_cache *cache, gfp_t flags)
|
||||
{
|
||||
void *ret = __cache_alloc(cache, flags, __builtin_return_address(0));
|
||||
if (ret)
|
||||
memset(ret, 0, obj_size(cache));
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(kmem_cache_zalloc);
|
||||
|
||||
/**
|
||||
* kmem_ptr_validate - check if an untrusted pointer might
|
||||
* be a slab entry.
|
||||
|
10
mm/slob.c
10
mm/slob.c
@ -294,6 +294,16 @@ void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags)
|
||||
}
|
||||
EXPORT_SYMBOL(kmem_cache_alloc);
|
||||
|
||||
void *kmem_cache_zalloc(struct kmem_cache *c, gfp_t flags)
|
||||
{
|
||||
void *ret = kmem_cache_alloc(c, flags);
|
||||
if (ret)
|
||||
memset(ret, 0, c->size);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(kmem_cache_zalloc);
|
||||
|
||||
void kmem_cache_free(struct kmem_cache *c, void *b)
|
||||
{
|
||||
if (c->dtor)
|
||||
|
Loading…
Reference in New Issue
Block a user