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 <emma@anholt.net>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15226>
(cherry picked from commit d63f3c31b7)
This commit is contained in:
Mike Blumenkrantz 2022-03-03 12:16:33 -05:00 committed by Eric Engestrom
parent 3579041897
commit 3cca717bc1
2 changed files with 11 additions and 3 deletions

View file

@ -1642,7 +1642,7 @@
"description": "zink: stop leaking descriptor sets",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -790,20 +790,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)