summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYiwei Zhang <zzyiwei@chromium.org>2023-12-24 19:36:49 -0800
committerMarge Bot <emma+marge@anholt.net>2024-01-02 21:16:45 +0000
commit944c8ca91e937ac16470b4c22db67faa4e705ade (patch)
treea8a1a441cde6d6315d9ad2f46821a9860b022db8
parent3cedc62603c5f737a2d2eed8d4082d959ffa9110 (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.c2
-rw-r--r--src/venus/vkr_context.h3
-rw-r--r--src/venus/vkr_cs.c9
-rw-r--r--src/venus/vkr_cs.h7
-rw-r--r--src/venus/vkr_ring.c2
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))