From 8acc8f6a0e1eb3d02f08403ccdb01af833845dd2 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 1 Oct 2021 09:11:42 +0200 Subject: [PATCH] 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 Reviewed-by: Tomeu Vizoso Part-of: --- 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 a584087..b1503af 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 b56c240..a165605 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; -- 2.7.4