drm/amdgpu/psp: fix memory leak in terminate functions
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Apr 2022 20:51:00 +0000 (16:51 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 4 May 2022 13:55:02 +0000 (09:55 -0400)
Make sure we free the memory even if the unload fails.

Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c

index e9dc836..1ef2aba 100644 (file)
@@ -752,14 +752,12 @@ static int psp_tmr_terminate(struct psp_context *psp)
        void **pptr;
 
        ret = psp_tmr_unload(psp);
-       if (ret)
-               return ret;
 
        /* free TMR memory buffer */
        pptr = amdgpu_sriov_vf(psp->adev) ? &tmr_buf : NULL;
        amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, pptr);
 
-       return 0;
+       return ret;
 }
 
 int psp_get_fw_attestation_records_addr(struct psp_context *psp,
@@ -1101,15 +1099,13 @@ int psp_xgmi_terminate(struct psp_context *psp)
                return 0;
 
        ret = psp_ta_unload(psp, &psp->xgmi_context.context);
-       if (ret)
-               return ret;
 
        psp->xgmi_context.context.initialized = false;
 
        /* free xgmi shared memory */
        psp_ta_free_shared_buf(&psp->xgmi_context.context.mem_context);
 
-       return 0;
+       return ret;
 }
 
 int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta)
@@ -1466,15 +1462,13 @@ int psp_ras_terminate(struct psp_context *psp)
                return 0;
 
        ret = psp_ta_unload(psp, &psp->ras_context.context);
-       if (ret)
-               return ret;
 
        psp->ras_context.context.initialized = false;
 
        /* free ras shared memory */
        psp_ta_free_shared_buf(&psp->ras_context.context.mem_context);
 
-       return 0;
+       return ret;
 }
 
 static int psp_ras_initialize(struct psp_context *psp)
@@ -1657,15 +1651,15 @@ static int psp_hdcp_terminate(struct psp_context *psp)
                return 0;
 
        if (!psp->hdcp_context.context.initialized) {
-               if (psp->hdcp_context.context.mem_context.shared_buf)
+               if (psp->hdcp_context.context.mem_context.shared_buf) {
+                       ret = 0;
                        goto out;
-               else
+               } else {
                        return 0;
+               }
        }
 
        ret = psp_ta_unload(psp, &psp->hdcp_context.context);
-       if (ret)
-               return ret;
 
        psp->hdcp_context.context.initialized = false;
 
@@ -1673,7 +1667,7 @@ out:
        /* free hdcp shared memory */
        psp_ta_free_shared_buf(&psp->hdcp_context.context.mem_context);
 
-       return 0;
+       return ret;
 }
 // HDCP end
 
@@ -1734,15 +1728,15 @@ static int psp_dtm_terminate(struct psp_context *psp)
                return 0;
 
        if (!psp->dtm_context.context.initialized) {
-               if (psp->dtm_context.context.mem_context.shared_buf)
+               if (psp->dtm_context.context.mem_context.shared_buf) {
+                       ret = 0;
                        goto out;
-               else
+               } else {
                        return 0;
+               }
        }
 
        ret = psp_ta_unload(psp, &psp->dtm_context.context);
-       if (ret)
-               return ret;
 
        psp->dtm_context.context.initialized = false;
 
@@ -1750,7 +1744,7 @@ out:
        /* free dtm shared memory */
        psp_ta_free_shared_buf(&psp->dtm_context.context.mem_context);
 
-       return 0;
+       return ret;
 }
 // DTM end
 
@@ -1922,8 +1916,6 @@ static int psp_securedisplay_terminate(struct psp_context *psp)
                return 0;
 
        ret = psp_ta_unload(psp, &psp->securedisplay_context.context);
-       if (ret)
-               return ret;
 
        psp->securedisplay_context.context.initialized = false;