slab: add kmem_cache_zalloc()
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Aug 2019 20:40:43 +0000 (16:40 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 1 Oct 2019 14:17:01 +0000 (10:17 -0400)
You could argue that the caller could do this with a ctor, though it
depends on when we run the ctors.  Do we cache constructed objects in
magazines?  I'd guess 'yes', without a lot of thought, so then each
separate allocation wouldn't be zeroed.

The other reason to make a separate function for this is that it's
easier to just implement it.  We have the object size in the kc, but the
ctor function pointer actually *doesn't* have that info, so we'd need to
pass it through.  Minor pain, chance to mess it up, etc.

The other other reason is that Linux has this function.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/slab.h
kern/src/slab.c

index 812985c..182b2bc 100644 (file)
@@ -155,6 +155,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t obj_size,
 void kmem_cache_destroy(struct kmem_cache *cp);
 /* Front end: clients of caches use these */
 void *kmem_cache_alloc(struct kmem_cache *cp, int flags);
+void *kmem_cache_zalloc(struct kmem_cache *cp, int flags);
 void kmem_cache_free(struct kmem_cache *cp, void *buf);
 /* Back end: internal functions */
 void kmem_cache_init(void);
index 520932d..86411fb 100644 (file)
@@ -636,6 +636,16 @@ try_alloc:
        return ret;
 }
 
+void *kmem_cache_zalloc(struct kmem_cache *kc, int flags)
+{
+       void *obj = kmem_cache_alloc(kc, flags);
+
+       if (!obj)
+               return NULL;
+       memset(obj, 0, kc->obj_size);
+       return obj;
+}
+
 /* Returns an object to the slab layer.  Caller must deconstruct the objects.
  * Note that objects in the slabs are unconstructed. */
 static void __kmem_free_to_slab(struct kmem_cache *cp, void *buf)