From d8e5624984eef95a33b95869b92bb5c3cd952d29 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 3 Mar 2022 12:16:33 -0500 Subject: [PATCH] zink: stop leaking descriptor sets when migrating a recycled set here, the set was previously invalid and in the recycled table, meaning it can be reused directly so long as it's first invalidated the previous code would instead pop a different set off the allocation array, leaking this one cc: mesa-stable Acked-by: Emma Anholt Reviewed-by: Dave Airlie Part-of: (cherry picked from commit d63f3c31b74f26217cc8f8be9baff91043cde85c) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_descriptors.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 03ef5e66120..96c440e25a7 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -454,7 +454,7 @@ "description": "zink: stop leaking descriptor sets", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 260aebbac21..87dca30105d 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -804,20 +804,28 @@ zink_descriptor_set_get(struct zink_context *ctx, simple_mtx_lock(&pool->mtx); if (last_set && last_set->hash == hash && desc_state_equal(&last_set->key, &key)) { + bool was_recycled = false; zds = last_set; *cache_hit = !zds->invalid; if (zds->recycled) { struct hash_entry *he = _mesa_hash_table_search_pre_hashed(pool->free_desc_sets, hash, &key); - if (he) + if (he) { + was_recycled = true; _mesa_hash_table_remove(pool->free_desc_sets, he); + } zds->recycled = false; } if (zds->invalid) { if (zink_batch_usage_exists(zds->batch_uses)) punt_invalid_set(zds, NULL); - else + else { + if (was_recycled) { + descriptor_set_invalidate(zds); + goto out; + } /* this set is guaranteed to be in pool->alloc_desc_sets */ goto skip_hash_tables; + } zds = NULL; } if (zds)