Revert to zero'ing the objects we pull out of our objcaches ourselves.
authorThomas E. Spanjaard <tgen@dragonflybsd.org>
Thu, 7 Dec 2006 12:47:24 +0000 (12:47 +0000)
committerThomas E. Spanjaard <tgen@dragonflybsd.org>
Thu, 7 Dec 2006 12:47:24 +0000 (12:47 +0000)
Having it done by objcache_get() incurs too much of a penalty on the hot
path of it, that it isn't warranted, especially considering the fact that
pulling zero'ed objects out of it isn't taking advantage of the objcache
model. However, there are arguments for using it, like growability in
interrupt context (zones can't).

sys/dev/disk/nata/ata-all.c
sys/dev/disk/nata/ata-all.h

index 3a161ef..154a3e6 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-all.c,v 1.273 2006/05/12 05:04:40 jhb Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-all.c,v 1.1 2006/12/04 14:40:37 tgen Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-all.c,v 1.2 2006/12/07 12:47:24 tgen Exp $
  */
 
 #include "opt_ata.h"
@@ -75,6 +75,10 @@ struct intr_config_hook *ata_delayed_attach = NULL;
 devclass_t ata_devclass;
 struct objcache *ata_request_cache;
 struct objcache *ata_composite_cache;
+struct objcache_malloc_args ata_request_malloc_args = {
+       sizeof(struct ata_request), M_ATA };
+struct objcache_malloc_args ata_composite_malloc_args = {
+       sizeof(struct ata_composite), M_ATA };
 int ata_wc = 1;
 
 /* local vars */
@@ -1029,13 +1033,47 @@ static moduledata_t ata_moduledata = { "ata", ata_module_event_handler, NULL };
 DECLARE_MODULE(ata, ata_moduledata, SI_SUB_CONFIGURE, SI_ORDER_SECOND);
 MODULE_VERSION(ata, 1);
 
+/*
+ * Construct a completely zero'ed ata_request. On objcache_put(), an
+ * ata_request object is also zero'ed, so objcache_get() is guaranteed to give
+ * completely zero'ed objects without spending too much time.
+ */
+static boolean_t
+ata_request_cache_ctor(void *obj, void *private, int ocflags)
+{
+    struct ata_request *arp = obj;
+
+    bzero(arp, sizeof(struct ata_request));
+    return(TRUE);
+}
+
+/*
+ * Construct a completely zero'ed ata_composite. On objcache_put(), an
+ * ata_composite object is also zero'ed, so objcache_get() is guaranteed to give
+ * completely zero'ed objects without spending too much time.
+ */
+static boolean_t
+ata_composite_cache_ctor(void *obj, void *private, int ocflags)
+{
+    struct ata_composite *acp = obj;
+
+    bzero(acp, sizeof(struct ata_composite));
+    return(TRUE);
+}
+
 static void
 ata_init(void)
 {
-    ata_request_cache = objcache_create_simple(M_ATA,
-                                              sizeof(struct ata_request));
-    ata_composite_cache = objcache_create_simple(M_ATA,
-                                                sizeof(struct ata_composite));
+    ata_request_cache = objcache_create("ata_request", 0, 0,
+                                       ata_request_cache_ctor, NULL, NULL,
+                                       objcache_malloc_alloc,
+                                       objcache_malloc_free,
+                                       &ata_request_malloc_args);
+    ata_composite_cache = objcache_create("ata_composite", 0, 0,
+                                         ata_composite_cache_ctor, NULL, NULL,
+                                         objcache_malloc_alloc,
+                                         objcache_malloc_free,
+                                         &ata_composite_malloc_args);
 }
 SYSINIT(ata_register, SI_SUB_DRIVERS, SI_ORDER_SECOND, ata_init, NULL);
 
index 5a0ed76..0a77169 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-all.h,v 1.118 2006/06/28 09:59:09 sos Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-all.h,v 1.2 2006/12/04 15:15:54 tgen Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-all.h,v 1.3 2006/12/07 12:47:24 tgen Exp $
  */
 
 #include <sys/param.h>
@@ -551,17 +551,22 @@ int ata_generic_command(struct ata_request *request);
 
 /* macros for alloc/free of struct ata_request */
 extern struct objcache *ata_request_cache;
-#define ata_alloc_request() objcache_get(ata_request_cache, M_WAITOK | M_ZERO)
+#define ata_alloc_request() objcache_get(ata_request_cache, M_WAITOK)
+/* zero the object so objects in the cache are guaranteed to be zero'ed */
 #define ata_free_request(request) { \
-       if (!(request->flags & ATA_R_DANGER2)) \
+       if (!(request->flags & ATA_R_DANGER2)) { \
+           bzero(request, sizeof(struct ata_request)); \
            objcache_put(ata_request_cache, request); \
-       }
+       } \
+}
 /* macros for alloc/free of struct ata_composite */
 extern struct objcache *ata_composite_cache;
-#define ata_alloc_composite() objcache_get(ata_composite_cache, \
-                                          M_WAITOK | M_ZERO);
-#define ata_free_composite(composite) objcache_put(ata_composite_cache, \
-                                                  composite)
+#define ata_alloc_composite() objcache_get(ata_composite_cache, M_WAITOK)
+/* zero the object so objects in the cache are guaranteed to be zero'ed */
+#define ata_free_composite(composite) { \
+       bzero(composite, sizeof(struct ata_composite)); \
+       objcache_put(ata_composite_cache, composite); \
+}
 
 MALLOC_DECLARE(M_ATA);