Extract mes_userq_reset_hw() for reuse by GFX recovery. Keep reset and
MES queue removal together, marking the queue HUNG only after both
operations succeed. The existing reset entry point uses the same helper.

Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 44 ++++++++++++----------
 drivers/gpu/drm/amd/amdgpu/mes_userqueue.h |  4 ++
 2 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c 
b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
index fe49aa4dc5ff..948813042e98 100644
--- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
+++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
@@ -207,12 +207,34 @@ static int mes_userq_unmap(struct amdgpu_usermode_queue 
*queue)
        return 0;
 }
 
+int mes_userq_reset_hw(struct amdgpu_usermode_queue *queue,
+                      struct mes_reset_queue_input *input)
+{
+       struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr;
+       struct amdgpu_device *adev = uq_mgr->adev;
+       int r;
+
+       amdgpu_mes_lock(&adev->mes);
+       r = adev->mes.funcs->reset_hw_queue(&adev->mes, input);
+       amdgpu_mes_unlock(&adev->mes);
+       if (r)
+               return r;
+
+       r = mes_userq_unmap(queue);
+       if (r)
+               return r;
+
+       /* Prevent the restore worker from resubmitting the guilty job. */
+       trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG);
+       queue->state = AMDGPU_USERQ_STATE_HUNG;
+       return 0;
+}
+
 int mes_userq_reset(struct amdgpu_usermode_queue *queue)
 {
        struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr;
        struct amdgpu_device *adev = uq_mgr->adev;
        struct mes_reset_queue_input queue_input;
-       int r;
 
        /* already reset by an earlier job's hang-detect; just signal and bail 
*/
        if (queue->state == AMDGPU_USERQ_STATE_HUNG)
@@ -244,25 +266,7 @@ int mes_userq_reset(struct amdgpu_usermode_queue *queue)
                }
        }
 
-       amdgpu_mes_lock(&adev->mes);
-       r = adev->mes.funcs->reset_hw_queue(&adev->mes, &queue_input);
-       amdgpu_mes_unlock(&adev->mes);
-       if (r)
-               return r;
-
-       /* drop the queue from MES */
-       r = mes_userq_unmap(queue);
-       if (r)
-               return r;
-
-       /*
-        * HUNG, not UNMAPPED: the guilty job is still in the ring, so the
-        * restore worker must not re-map and re-run it.
-        */
-       trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG);
-       queue->state = AMDGPU_USERQ_STATE_HUNG;
-
-       return 0;
+       return mes_userq_reset_hw(queue, &queue_input);
 }
 
 int mes_userq_reset_queue(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h 
b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h
index a473360d6a8b..5e6d444447c9 100644
--- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h
+++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h
@@ -26,8 +26,12 @@
 #define MES_USERQ_H
 #include "amdgpu_userq.h"
 
+struct mes_reset_queue_input;
+
 extern const struct amdgpu_userq_funcs userq_mes_funcs;
 
+int mes_userq_reset_hw(struct amdgpu_usermode_queue *queue,
+                      struct mes_reset_queue_input *input);
 int mes_userq_reset(struct amdgpu_usermode_queue *queue);
 int mes_userq_reset_queue(struct amdgpu_device *adev,
                          struct amdgpu_usermode_queue *guilty_uq,
-- 
2.49.0

Reply via email to