From: Bart Van Assche <[email protected]>

Do not unlock psp->ras_context.mutex if it has not been locked. This has
been detected by the Clang thread-safety analyzer.

Cc: Alex Deucher <[email protected]>
Cc: Christian König <[email protected]>
Cc: YiPeng Chai <[email protected]>
Cc: Hawking Zhang <[email protected]>
Cc: [email protected]
Fixes: b3fb79cda568 ("drm/amdgpu: add mutex to protect ras shared memory")
Signed-off-by: Bart Van Assche <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c
index 6e8aad91bcd3..0d3c18f04ac3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c
@@ -332,13 +332,13 @@ static ssize_t ta_if_invoke_debugfs_write(struct file 
*fp, const char *buf, size
        if (!context || !context->initialized) {
                dev_err(adev->dev, "TA is not initialized\n");
                ret = -EINVAL;
-               goto err_free_shared_buf;
+               goto free_shared_buf;
        }
 
        if (!psp->ta_funcs || !psp->ta_funcs->fn_ta_invoke) {
                dev_err(adev->dev, "Unsupported function to invoke TA\n");
                ret = -EOPNOTSUPP;
-               goto err_free_shared_buf;
+               goto free_shared_buf;
        }
 
        context->session_id = ta_id;
@@ -346,7 +346,7 @@ static ssize_t ta_if_invoke_debugfs_write(struct file *fp, 
const char *buf, size
        mutex_lock(&psp->ras_context.mutex);
        ret = prep_ta_mem_context(&context->mem_context, shared_buf, 
shared_buf_len);
        if (ret)
-               goto err_free_shared_buf;
+               goto unlock;
 
        ret = psp_fn_ta_invoke(psp, cmd_id);
        if (ret || context->resp_status) {
@@ -354,15 +354,17 @@ static ssize_t ta_if_invoke_debugfs_write(struct file 
*fp, const char *buf, size
                        ret, context->resp_status);
                if (!ret) {
                        ret = -EINVAL;
-                       goto err_free_shared_buf;
+                       goto unlock;
                }
        }
 
        if (copy_to_user((char *)&buf[copy_pos], 
context->mem_context.shared_buf, shared_buf_len))
                ret = -EFAULT;
 
-err_free_shared_buf:
+unlock:
        mutex_unlock(&psp->ras_context.mutex);
+
+free_shared_buf:
        kfree(shared_buf);
 
        return ret;

Reply via email to