winsys/amdgpu: use pipe_reference for amdgpu_ctx refcounting

this is the standard utility for refcounting

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26643>
This commit is contained in:
Marek Olšák
2023-12-21 03:05:17 -05:00
committed by Marge Bot
parent 33980355d4
commit 7ccdcae4b5
2 changed files with 16 additions and 11 deletions

View File

@@ -23,13 +23,12 @@ amdgpu_fence_create(struct amdgpu_cs *cs)
fence->reference.count = 1;
fence->ws = ctx->ws;
fence->ctx = ctx;
amdgpu_ctx_reference(&fence->ctx, ctx);
fence->fence.context = ctx->ctx;
fence->fence.ip_type = cs->ip_type;
util_queue_fence_init(&fence->submitted);
util_queue_fence_reset(&fence->submitted);
fence->queue_index = cs->queue_index;
p_atomic_inc(&ctx->refcount);
return (struct pipe_fence_handle *)fence;
}
@@ -287,7 +286,7 @@ static struct radeon_winsys_ctx *amdgpu_ctx_create(struct radeon_winsys *ws,
return NULL;
ctx->ws = amdgpu_winsys(ws);
ctx->refcount = 1;
ctx->reference.count = 1;
ctx->allow_context_lost = allow_context_lost;
r = amdgpu_cs_ctx_create2(ctx->ws->dev, amdgpu_priority, &ctx->ctx);
@@ -328,7 +327,9 @@ error_create:
static void amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx)
{
amdgpu_ctx_unref((struct amdgpu_ctx*)rwctx);
struct amdgpu_ctx *ctx = (struct amdgpu_ctx*)rwctx;
amdgpu_ctx_reference(&ctx, NULL);
}
static void amdgpu_pad_gfx_compute_ib(struct amdgpu_winsys *ws, enum amd_ip_type ip_type,

View File

@@ -19,11 +19,11 @@
#define IB_MAX_SUBMIT_DWORDS (20 * 1024)
struct amdgpu_ctx {
struct pipe_reference reference;
struct amdgpu_winsys *ws;
amdgpu_context_handle ctx;
amdgpu_bo_handle user_fence_bo;
uint64_t *user_fence_cpu_address_base;
int refcount;
/* If true, report lost contexts and skip command submission.
* If false, terminate the process.
@@ -178,13 +178,17 @@ static inline bool amdgpu_fence_is_syncobj(struct amdgpu_fence *fence)
return fence->ctx == NULL;
}
static inline void amdgpu_ctx_unref(struct amdgpu_ctx *ctx)
static inline void amdgpu_ctx_reference(struct amdgpu_ctx **dst, struct amdgpu_ctx *src)
{
if (p_atomic_dec_zero(&ctx->refcount)) {
amdgpu_cs_ctx_free(ctx->ctx);
amdgpu_bo_free(ctx->user_fence_bo);
FREE(ctx);
struct amdgpu_ctx *old_dst = *dst;
if (pipe_reference(old_dst ? &old_dst->reference : NULL,
src ? &src->reference : NULL)) {
amdgpu_cs_ctx_free(old_dst->ctx);
amdgpu_bo_free(old_dst->user_fence_bo);
FREE(old_dst);
}
*dst = src;
}
static inline void amdgpu_fence_reference(struct pipe_fence_handle **dst,
@@ -199,7 +203,7 @@ static inline void amdgpu_fence_reference(struct pipe_fence_handle **dst,
if (amdgpu_fence_is_syncobj(fence))
amdgpu_cs_destroy_syncobj(fence->ws->dev, fence->syncobj);
else
amdgpu_ctx_unref(fence->ctx);
amdgpu_ctx_reference(&fence->ctx, NULL);
util_queue_fence_destroy(&fence->submitted);
FREE(fence);