From: Rob Clark <robdcl...@chromium.org> I noticed slab_free() showing up at the top of perf results in gl_driver2, due to "streaming" GPU state objects, which are allocated and destroyed within a single draw call.
In this case, it is guaranteed that we free on the same child pool, from the same (only) thread accessing the child pool. So add a faster, but more restricted version of slab_free() to cut the overhead. Signed-off-by: Rob Clark <robdcl...@chromium.org> --- src/util/slab.c | 20 ++++++++++++++++++++ src/util/slab.h | 1 + 2 files changed, 21 insertions(+) diff --git a/src/util/slab.c b/src/util/slab.c index 62634034fdc..21076a80238 100644 --- a/src/util/slab.c +++ b/src/util/slab.c @@ -276,6 +276,26 @@ void slab_free(struct slab_child_pool *pool, void *ptr) } } +/** + * Similar to slab_free(), except that freeing an object in a different pool + * from the one it was allocated from is *not* allowed. + */ +void slab_free_fast(struct slab_child_pool *pool, void *ptr) +{ + struct slab_element_header *elt = ((struct slab_element_header*)ptr - 1); + + CHECK_MAGIC(elt, SLAB_MAGIC_ALLOCATED); + SET_MAGIC(elt, SLAB_MAGIC_FREE); + + assert(p_atomic_read(&elt->owner) == (intptr_t)pool); + + /* This is the simple case: The caller guarantees that we can safely + * access the free list. + */ + elt->next = pool->free; + pool->free = elt; +} + /** * Allocate an object from the slab. Single-threaded (no mutex). */ diff --git a/src/util/slab.h b/src/util/slab.h index 5a25adaf7f4..9748cd95858 100644 --- a/src/util/slab.h +++ b/src/util/slab.h @@ -78,6 +78,7 @@ void slab_create_child(struct slab_child_pool *pool, void slab_destroy_child(struct slab_child_pool *pool); void *slab_alloc(struct slab_child_pool *pool); void slab_free(struct slab_child_pool *pool, void *ptr); +void slab_free_fast(struct slab_child_pool *pool, void *ptr); struct slab_mempool { struct slab_parent_pool parent; -- 2.21.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev