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@collabora.com> Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13136>
This commit is contained in:
parent
4e58d30d98
commit
8acc8f6a0e
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue