Mesa (staging/20.1): gallium/util: Fix leak in the live shader cache

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 13 12:45:23 UTC 2020


Module: Mesa
Branch: staging/20.1
Commit: 5c0738f96795eac731549c4f3b694b0cafe87af1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5c0738f96795eac731549c4f3b694b0cafe87af1

Author: Axel Davy <davyaxel0 at gmail.com>
Date:   Sun May 10 20:12:56 2020 +0200

gallium/util: Fix leak in the live shader cache

When the nir backend is used, the create_shader
call is supposed to release state->ir.nir.
When the cache hits, create_shader is not called,
thus state->ir.nir should be freed.

There is nothing to be done for the TGSI case as the
tokens release is done by the caller.

This fixes a leak noticed in:
https://gitlab.freedesktop.org/mesa/mesa/-/issues/2931

Fixes: 4bb919b0b8b4ed6f6a7049c3f8d294b74b50e198

Signed-off-by: Axel Davy <davyaxel0 at gmail.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4980>
(cherry picked from commit 47bfc799da61aadd60ef9cc5c4bf0651c519cc77)

---

 .pick_status.json                                | 2 +-
 src/gallium/auxiliary/util/u_live_shader_cache.c | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 720636a7d89..c8ac22c1635 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -634,7 +634,7 @@
         "description": "gallium/util: Fix leak in the live shader cache",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": "4bb919b0b8b4ed6f6a7049c3f8d294b74b50e198"
     },
diff --git a/src/gallium/auxiliary/util/u_live_shader_cache.c b/src/gallium/auxiliary/util/u_live_shader_cache.c
index a32c3748257..15f387b4931 100644
--- a/src/gallium/auxiliary/util/u_live_shader_cache.c
+++ b/src/gallium/auxiliary/util/u_live_shader_cache.c
@@ -129,8 +129,11 @@ util_live_shader_cache_get(struct pipe_context *ctx,
       *cache_hit = (shader != NULL);
 
    /* Return if the shader already exists. */
-   if (shader)
+   if (shader) {
+      if (state->type == PIPE_SHADER_IR_NIR)
+          ralloc_free(state->ir.nir);
       return shader;
+   }
 
    /* The cache mutex is unlocked to allow multiple create_shader
     * invocations to run simultaneously.



More information about the mesa-commit mailing list