From: Alex Deucher <[email protected]>

Query the status of the user queue, currently whether
the queue is hung and whether or not VRAM is lost.

v2: Misc cleanups

Reviewed-by: Prike Liang <[email protected]>
Reviewed-by: Sunil Khatri <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
Signed-off-by: Prike Liang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 33 +++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index bcfbd7213dd6..911b4abfd126 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -799,6 +799,33 @@ amdgpu_userq_create(struct drm_file *filp, union 
drm_amdgpu_userq *args)
        return r;
 }
 
+static int
+amdgpu_userq_query_status(struct drm_file *filp, union drm_amdgpu_userq *args)
+{
+       struct amdgpu_fpriv *fpriv = filp->driver_priv;
+       struct amdgpu_userq_mgr *uq_mgr = &fpriv->userq_mgr;
+       struct amdgpu_device *adev = uq_mgr->adev;
+       struct amdgpu_usermode_queue *queue;
+       int queue_id = args->in.queue_id;
+
+       mutex_lock(&uq_mgr->userq_mutex);
+
+       queue = amdgpu_userq_find(uq_mgr, queue_id);
+       if (!queue) {
+               dev_dbg(adev->dev, "Invalid queue id to query\n");
+               mutex_unlock(&uq_mgr->userq_mutex);
+               return -EINVAL;
+       }
+       args->out_qs.flags = 0;
+       if (queue->state == AMDGPU_USERQ_STATE_HUNG)
+               args->out_qs.flags |= AMDGPU_USERQ_QUERY_STATUS_FLAGS_HUNG;
+       if (queue->generation != amdgpu_vm_generation(adev, &fpriv->vm))
+               args->out_qs.flags |= AMDGPU_USERQ_QUERY_STATUS_FLAGS_VRAMLOST;
+       mutex_unlock(&uq_mgr->userq_mutex);
+
+       return 0;
+}
+
 static int amdgpu_userq_input_args_validate(struct drm_device *dev,
                                        union drm_amdgpu_userq *args,
                                        struct drm_file *filp)
@@ -914,6 +941,12 @@ int amdgpu_userq_ioctl(struct drm_device *dev, void *data,
                break;
        }
 
+       case AMDGPU_USERQ_OP_QUERY_STATUS:
+               r = amdgpu_userq_query_status(filp, args);
+               if (r)
+                       drm_dbg_driver(dev, "Failed to query usermode queue 
status\n");
+               break;
+
        default:
                drm_dbg_driver(dev, "Invalid user queue op specified: %d\n", 
args->in.op);
                return -EINVAL;
-- 
2.34.1

Reply via email to