Le 11/05/2026 à 15:54, Prike Liang a écrit :
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);
I prefer having only 2 trace points: trace_amdgpu_userq_state_change_start /
end.
The _start event would print the current state and the _end one would print the
new state.
Also these events should be used eveywhere "queue->state" is modified.
Pierre-Eric
}
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;