kernel - Add zero-on-instantiate objcache ctor
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 24 Jun 2015 05:59:15 +0000 (22:59 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 24 Jun 2015 05:59:15 +0000 (22:59 -0700)
* When creating kmalloc-backed pools, M_ZERO cannot be passed to
  objcache_get() because the underlying kmalloc only occurs when
  the objcache is not recycling a cached entry.

* Add a feature to the objcache whereby the allocation from backing
  store is zero'd.  The reuse case will not be zerod, so users of
  this type of objcache must properly reset/cleanup fields before
  disposing of the object.

* Used by HAMMER2.

sys/kern/kern_objcache.c
sys/sys/objcache.h

index c0df062..8decb00 100644 (file)
@@ -506,6 +506,20 @@ objcache_malloc_alloc(void *allocator_args, int ocflags)
                       ocflags & OC_MFLAGS));
 }
 
+/*
+ * Wrapper for malloc allocation routines, with initial zeroing
+ * (but objects are not zerod on reuse from cache).
+ */
+void *
+objcache_malloc_alloc_zero(void *allocator_args, int ocflags)
+{
+       struct objcache_malloc_args *alloc_args = allocator_args;
+
+       return (kmalloc(alloc_args->objsize, alloc_args->mtype,
+                      (ocflags & OC_MFLAGS) | M_ZERO));
+}
+
+
 void
 objcache_malloc_free(void *obj, void *allocator_args)
 {
index 92f28ae..cc3c8c2 100644 (file)
@@ -91,6 +91,7 @@ struct objcache_malloc_args {
 #ifdef _KERNEL
 
 void   *objcache_malloc_alloc(void *allocator_args, int ocflags);
+void   *objcache_malloc_alloc_zero(void *allocator_args, int ocflags);
 void    objcache_malloc_free(void *obj, void *allocator_args);
 
 void   *objcache_nop_alloc(void *allocator_args, int ocflags);