From c33cf960ce86c01b1ecadc47782b7451bdc36852 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Thu, 7 Aug 2025 20:29:50 +0200 Subject: [PATCH] zink: fix data race in descriptor_util_pool_key_get Two threads could end up creating a pool_key for the same hash and end up overwriting the earlier one. Fixes flaky image kernel_read_write CL CTS tests. Cc: mesa-stable Part-of: (cherry picked from commit 9d8c95f8d3da34a5515df29403fde3a828c1ae52) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_descriptors.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index cea1856cc30..fed0b0ec659 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -5644,7 +5644,7 @@ "description": "zink: fix data race in descriptor_util_pool_key_get", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 5b8e096fcbb..3bf3a6c9b6e 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -202,9 +202,10 @@ descriptor_util_pool_key_get(struct zink_screen *screen, enum zink_descriptor_ty hash = hash_descriptor_pool_key(&key); simple_mtx_lock(&screen->desc_pool_keys_lock); struct set_entry *he = _mesa_set_search_pre_hashed(&screen->desc_pool_keys[type], hash, &key); - simple_mtx_unlock(&screen->desc_pool_keys_lock); - if (he) + if (he) { + simple_mtx_unlock(&screen->desc_pool_keys_lock); return (void*)he->key; + } } struct zink_descriptor_pool_key *pool_key = rzalloc(screen, struct zink_descriptor_pool_key); @@ -213,7 +214,6 @@ descriptor_util_pool_key_get(struct zink_screen *screen, enum zink_descriptor_ty assert(pool_key->num_type_sizes); memcpy(pool_key->sizes, sizes, num_type_sizes * sizeof(VkDescriptorPoolSize)); if (type != ZINK_DESCRIPTOR_TYPE_UNIFORMS) { - simple_mtx_lock(&screen->desc_pool_keys_lock); _mesa_set_add_pre_hashed(&screen->desc_pool_keys[type], hash, pool_key); pool_key->id = screen->desc_pool_keys[type].entries - 1; simple_mtx_unlock(&screen->desc_pool_keys_lock);