[Mesa-dev] [PATCH 01/15] ralloc: don't memset ralloc_header, clear it manually

Marek Olšák maraeo at gmail.com
Sat Oct 8 10:58:25 UTC 2016


From: Marek Olšák <marek.olsak at amd.com>

time GALLIUM_NOOP=1 ./run shaders/private/alien_isolation/ >/dev/null

Before (2 takes):

real    0m8.734s    0m8.773s
user    0m34.232s   0m34.348s
sys     0m0.084s    0m0.056s

After (2 takes):

real    0m8.448s    0m8.463s
user    0m33.104s   0m33.160s
sys     0m0.088s    0m0.076s

Average change in "real" time spent: -3.4%

calloc should only do 2 things compared to malloc:
- check for overflow of "n * size"
- call memset

I'm not sure if that explains the difference.
---
 src/util/ralloc.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/util/ralloc.c b/src/util/ralloc.c
index 9526011..23c89e5 100644
--- a/src/util/ralloc.c
+++ b/src/util/ralloc.c
@@ -91,20 +91,23 @@ get_header(const void *ptr)
 static void
 add_child(ralloc_header *parent, ralloc_header *info)
 {
    if (parent != NULL) {
       info->parent = parent;
       info->next = parent->child;
       parent->child = info;
 
       if (info->next != NULL)
 	 info->next->prev = info;
+   } else {
+      info->parent = NULL;
+      info->next = NULL;
    }
 }
 
 void *
 ralloc_context(const void *ctx)
 {
    return ralloc_size(ctx, 0);
 }
 
 void *
@@ -115,27 +118,39 @@ ralloc_size(const void *ctx, size_t size)
     *
     * TODO: Make ralloc_size not zero fill memory, and cleanup any code that
     * should instead be using rzalloc.
     */
    return rzalloc_size(ctx, size);
 }
 
 void *
 rzalloc_size(const void *ctx, size_t size)
 {
-   void *block = calloc(1, size + sizeof(ralloc_header));
+   void *block = malloc(size + sizeof(ralloc_header));
    ralloc_header *info;
    ralloc_header *parent;
 
    if (unlikely(block == NULL))
       return NULL;
+
    info = (ralloc_header *) block;
+   /* measurements have shown that calloc is slower, so clear things
+    * manually
+    */
+   info->child = NULL;
+   info->prev = NULL;
+   info->destructor = NULL;
+   /* add_child() clears other members */
+
+   /* memset the allocation except for ralloc_header */
+   memset(&info[1], 0, size);
+
    parent = ctx != NULL ? get_header(ctx) : NULL;
 
    add_child(parent, info);
 
 #ifdef DEBUG
    info->canary = CANARY;
 #endif
 
    return PTR_FROM_HEADER(info);
 }
-- 
2.7.4



More information about the mesa-dev mailing list