diff options
author | Yiwei Zhang <zzyiwei@chromium.org> | 2023-12-24 19:36:49 -0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-01-02 21:16:45 +0000 |
commit | 944c8ca91e937ac16470b4c22db67faa4e705ade (patch) | |
tree | a8a1a441cde6d6315d9ad2f46821a9860b022db8 | |
parent | 3cedc62603c5f737a2d2eed8d4082d959ffa9110 (diff) |
vkr: lock decoder object look up
Fixes: e68b2c64 ("vkr: relax ctx lock for the rest of resource create")
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1319>
-rw-r--r-- | src/venus/vkr_context.c | 2 | ||||
-rw-r--r-- | src/venus/vkr_context.h | 3 | ||||
-rw-r--r-- | src/venus/vkr_cs.c | 9 | ||||
-rw-r--r-- | src/venus/vkr_cs.h | 7 | ||||
-rw-r--r-- | src/venus/vkr_ring.c | 2 |
5 files changed, 12 insertions, 11 deletions
diff --git a/src/venus/vkr_context.c b/src/venus/vkr_context.c index c6088df..ea481ab 100644 --- a/src/venus/vkr_context.c +++ b/src/venus/vkr_context.c @@ -677,7 +677,7 @@ vkr_context_create(uint32_t ctx_id, if (!ctx->resource_table) goto err_ctx_resource_table; - if (vkr_cs_decoder_init(&ctx->decoder, &ctx->cs_fatal_error, ctx->object_table)) + if (vkr_cs_decoder_init(&ctx->decoder, ctx)) goto err_cs_decoder_init; if (vkr_cs_encoder_init(&ctx->encoder, &ctx->cs_fatal_error)) diff --git a/src/venus/vkr_context.h b/src/venus/vkr_context.h index ef4b34d..b60e1c1 100644 --- a/src/venus/vkr_context.h +++ b/src/venus/vkr_context.h @@ -238,8 +238,9 @@ vkr_context_get_object(struct vkr_context *ctx, vkr_object_id obj_id) { mtx_lock(&ctx->object_mutex); const struct hash_entry *entry = _mesa_hash_table_search(ctx->object_table, &obj_id); + void *obj = likely(entry) ? entry->data : NULL; mtx_unlock(&ctx->object_mutex); - return likely(entry) ? entry->data : NULL; + return obj; } void diff --git a/src/venus/vkr_cs.c b/src/venus/vkr_cs.c index 2ebab0c..64ebe86 100644 --- a/src/venus/vkr_cs.c +++ b/src/venus/vkr_cs.c @@ -50,13 +50,12 @@ vkr_cs_encoder_seek_stream_locked(struct vkr_cs_encoder *enc, size_t pos) } int -vkr_cs_decoder_init(struct vkr_cs_decoder *dec, - bool *fatal_error, - const struct hash_table *object_table) +vkr_cs_decoder_init(struct vkr_cs_decoder *dec, struct vkr_context *ctx) { memset(dec, 0, sizeof(*dec)); - dec->fatal_error = fatal_error; - dec->object_table = object_table; + dec->fatal_error = &ctx->cs_fatal_error; + dec->object_table = ctx->object_table; + dec->object_mutex = &ctx->object_mutex; return mtx_init(&dec->mutex, mtx_plain); } diff --git a/src/venus/vkr_cs.h b/src/venus/vkr_cs.h index 3518169..dba62e2 100644 --- a/src/venus/vkr_cs.h +++ b/src/venus/vkr_cs.h @@ -61,6 +61,7 @@ struct vkr_cs_decoder_temp_pool { struct vkr_cs_decoder { const struct hash_table *object_table; + mtx_t *object_mutex; bool *fatal_error; struct vkr_cs_decoder_temp_pool temp_pool; @@ -169,9 +170,7 @@ vkr_cs_encoder_write(struct vkr_cs_encoder *enc, } int -vkr_cs_decoder_init(struct vkr_cs_decoder *dec, - bool *fatal_error, - const struct hash_table *object_table); +vkr_cs_decoder_init(struct vkr_cs_decoder *dec, struct vkr_context *ctx); void vkr_cs_decoder_fini(struct vkr_cs_decoder *dec); @@ -280,9 +279,11 @@ vkr_cs_decoder_lookup_object(const struct vkr_cs_decoder *dec, if (!id) return NULL; + mtx_lock(dec->object_mutex); const struct hash_entry *entry = _mesa_hash_table_search((struct hash_table *)dec->object_table, &id); obj = likely(entry) ? entry->data : NULL; + mtx_unlock(dec->object_mutex); if (unlikely(!obj || obj->type != type)) { if (obj) vkr_log("object %" PRIu64 " has type %d, not %d", id, obj->type, type); diff --git a/src/venus/vkr_ring.c b/src/venus/vkr_ring.c index c672c22..6ee3b18 100644 --- a/src/venus/vkr_ring.c +++ b/src/venus/vkr_ring.c @@ -128,7 +128,7 @@ vkr_ring_create(const struct vkr_ring_layout *layout, if (!ring->cmd) goto err_cmd_malloc; - if (vkr_cs_decoder_init(&ring->decoder, &ctx->cs_fatal_error, ctx->object_table)) + if (vkr_cs_decoder_init(&ring->decoder, ctx)) goto err_cs_decoder_init; if (vkr_cs_encoder_init(&ring->encoder, &ctx->cs_fatal_error)) |