down_read/up_read adev->reset_domain semaphore should be placed around
remove queue.

Fixes: f5587b4740c0 ("drm/amdgpu: Remove faulty queue before resume")
Signed-off-by: Amber Lin <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c               | 5 +++++
 drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 4 ----
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
index 0506b90f318e..982b41606d48 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
@@ -2358,9 +2358,14 @@ int amdgpu_gfx_reset_mes_compute(struct amdgpu_device 
*adev,
                 * preempted successfuly. Remove it before resume all so it
                 * doesn't get mapped back
                 */
+               if (!down_read_trylock(&adev->reset_domain->sem)) {
+                       r = -EIO;
+                       goto out;
+               }
                amdgpu_mes_lock(&adev->mes);
                r = adev->mes.funcs->remove_hw_queue(&adev->mes, queue_input);
                amdgpu_mes_unlock(&adev->mes);
+               up_read(&adev->reset_domain->sem);
        }
 
 out:
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index fc1d179148c0..4e60d9364e37 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -493,12 +493,8 @@ static int recover_bad_queue_mes(struct 
device_queue_manager *dqm, struct queue
        struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
        int r = 0;
 
-       if (!down_read_trylock(&adev->reset_domain->sem))
-               return -EIO;
-
        r = reset_queues_mes(dqm, q);
 
-       up_read(&adev->reset_domain->sem);
        return r;
 }
 
-- 
2.43.0

Reply via email to