freedreno: Protect gmem_cache ralloc allocations
Since the ralloc context for cache_key allocation is shared between all
the contexts hanging off a screen, we need to allocate the key under the
screen->lock.
Fixes: 91f9bb99c5e ("freedreno: add gmem state cache")
Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7342>
(cherry picked from commit cb034ae44f4a1f3ed036ba71fc42746efb4cd775)
diff --git a/.pick_status.json b/.pick_status.json
index 34ecce0..ae0013c 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1183,7 +1183,7 @@
"description": "freedreno: Protect gmem_cache ralloc allocations",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": "91f9bb99c5e0db38a1ac26dd9e6a967312f5e8b0"
},
diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c
index 04447ff..b97b41a 100644
--- a/src/gallium/drivers/freedreno/freedreno_gmem.c
+++ b/src/gallium/drivers/freedreno/freedreno_gmem.c
@@ -528,11 +528,15 @@
struct fd_screen *screen = batch->ctx->screen;
struct fd_gmem_cache *cache = &screen->gmem_cache;
struct fd_gmem_stateobj *gmem = NULL;
+
+ /* Lock before allocating gmem_key, since that a screen-wide
+ * ralloc pool and ralloc itself is not thread-safe.
+ */
+ fd_screen_lock(screen);
+
struct gmem_key *key = gmem_key_init(batch, assume_zs, no_scis_opt);
uint32_t hash = gmem_key_hash(key);
- fd_screen_lock(screen);
-
struct hash_entry *entry =
_mesa_hash_table_search_pre_hashed(cache->ht, hash, key);
if (entry) {