From 30f1782a460e2f599d6a2a10f7435dd7d6409ae0 Mon Sep 17 00:00:00 2001
From: Avi Kivity <avi@cloudius-systems.com>
Date: Tue, 13 Aug 2013 18:08:26 +0300
Subject: [PATCH] uma: allocate refcounts only if explicitly requested

Wastes memory, esp. with power-of-two allocations.
---
 bsd/porting/uma_stub.cc | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/bsd/porting/uma_stub.cc b/bsd/porting/uma_stub.cc
index a364f1d77..d16b336c3 100644
--- a/bsd/porting/uma_stub.cc
+++ b/bsd/porting/uma_stub.cc
@@ -31,9 +31,13 @@ void * uma_zalloc_arg(uma_zone_t zone, void *udata, int flags)
     }
 
     if (!ptr) {
-        ptr = malloc(zone->uz_size + UMA_ITEM_HDR_LEN);
+        auto size = zone->uz_size;
+        if (zone->uz_flags & UMA_ZONE_REFCNT) {
+            size += UMA_ITEM_HDR_LEN;
+        }
+        ptr = malloc(size);
 
-        bzero(ptr, zone->uz_size + UMA_ITEM_HDR_LEN);
+        bzero(ptr, zone->uz_size);
 
         // Call init
         if (zone->uz_init != NULL) {
@@ -56,7 +60,9 @@ void * uma_zalloc_arg(uma_zone_t zone, void *udata, int flags)
         bzero(ptr, zone->uz_size);
     }
 
-    UMA_ITEM_HDR(zone, ptr)->refcnt = 1;
+    if (zone->uz_flags & UMA_ZONE_REFCNT) {
+        UMA_ITEM_HDR(zone, ptr)->refcnt = 1;
+    }
 
     return (ptr);
 }
@@ -122,10 +128,10 @@ uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor,
     z->uz_init = uminit;
     z->uz_fini = fini;
     z->master = NULL;
+    z->uz_flags = flags;
 
     /* Do we need align and flags?
     args.align = align;
-    args.flags = flags;
     args.keg = NULL;
     */
 
@@ -144,6 +150,7 @@ uma_zone_t uma_zsecond_create(char *name, uma_ctor ctor, uma_dtor dtor,
     z->uz_init = zinit;
     z->uz_fini = zfini;
     z->master = master;
+    z->uz_flags = master->uz_flags;
 
     return (z);
 }
-- 
GitLab