summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2022-04-22 16:51:00 -0400
committerAlex Deucher <alexander.deucher@amd.com>2022-05-04 09:55:02 -0400
commitfb4f4f4256f86501bdd5117a9fe00c3a84519276 (patch)
tree028eb7ad1c81ca42c1c31f7055c5fdc9a5ba2021 /drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
parentf03d97b0bd96d18d8a75d7c9b3652aaf79da9af6 (diff)
downloadlinux-fb4f4f4256f86501bdd5117a9fe00c3a84519276.tar.bz2
drm/amdgpu/psp: fix memory leak in terminate functions
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>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index e9dc83641c71..1ef2aba2ac3f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -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;