venus: make vn_renderer_shmem_pool thread-safe

This can be thread-safe only because we have dropped seeking command
stream offset, which requires comparing pool shmem to decide conditional
set stream.

This is to prepare for later sharing reply shmem pool across rings.

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26179>
This commit is contained in:
Yiwei Zhang 2023-11-07 20:05:36 -08:00 committed by Marge Bot
parent 0273c9cc03
commit 90e64564b8
4 changed files with 18 additions and 23 deletions

View file

@ -630,7 +630,6 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
instance->ring_idx_used_mask = 0x1;
mtx_init(&instance->physical_device.mutex, mtx_plain);
mtx_init(&instance->cs_shmem.mutex, mtx_plain);
mtx_init(&instance->ring_idx_mutex, mtx_plain);
if (!vn_icd_supports_api_version(
@ -650,7 +649,7 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
vn_cs_renderer_protocol_info_init(instance);
vn_renderer_shmem_pool_init(instance->renderer, &instance->cs_shmem.pool,
vn_renderer_shmem_pool_init(instance->renderer, &instance->cs_shmem_pool,
8u << 20);
vn_renderer_shmem_pool_init(instance->renderer,
@ -719,13 +718,12 @@ out_ring_fini:
out_shmem_pool_fini:
vn_renderer_shmem_pool_fini(instance->renderer,
&instance->reply_shmem_pool);
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem.pool);
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem_pool);
vn_renderer_destroy(instance->renderer, alloc);
out_mtx_destroy:
mtx_destroy(&instance->physical_device.mutex);
mtx_destroy(&instance->ring_idx_mutex);
mtx_destroy(&instance->cs_shmem.mutex);
vn_instance_base_fini(&instance->base);
vk_free(alloc, instance);
@ -761,8 +759,7 @@ vn_DestroyInstance(VkInstance _instance,
vn_renderer_shmem_pool_fini(instance->renderer,
&instance->reply_shmem_pool);
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem.pool);
mtx_destroy(&instance->cs_shmem.mutex);
vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem_pool);
vn_renderer_destroy(instance->renderer, alloc);

View file

@ -41,10 +41,7 @@ struct vn_instance {
struct vn_renderer *renderer;
/* for VN_CS_ENCODER_STORAGE_SHMEM_POOL */
struct {
mtx_t mutex;
struct vn_renderer_shmem_pool pool;
} cs_shmem;
struct vn_renderer_shmem_pool cs_shmem_pool;
struct vn_renderer_shmem_pool reply_shmem_pool;
@ -169,14 +166,8 @@ vn_instance_cs_shmem_alloc(struct vn_instance *instance,
size_t size,
size_t *out_offset)
{
struct vn_renderer_shmem *shmem;
mtx_lock(&instance->cs_shmem.mutex);
shmem = vn_renderer_shmem_pool_alloc(
instance->renderer, &instance->cs_shmem.pool, size, out_offset);
mtx_unlock(&instance->cs_shmem.mutex);
return shmem;
return vn_renderer_shmem_pool_alloc(
instance->renderer, &instance->cs_shmem_pool, size, out_offset);
}
static inline int

View file

@ -14,6 +14,7 @@ vn_renderer_shmem_pool_init(UNUSED struct vn_renderer *renderer,
/* power-of-two to hit shmem cache */
.min_alloc_size = util_next_power_of_two(min_alloc_size),
};
mtx_init(&pool->mutex, mtx_plain);
}
void
@ -22,12 +23,13 @@ vn_renderer_shmem_pool_fini(struct vn_renderer *renderer,
{
if (pool->shmem)
vn_renderer_shmem_unref(renderer, pool->shmem);
mtx_destroy(&pool->mutex);
}
static bool
vn_renderer_shmem_pool_grow(struct vn_renderer *renderer,
struct vn_renderer_shmem_pool *pool,
size_t size)
vn_renderer_shmem_pool_grow_locked(struct vn_renderer *renderer,
struct vn_renderer_shmem_pool *pool,
size_t size)
{
VN_TRACE_FUNC();
/* power-of-two to hit shmem cache */
@ -59,9 +61,12 @@ vn_renderer_shmem_pool_alloc(struct vn_renderer *renderer,
size_t size,
size_t *out_offset)
{
mtx_lock(&pool->mutex);
if (unlikely(size > pool->size - pool->used)) {
if (!vn_renderer_shmem_pool_grow(renderer, pool, size))
if (!vn_renderer_shmem_pool_grow_locked(renderer, pool, size)) {
mtx_unlock(&pool->mutex);
return NULL;
}
assert(size <= pool->size - pool->used);
}
@ -70,6 +75,7 @@ vn_renderer_shmem_pool_alloc(struct vn_renderer *renderer,
vn_renderer_shmem_ref(renderer, pool->shmem);
*out_offset = pool->used;
pool->used += size;
mtx_unlock(&pool->mutex);
return shmem;
}

View file

@ -8,8 +8,9 @@
#include "vn_renderer.h"
/* for suballocations of short-lived shmems, not thread-safe */
/* for suballocations of short-lived shmems, thread-safe */
struct vn_renderer_shmem_pool {
mtx_t mutex;
size_t min_alloc_size;
struct vn_renderer_shmem *shmem;