RE: [PATCH 3/4] drm/amdgpu: add userq fence emit and signal tracepoints
AMD General Regards, Prike > -Original Message- > From: Pierre-Eric Pelloux-Prayer > Sent: Wednesday, May 13, 2026 5:16 PM > To: Liang, Prike ; [email protected] > Cc: Deucher, Alexander ; Koenig, Christian > > Subject: Re: [PATCH 3/4] drm/amdgpu: add userq fence emit and signal > tracepoints > > > > Le 11/05/2026 à 15:54, Prike Liang a écrit : > > Add ftrace events for user queue fence emission and completion. > > > > Signed-off-by: Prike Liang > > --- > > drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 48 +++ > > .../gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 8 > > 2 files changed, 56 insertions(+) > > > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h > > b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h > > index 484fbb00068b..d421a44ef933 100644 > > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h > > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h > > @@ -661,6 +661,54 @@ DEFINE_EVENT(amdgpu_userq_queue_result, > amdgpu_userq_map_end, > > DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_unmap_end, > > TP_PROTO(struct amdgpu_usermode_queue *queue, int result), > > TP_ARGS(queue, result)); > > + > > +TRACE_EVENT(amdgpu_userq_fence_emit, > > + TP_PROTO(struct amdgpu_usermode_queue *queue, u64 seqno, > > +unsigned int num_read_handles, > > +unsigned int num_write_handles, > > +unsigned int num_syncobj_handles), > > + TP_ARGS(queue, seqno, num_read_handles, num_write_handles, > > + num_syncobj_handles), > > + TP_STRUCT__entry( > > +__field(struct amdgpu_usermode_queue *, queue) > > +__field(u64, doorbell_index) > > +__field(int, queue_type) > > +__field(u64, seqno) > > +__field(unsigned int, num_read_handles) > > +__field(unsigned int, num_write_handles) > > +__field(unsigned int, num_syncobj_handles) > > +), > > + TP_fast_assign( > > + __entry->queue = queue; > > + __entry->doorbell_index = queue ? > > queue->doorbell_index : > 0; > > + __entry->queue_type = queue ? queue->queue_type : -1; > > + __entry->seqno = seqno; > > + __entry->num_read_handles = num_read_handles; > > + __entry->num_write_handles = num_write_handles; > > + __entry->num_syncobj_handles = num_syncobj_handles; > > + ), > > + TP_printk("queue=%p, doorbell=%llu, type=%d, seqno=%llu, read=%u, > write=%u, syncobj=%u", > > + __entry->queue, __entry->doorbell_index, > > + __entry->queue_type, __entry->seqno, > > + __entry->num_read_handles, __entry->num_write_handles, > > + __entry->num_syncobj_handles) ); > > +TRACE_EVENT(amdgpu_userq_fence_signal, > > + TP_PROTO(u64 context, u64 seqno, u64 rptr), > > + TP_ARGS(context, seqno, rptr), > > + TP_STRUCT__entry( > > +__field(u64, context) > > +__field(u64, seqno) > > +__field(u64, rptr) > > +), > > + TP_fast_assign( > > + __entry->context = context; > > + __entry->seqno = seqno; > > + __entry->rptr = rptr; > > + ), > > + TP_printk("context=%llu, seqno=%llu, rptr=%llu", > > + __entry->context, __entry->seqno, __entry->rptr) ); > > Could you replace this patch with my version? The event names are more > consistent > with the kernel queue ones and it also has one event for dependencies. Sure, I will merge your patch into this userq submission tracker part. > Pierre-Eric > > > > #undef AMDGPU_JOB_GET_TIMELINE_NAME > > #endif > > > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > > b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > > index 369914cab555..50d1c3627279 100644 > > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > > @@ -31,6 +31,7 @@ > > > > #include "amdgpu.h" > > #include
Re: [PATCH 3/4] drm/amdgpu: add userq fence emit and signal tracepoints
Le 11/05/2026 à 15:54, Prike Liang a écrit :
Add ftrace events for user queue fence emission and completion.
Signed-off-by: Prike Liang
---
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 48 +++
.../gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 8
2 files changed, 56 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index 484fbb00068b..d421a44ef933 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -661,6 +661,54 @@ DEFINE_EVENT(amdgpu_userq_queue_result,
amdgpu_userq_map_end,
DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_unmap_end,
TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
TP_ARGS(queue, result));
+
+TRACE_EVENT(amdgpu_userq_fence_emit,
+ TP_PROTO(struct amdgpu_usermode_queue *queue, u64 seqno,
+unsigned int num_read_handles,
+unsigned int num_write_handles,
+unsigned int num_syncobj_handles),
+ TP_ARGS(queue, seqno, num_read_handles, num_write_handles,
+ num_syncobj_handles),
+ TP_STRUCT__entry(
+__field(struct amdgpu_usermode_queue *, queue)
+__field(u64, doorbell_index)
+__field(int, queue_type)
+__field(u64, seqno)
+__field(unsigned int, num_read_handles)
+__field(unsigned int, num_write_handles)
+__field(unsigned int, num_syncobj_handles)
+),
+ TP_fast_assign(
+ __entry->queue = queue;
+ __entry->doorbell_index = queue ?
queue->doorbell_index : 0;
+ __entry->queue_type = queue ? queue->queue_type : -1;
+ __entry->seqno = seqno;
+ __entry->num_read_handles = num_read_handles;
+ __entry->num_write_handles = num_write_handles;
+ __entry->num_syncobj_handles = num_syncobj_handles;
+ ),
+ TP_printk("queue=%p, doorbell=%llu, type=%d, seqno=%llu, read=%u,
write=%u, syncobj=%u",
+ __entry->queue, __entry->doorbell_index,
+ __entry->queue_type, __entry->seqno,
+ __entry->num_read_handles, __entry->num_write_handles,
+ __entry->num_syncobj_handles)
+);
+TRACE_EVENT(amdgpu_userq_fence_signal,
+ TP_PROTO(u64 context, u64 seqno, u64 rptr),
+ TP_ARGS(context, seqno, rptr),
+ TP_STRUCT__entry(
+__field(u64, context)
+__field(u64, seqno)
+__field(u64, rptr)
+),
+ TP_fast_assign(
+ __entry->context = context;
+ __entry->seqno = seqno;
+ __entry->rptr = rptr;
+ ),
+ TP_printk("context=%llu, seqno=%llu, rptr=%llu",
+ __entry->context, __entry->seqno, __entry->rptr)
+);
Could you replace this patch with my version? The event names are more consistent with the kernel
queue ones and it also has one event for dependencies.
Pierre-Eric
#undef AMDGPU_JOB_GET_TIMELINE_NAME
#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
index 369914cab555..50d1c3627279 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
@@ -31,6 +31,7 @@
#include "amdgpu.h"
#include "amdgpu_userq_fence.h"
+#include "amdgpu_trace.h"
#define AMDGPU_USERQ_MAX_HANDLES (1U << 16)
@@ -168,6 +169,9 @@ amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv)
list_for_each_entry_safe(userq_fence, tmp, &to_be_signaled, link) {
fence = &userq_fence->base;
list_del_init(&userq_fence->link);
+ trace_amdgpu_userq_fence_signal(fence_drv->context,
+ userq_fence->base.seqno,
+ rptr);
dma_fence_signal(fence);
/* Drop fence_drv_array outside fence_list_lock
* to avoid the recursion lock.
@@ -530,6 +534,10 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void
*data,
/* Create the new fence */
amdgpu_userq_fence_init(queue, fence, wptr);
+ trace_amdgpu_userq_fence_emit(queue, fence->base.seqno,
+ num_read_bo_handles,
+ num_write_bo_handles,
+ num_syncobj_handles);
