<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<meta content="text/html; charset=UTF-8">
<style type="text/css" style="">
<!--
p
        {margin-top:0;
        margin-bottom:0}
-->
</style>
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:#000000; font-family:Calibri,Arial,Helvetica,sans-serif">
<p>Reviewed-by: Ken Wang <Qingqing.Wang@amd.com><br>
</p>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>发件人:</b> amd-gfx <amd-gfx-bounces@lists.freedesktop.org> 代表 Chunming Zhou <David1.Zhou@amd.com><br>
<b>发送时间:</b> 2017年4月7日 11:36:18<br>
<b>收件人:</b> amd-gfx@lists.freedesktop.org; Wang, Ken<br>
<b>抄送:</b> Zhou, David(ChunMing)<br>
<b>主题:</b> [PATCH] drm/amdgpu: fix memory leak in wait_all_fence</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">Change-Id: Ib3e271e00e49f10152c1b3eace981a6bf78820de<br>
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 25 +++++++++++++++++++------<br>
 1 file changed, 19 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c<br>
index de1c4c3..d842452 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c<br>
@@ -1216,22 +1216,28 @@ static int amdgpu_cs_wait_all_fences(struct amdgpu_device *adev,<br>
                                      struct drm_amdgpu_fence *fences)<br>
 {<br>
         uint32_t fence_count = wait->in.fence_count;<br>
+       struct fence **array;<br>
         unsigned int i;<br>
         long r = 1;<br>
 <br>
+       array = kcalloc(fence_count, sizeof(struct fence *), GFP_KERNEL);<br>
+<br>
+       if (array == NULL)<br>
+               return -ENOMEM;<br>
         for (i = 0; i < fence_count; i++) {<br>
                 struct fence *fence;<br>
                 unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout_ns);<br>
 <br>
                 fence = amdgpu_cs_get_fence(adev, filp, &fences[i]);<br>
-               if (IS_ERR(fence))<br>
-                       return PTR_ERR(fence);<br>
-               else if (!fence)<br>
+               if (IS_ERR(fence)) {<br>
+                       r = PTR_ERR(fence);<br>
+                       goto err;<br>
+               } else if (!fence)<br>
                         continue;<br>
-<br>
+               array[i] = fence;<br>
                 r = kcl_fence_wait_timeout(fence, true, timeout);<br>
                 if (r < 0)<br>
-                       return r;<br>
+                       goto err;<br>
 <br>
                 if (r == 0)<br>
                         break;<br>
@@ -1240,7 +1246,14 @@ static int amdgpu_cs_wait_all_fences(struct amdgpu_device *adev,<br>
         memset(wait, 0, sizeof(*wait));<br>
         wait->out.status = (r > 0);<br>
 <br>
-       return 0;<br>
+       r = 0;<br>
+<br>
+err:<br>
+       for (i = 0; i < fence_count; i++)<br>
+               fence_put(array[i]);<br>
+       kfree(array);<br>
+<br>
+       return r;<br>
 }<br>
 <br>
 /**<br>
-- <br>
1.9.1<br>
<br>
_______________________________________________<br>
amd-gfx mailing list<br>
amd-gfx@lists.freedesktop.org<br>
<a href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a><br>
</div>
</span></font>
</body>
</html>