diff options
author | Pekka Enberg <penberg@cs.helsinki.fi> | 2006-03-25 06:06:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-25 11:22:49 -0500 |
commit | a8c0f9a41f88da703ade33f9c1626a55c786e8bb (patch) | |
tree | 8c2904597c61b873bfd85eed4ac196dd66e6f125 | |
parent | 871751e25d956ad24f129ca972b7851feaa61d53 (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.h | 2 | ||||
-rw-r--r-- | mm/slab.c | 17 | ||||
-rw-r--r-- | mm/slob.c | 10 |
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 | |||
64 | extern int kmem_cache_destroy(kmem_cache_t *); | 64 | extern int kmem_cache_destroy(kmem_cache_t *); |
65 | extern int kmem_cache_shrink(kmem_cache_t *); | 65 | extern int kmem_cache_shrink(kmem_cache_t *); |
66 | extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t); | 66 | extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t); |
67 | extern void *kmem_cache_zalloc(struct kmem_cache *, gfp_t); | ||
67 | extern void kmem_cache_free(kmem_cache_t *, void *); | 68 | extern void kmem_cache_free(kmem_cache_t *, void *); |
68 | extern unsigned int kmem_cache_size(kmem_cache_t *); | 69 | extern unsigned int kmem_cache_size(kmem_cache_t *); |
69 | extern const char *kmem_cache_name(kmem_cache_t *); | 70 | 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, | |||
156 | void (*)(void *, struct kmem_cache *, unsigned long)); | 157 | void (*)(void *, struct kmem_cache *, unsigned long)); |
157 | int kmem_cache_destroy(struct kmem_cache *c); | 158 | int kmem_cache_destroy(struct kmem_cache *c); |
158 | void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags); | 159 | void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags); |
160 | void *kmem_cache_zalloc(struct kmem_cache *, gfp_t); | ||
159 | void kmem_cache_free(struct kmem_cache *c, void *b); | 161 | void kmem_cache_free(struct kmem_cache *c, void *b); |
160 | const char *kmem_cache_name(struct kmem_cache *); | 162 | const char *kmem_cache_name(struct kmem_cache *); |
161 | void *kmalloc(size_t size, gfp_t flags); | 163 | void *kmalloc(size_t size, gfp_t flags); |
@@ -3108,6 +3108,23 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) | |||
3108 | EXPORT_SYMBOL(kmem_cache_alloc); | 3108 | EXPORT_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 | */ | ||
3118 | void *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 | } | ||
3125 | EXPORT_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 |
@@ -294,6 +294,16 @@ void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags) | |||
294 | } | 294 | } |
295 | EXPORT_SYMBOL(kmem_cache_alloc); | 295 | EXPORT_SYMBOL(kmem_cache_alloc); |
296 | 296 | ||
297 | void *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 | } | ||
305 | EXPORT_SYMBOL(kmem_cache_zalloc); | ||
306 | |||
297 | void kmem_cache_free(struct kmem_cache *c, void *b) | 307 | void kmem_cache_free(struct kmem_cache *c, void *b) |
298 | { | 308 | { |
299 | if (c->dtor) | 309 | if (c->dtor) |