Add ftrace events around user queue preempt, restore, map and unmap
operations to profile runtime queue state transitions.

Signed-off-by: Prike Liang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 25 +++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 12 ++++++++++-
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index 5a01f63d1f32..484fbb00068b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -636,6 +636,31 @@ DEFINE_EVENT(amdgpu_userq_queue_result, 
amdgpu_userq_destroy_end,
             TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
             TP_ARGS(queue, result));
 
+
+DEFINE_EVENT(amdgpu_userq_queue, amdgpu_userq_preempt_start,
+            TP_PROTO(struct amdgpu_usermode_queue *queue),
+            TP_ARGS(queue));
+DEFINE_EVENT(amdgpu_userq_queue, amdgpu_userq_restore_start,
+            TP_PROTO(struct amdgpu_usermode_queue *queue),
+            TP_ARGS(queue));
+DEFINE_EVENT(amdgpu_userq_queue, amdgpu_userq_map_start,
+            TP_PROTO(struct amdgpu_usermode_queue *queue),
+            TP_ARGS(queue));
+DEFINE_EVENT(amdgpu_userq_queue, amdgpu_userq_unmap_start,
+            TP_PROTO(struct amdgpu_usermode_queue *queue),
+            TP_ARGS(queue));
+DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_preempt_end,
+            TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
+            TP_ARGS(queue, result));
+DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_restore_end,
+            TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
+            TP_ARGS(queue, result));
+DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_map_end,
+            TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
+            TP_ARGS(queue, result));
+DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_unmap_end,
+            TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
+            TP_ARGS(queue, result));
 #undef AMDGPU_JOB_GET_TIMELINE_NAME
 #endif
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index 50c46d31fbae..83aee0810513 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -340,13 +340,16 @@ static int amdgpu_userq_preempt_helper(struct 
amdgpu_usermode_queue *queue)
        int r;
 
        if (queue->state == AMDGPU_USERQ_STATE_MAPPED) {
+               trace_amdgpu_userq_preempt_start(queue);
                r = userq_funcs->preempt(queue);
                if (r) {
                        queue->state = AMDGPU_USERQ_STATE_HUNG;
+                       trace_amdgpu_userq_preempt_end(queue, r);
                        return r;
                } else {
                        queue->state = AMDGPU_USERQ_STATE_PREEMPTED;
                }
+               trace_amdgpu_userq_preempt_end(queue, r);
        }
        return 0;
 }
@@ -360,12 +363,14 @@ static int amdgpu_userq_restore_helper(struct 
amdgpu_usermode_queue *queue)
        int r = 0;
 
        if (queue->state == AMDGPU_USERQ_STATE_PREEMPTED) {
+               trace_amdgpu_userq_restore_start(queue);
                r = userq_funcs->restore(queue);
                if (r) {
                        queue->state = AMDGPU_USERQ_STATE_HUNG;
                } else {
                        queue->state = AMDGPU_USERQ_STATE_MAPPED;
                }
+               trace_amdgpu_userq_restore_end(queue, r);
        }
 
        return r;
@@ -381,14 +386,16 @@ static int amdgpu_userq_unmap_helper(struct 
amdgpu_usermode_queue *queue)
 
        if ((queue->state == AMDGPU_USERQ_STATE_MAPPED) ||
            (queue->state == AMDGPU_USERQ_STATE_PREEMPTED)) {
-
+               trace_amdgpu_userq_unmap_start(queue);
                r = userq_funcs->unmap(queue);
                if (r) {
                        queue->state = AMDGPU_USERQ_STATE_HUNG;
+                       trace_amdgpu_userq_unmap_end(queue, r);
                        return r;
                } else {
                        queue->state = AMDGPU_USERQ_STATE_UNMAPPED;
                }
+               trace_amdgpu_userq_unmap_end(queue, 0);
        }
 
        return 0;
@@ -403,13 +410,16 @@ static int amdgpu_userq_map_helper(struct 
amdgpu_usermode_queue *queue)
        int r;
 
        if (queue->state == AMDGPU_USERQ_STATE_UNMAPPED) {
+               trace_amdgpu_userq_map_start(queue);
                r = userq_funcs->map(queue);
                if (r) {
                        queue->state = AMDGPU_USERQ_STATE_HUNG;
+                       trace_amdgpu_userq_map_end(queue, r);
                        return r;
                } else {
                        queue->state = AMDGPU_USERQ_STATE_MAPPED;
                }
+               trace_amdgpu_userq_map_end(queue, 0);
        }
 
        return 0;
-- 
2.34.1

Reply via email to