extends the critical section of 'ptl_mutex' to
cover the PTL sysfs update operation.

Signed-off-by: Perry Yuan <[email protected]>
Reviewed-by: Harish Kasiviswanathan <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 682a0e4adafd..982494abbf1d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -1336,14 +1336,16 @@ static ssize_t ptl_enable_store(struct device *dev,
        uint32_t ptl_state, fmt1, fmt2;
        int ret;
 
-       if (sysfs_streq(buf, "enabled") || sysfs_streq(buf, "1"))
+       mutex_lock(&psp->ptl_mutex);
+       if (sysfs_streq(buf, "enabled") || sysfs_streq(buf, "1")) {
                enable = true;
-       else if (sysfs_streq(buf, "disabled") || sysfs_streq(buf, "0"))
+       } else if (sysfs_streq(buf, "disabled") || sysfs_streq(buf, "0")) {
                enable = false;
-       else
+       } else {
+               mutex_unlock(&psp->ptl_mutex);
                return -EINVAL;
+       }
 
-       mutex_lock(&psp->ptl_mutex);
        fmt1 = psp->ptl_fmt1;
        fmt2 = psp->ptl_fmt2;
        ptl_state = enable ? 1 : 0;
@@ -1390,17 +1392,22 @@ static ssize_t ptl_format_store(struct device *dev,
        if (!psp->ptl_enabled)
                return -EPERM;
 
+       mutex_lock(&psp->ptl_mutex);
        /* Parse input, expecting "FMT1,FMT2" */
-       if (sscanf(buf, "%7[^,],%7s", fmt1_str, fmt2_str) != 2)
+       if (sscanf(buf, "%7[^,],%7s", fmt1_str, fmt2_str) != 2) {
+               mutex_unlock(&psp->ptl_mutex);
                return -EINVAL;
+       }
 
        fmt1_enum = str_to_ptl_fmt(fmt1_str);
        fmt2_enum = str_to_ptl_fmt(fmt2_str);
 
        if (fmt1_enum >= AMDGPU_PTL_FMT_INVALID ||
                        fmt2_enum >= AMDGPU_PTL_FMT_INVALID ||
-                       fmt1_enum == fmt2_enum)
+                       fmt1_enum == fmt2_enum) {
+               mutex_unlock(&psp->ptl_mutex);
                return -EINVAL;
+       }
 
        ptl_state = psp->ptl_enabled;
        fmt1 = fmt1_enum;
@@ -1408,8 +1415,10 @@ static ssize_t ptl_format_store(struct device *dev,
        ret = psp_performance_monitor_hw(psp, PSP_PTL_PERF_MON_SET, &ptl_state, 
&fmt1, &fmt2);
        if (ret) {
                dev_err(adev->dev, "Failed to update PTL err = %d\n", ret);
+               mutex_unlock(&psp->ptl_mutex);
                return ret;
        }
+       mutex_unlock(&psp->ptl_mutex);
 
        return count;
 }
-- 
2.34.1

Reply via email to