Mesa (main): panvk: Fix allocation of BOs bigger than the slab size

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Oct 4 12:32:31 UTC 2021


Module: Mesa
Branch: main
Commit: 8acc8f6a0e1eb3d02f08403ccdb01af833845dd2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8acc8f6a0e1eb3d02f08403ccdb01af833845dd2

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Fri Oct  1 09:11:42 2021 +0200

panvk: Fix allocation of BOs bigger than the slab size

We can pick a BO from the pool if the BO size exceeds the pool size. In
that case, allocate a BO and save it in a separate array so we can free
it when the memory pool is reset or released.

Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13136>

---

 src/panfrost/vulkan/panvk_mempool.c | 13 +++++++++++--
 src/panfrost/vulkan/panvk_mempool.h |  1 +
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/panfrost/vulkan/panvk_mempool.c b/src/panfrost/vulkan/panvk_mempool.c
index a58408794c2..b1503afb47b 100644
--- a/src/panfrost/vulkan/panvk_mempool.c
+++ b/src/panfrost/vulkan/panvk_mempool.c
@@ -46,7 +46,7 @@ panvk_pool_alloc_backing(struct panvk_pool *pool, size_t bo_sz)
    struct panfrost_bo *bo;
 
    /* If there's a free BO in our BO pool, let's pick it. */
-   if (pool->bo_pool &&
+   if (pool->bo_pool && bo_sz == pool->base.slab_size &&
        util_dynarray_num_elements(&pool->bo_pool->free_bos, struct panfrost_bo *)) {
       bo = util_dynarray_pop(&pool->bo_pool->free_bos, struct panfrost_bo *);
    } else {
@@ -61,7 +61,10 @@ panvk_pool_alloc_backing(struct panvk_pool *pool, size_t bo_sz)
                               pool->base.label);
    }
 
-   util_dynarray_append(&pool->bos, struct panfrost_bo *, bo);
+   if (bo->size == pool->base.slab_size)
+      util_dynarray_append(&pool->bos, struct panfrost_bo *, bo);
+   else
+      util_dynarray_append(&pool->big_bos, struct panfrost_bo *, bo);
    pool->transient_bo = bo;
    pool->transient_offset = 0;
 
@@ -107,6 +110,7 @@ panvk_pool_init(struct panvk_pool *pool,
    pool->bo_pool = bo_pool;
 
    util_dynarray_init(&pool->bos, NULL);
+   util_dynarray_init(&pool->big_bos, NULL);
 
    if (prealloc)
       panvk_pool_alloc_backing(pool, pool->base.slab_size);
@@ -126,7 +130,11 @@ panvk_pool_reset(struct panvk_pool *pool)
          panfrost_bo_unreference(*bo);
    }
 
+   util_dynarray_foreach(&pool->big_bos, struct panfrost_bo *, bo)
+      panfrost_bo_unreference(*bo);
+
    util_dynarray_clear(&pool->bos);
+   util_dynarray_clear(&pool->big_bos);
    pool->transient_bo = NULL;
 }
 
@@ -135,6 +143,7 @@ panvk_pool_cleanup(struct panvk_pool *pool)
 {
    panvk_pool_reset(pool);
    util_dynarray_fini(&pool->bos);
+   util_dynarray_fini(&pool->big_bos);
 }
 
 void
diff --git a/src/panfrost/vulkan/panvk_mempool.h b/src/panfrost/vulkan/panvk_mempool.h
index b56c240ca57..a1656053de2 100644
--- a/src/panfrost/vulkan/panvk_mempool.h
+++ b/src/panfrost/vulkan/panvk_mempool.h
@@ -57,6 +57,7 @@ struct panvk_pool {
 
    /* BOs allocated by this pool */
    struct util_dynarray bos;
+   struct util_dynarray big_bos;
 
    /* Current transient BO */
    struct panfrost_bo *transient_bo;



More information about the mesa-commit mailing list