<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">Reviewed-by: Neha Bhende <bhenden@vmware.com></span></font><br>
</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<div id="Signature">
<div id="divtagdefaultwrapper" style="font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: Calibri, Arial, Helvetica, sans-serif, "EmojiFont", "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<p>Regards,</p>
<p>Neha<br>
</p>
</div>
</div>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Brian Paul <brianp@vmware.com><br>
<b>Sent:</b> Tuesday, October 9, 2018 8:06:26 AM<br>
<b>To:</b> mesa-dev@lists.freedesktop.org<br>
<b>Cc:</b> Charmaine Lee; Neha Bhende<br>
<b>Subject:</b> [PATCH] svga: change svga_destroy_shader_variant() to return void</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">svga_destroy_shader_variant() itself flushes and retries the command<br>
if there's a failure. So no need for the callers to do it. Other<br>
callers of the function were already ignoring the return value.<br>
<br>
This also fixes a corner-case double-free reported by Coverity<br>
(and reported by Dave Airlie).<br>
<br>
Tested with various OpenGL apps.<br>
---<br>
src/gallium/drivers/svga/svga_pipe_fs.c | 7 +------<br>
src/gallium/drivers/svga/svga_pipe_gs.c | 8 +-------<br>
src/gallium/drivers/svga/svga_pipe_vs.c | 7 +------<br>
src/gallium/drivers/svga/svga_shader.c | 5 ++---<br>
src/gallium/drivers/svga/svga_shader.h | 2 +-<br>
5 files changed, 6 insertions(+), 23 deletions(-)<br>
<br>
diff --git a/src/gallium/drivers/svga/svga_pipe_fs.c b/src/gallium/drivers/svga/svga_pipe_fs.c<br>
index aadfb1a..52366f0 100644<br>
--- a/src/gallium/drivers/svga/svga_pipe_fs.c<br>
+++ b/src/gallium/drivers/svga/svga_pipe_fs.c<br>
@@ -108,12 +108,7 @@ svga_delete_fs_state(struct pipe_context *pipe, void *shader)<br>
svga->state.hw_draw.fs = NULL;<br>
}<br>
<br>
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);<br>
- if (ret != PIPE_OK) {<br>
- svga_context_flush(svga, NULL);<br>
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);<br>
- assert(ret == PIPE_OK);<br>
- }<br>
+ svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);<br>
}<br>
<br>
FREE((void *)fs->base.tokens);<br>
diff --git a/src/gallium/drivers/svga/svga_pipe_gs.c b/src/gallium/drivers/svga/svga_pipe_gs.c<br>
index 2fe5477..cee92a0 100644<br>
--- a/src/gallium/drivers/svga/svga_pipe_gs.c<br>
+++ b/src/gallium/drivers/svga/svga_pipe_gs.c<br>
@@ -120,13 +120,7 @@ svga_delete_gs_state(struct pipe_context *pipe, void *shader)<br>
svga->state.hw_draw.gs = NULL;<br>
}<br>
<br>
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);<br>
- if (ret != PIPE_OK) {<br>
- svga_context_flush(svga, NULL);<br>
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS,<br>
- variant);<br>
- assert(ret == PIPE_OK);<br>
- }<br>
+ svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);<br>
}<br>
<br>
FREE((void *)gs->base.tokens);<br>
diff --git a/src/gallium/drivers/svga/svga_pipe_vs.c b/src/gallium/drivers/svga/svga_pipe_vs.c<br>
index ba87cb4..3b6d2e9 100644<br>
--- a/src/gallium/drivers/svga/svga_pipe_vs.c<br>
+++ b/src/gallium/drivers/svga/svga_pipe_vs.c<br>
@@ -199,12 +199,7 @@ svga_delete_vs_state(struct pipe_context *pipe, void *shader)<br>
svga->state.hw_draw.vs = NULL;<br>
}<br>
<br>
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);<br>
- if (ret != PIPE_OK) {<br>
- svga_context_flush(svga, NULL);<br>
- ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);<br>
- assert(ret == PIPE_OK);<br>
- }<br>
+ svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);<br>
}<br>
<br>
FREE((void *)vs->base.tokens);<br>
diff --git a/src/gallium/drivers/svga/svga_shader.c b/src/gallium/drivers/svga/svga_shader.c<br>
index 7a0bb3d..22e4498 100644<br>
--- a/src/gallium/drivers/svga/svga_shader.c<br>
+++ b/src/gallium/drivers/svga/svga_shader.c<br>
@@ -541,7 +541,7 @@ svga_new_shader_variant(struct svga_context *svga)<br>
}<br>
<br>
<br>
-enum pipe_error<br>
+void<br>
svga_destroy_shader_variant(struct svga_context *svga,<br>
SVGA3dShaderType type,<br>
struct svga_shader_variant *variant)<br>
@@ -557,6 +557,7 @@ svga_destroy_shader_variant(struct svga_context *svga,<br>
/* flush and try again */<br>
svga_context_flush(svga, NULL);<br>
ret = SVGA3D_vgpu10_DestroyShader(svga->swc, variant->id);<br>
+ assert(ret == PIPE_OK);<br>
}<br>
util_bitmask_clear(svga->shader_id_bm, variant->id);<br>
}<br>
@@ -583,8 +584,6 @@ svga_destroy_shader_variant(struct svga_context *svga,<br>
FREE(variant);<br>
<br>
svga->hud.num_shaders--;<br>
-<br>
- return ret;<br>
}<br>
<br>
/*<br>
diff --git a/src/gallium/drivers/svga/svga_shader.h b/src/gallium/drivers/svga/svga_shader.h<br>
index b80cf18..68991e7 100644<br>
--- a/src/gallium/drivers/svga/svga_shader.h<br>
+++ b/src/gallium/drivers/svga/svga_shader.h<br>
@@ -285,7 +285,7 @@ svga_set_shader(struct svga_context *svga,<br>
struct svga_shader_variant *<br>
svga_new_shader_variant(struct svga_context *svga);<br>
<br>
-enum pipe_error<br>
+void<br>
svga_destroy_shader_variant(struct svga_context *svga,<br>
SVGA3dShaderType type,<br>
struct svga_shader_variant *variant);<br>
-- <br>
2.7.4<br>
<br>
</div>
</span></font></div>
</body>
</html>