aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@cs.helsinki.fi>2006-03-25 06:06:42 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-25 11:22:49 -0500
commita8c0f9a41f88da703ade33f9c1626a55c786e8bb (patch)
tree8c2904597c61b873bfd85eed4ac196dd66e6f125
parent871751e25d956ad24f129ca972b7851feaa61d53 (diff)
[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>
-rw-r--r--include/linux/slab.h2
-rw-r--r--mm/slab.c17
-rw-r--r--mm/slob.c10
3 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/slab.h b/include/linux/slab.h
index f88e08a5802c..1216b09e07b1 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -64,6 +64,7 @@ extern kmem_cache_t *kmem_cache_create(const char *, size_t, size_t, unsigned lo
64extern int kmem_cache_destroy(kmem_cache_t *); 64extern int kmem_cache_destroy(kmem_cache_t *);
65extern int kmem_cache_shrink(kmem_cache_t *); 65extern int kmem_cache_shrink(kmem_cache_t *);
66extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t); 66extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t);
67extern void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
67extern void kmem_cache_free(kmem_cache_t *, void *); 68extern void kmem_cache_free(kmem_cache_t *, void *);
68extern unsigned int kmem_cache_size(kmem_cache_t *); 69extern unsigned int kmem_cache_size(kmem_cache_t *);
69extern const char *kmem_cache_name(kmem_cache_t *); 70extern 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,
156 void (*)(void *, struct kmem_cache *, unsigned long)); 157 void (*)(void *, struct kmem_cache *, unsigned long));
157int kmem_cache_destroy(struct kmem_cache *c); 158int kmem_cache_destroy(struct kmem_cache *c);
158void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags); 159void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags);
160void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
159void kmem_cache_free(struct kmem_cache *c, void *b); 161void kmem_cache_free(struct kmem_cache *c, void *b);
160const char *kmem_cache_name(struct kmem_cache *); 162const char *kmem_cache_name(struct kmem_cache *);
161void *kmalloc(size_t size, gfp_t flags); 163void *kmalloc(size_t size, gfp_t flags);
diff --git a/mm/slab.c b/mm/slab.c
index a5047161084e..6f5aeebd4306 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3108,6 +3108,23 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
3108EXPORT_SYMBOL(kmem_cache_alloc); 3108EXPORT_SYMBOL(kmem_cache_alloc);
3109 3109
3110/** 3110/**
3111 * kmem_cache_alloc - Allocate an object. The memory is set to zero.
3112 * @cache: The cache to allocate from.
3113 * @flags: See kmalloc().
3114 *
3115 * Allocate an object from this cache and set the allocated memory to zero.
3116 * The flags are only relevant if the cache has no available objects.
3117 */
3118void *kmem_cache_zalloc(struct kmem_cache *cache, gfp_t flags)
3119{
3120 void *ret = __cache_alloc(cache, flags, __builtin_return_address(0));
3121 if (ret)
3122 memset(ret, 0, obj_size(cache));
3123 return ret;
3124}
3125EXPORT_SYMBOL(kmem_cache_zalloc);
3126
3127/**
3111 * kmem_ptr_validate - check if an untrusted pointer might 3128 * kmem_ptr_validate - check if an untrusted pointer might
3112 * be a slab entry. 3129 * be a slab entry.
3113 * @cachep: the cache we're checking against 3130 * @cachep: the cache we're checking against
diff --git a/mm/slob.c b/mm/slob.c
index a1f42bdc0245..9bcc7e2cabfd 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -294,6 +294,16 @@ void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags)
294} 294}
295EXPORT_SYMBOL(kmem_cache_alloc); 295EXPORT_SYMBOL(kmem_cache_alloc);
296 296
297void *kmem_cache_zalloc(struct kmem_cache *c, gfp_t flags)
298{
299 void *ret = kmem_cache_alloc(c, flags);
300 if (ret)
301 memset(ret, 0, c->size);
302
303 return ret;
304}
305EXPORT_SYMBOL(kmem_cache_zalloc);
306
297void kmem_cache_free(struct kmem_cache *c, void *b) 307void kmem_cache_free(struct kmem_cache *c, void *b)
298{ 308{
299 if (c->dtor) 309 if (c->dtor)