On 6/11/26 10:33, Prike Liang wrote:
> Add ftrace events around user queue creation and destruction to profile
> queue setup and teardown latency.
> 
> Signed-off-by: Prike Liang <[email protected]>

Reviewed-by: Christian König <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 58 +++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c |  9 ++++
>  2 files changed, 67 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> index d13e64a69e25..df98be22f1f5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> @@ -578,6 +578,64 @@ TRACE_EVENT(amdgpu_reset_reg_dumps,
>                     __entry->value)
>  );
>  
> +DECLARE_EVENT_CLASS(amdgpu_userq_queue,
> +         TP_PROTO(struct amdgpu_usermode_queue *queue),
> +         TP_ARGS(queue),
> +         TP_STRUCT__entry(
> +                          __field(void *, queue)
> +                          __field(u64, doorbell_index)
> +                          __field(int, queue_type)
> +                          __field(int, state)
> +                          __field(u32, xcp_id)
> +                          ),
> +         TP_fast_assign(
> +                        __entry->queue = queue;
> +                        __entry->doorbell_index = queue->doorbell_index;
> +                        __entry->queue_type = queue->queue_type;
> +                        __entry->state = queue->state;
> +                        __entry->xcp_id = queue->xcp_id;
> +                        ),
> +         TP_printk("queue=%p, doorbell=%llu, type=%d, state=%d, xcp_id=%u",
> +                   __entry->queue, __entry->doorbell_index,
> +                   __entry->queue_type, __entry->state, __entry->xcp_id)
> +);
> +DEFINE_EVENT(amdgpu_userq_queue, amdgpu_userq_create_start,
> +          TP_PROTO(struct amdgpu_usermode_queue *queue),
> +          TP_ARGS(queue));
> +DEFINE_EVENT(amdgpu_userq_queue, amdgpu_userq_destroy_start,
> +          TP_PROTO(struct amdgpu_usermode_queue *queue),
> +          TP_ARGS(queue));
> +DECLARE_EVENT_CLASS(amdgpu_userq_queue_result,
> +         TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
> +         TP_ARGS(queue, result),
> +         TP_STRUCT__entry(
> +                          __field(void *, queue)
> +                          __field(u64, doorbell_index)
> +                          __field(int, queue_type)
> +                          __field(int, state)
> +                          __field(u32, xcp_id)
> +                          __field(int, result)
> +                          ),
> +         TP_fast_assign(
> +                        __entry->queue = queue;
> +                        __entry->doorbell_index = queue->doorbell_index;
> +                        __entry->queue_type = queue->queue_type;
> +                        __entry->state = queue->state;
> +                        __entry->xcp_id = queue->xcp_id;
> +                        __entry->result = result;
> +                        ),
> +         TP_printk("queue=%p, doorbell=%llu, type=%d, state=%d, xcp_id=%u, 
> result=%d",
> +                   __entry->queue, __entry->doorbell_index,
> +                   __entry->queue_type, __entry->state,
> +                   __entry->xcp_id, __entry->result)
> +);
> +DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_create_end,
> +          TP_PROTO(struct amdgpu_usermode_queue *queue, int result),
> +          TP_ARGS(queue, result));
> +DEFINE_EVENT(amdgpu_userq_queue_result, amdgpu_userq_destroy_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 c1175cb6d242..64b9127ef931 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -33,6 +33,7 @@
>  #include "amdgpu_userq.h"
>  #include "amdgpu_hmm.h"
>  #include "amdgpu_userq_fence.h"
> +#include "amdgpu_trace.h"
>  
>  u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev)
>  {
> @@ -507,6 +508,8 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, 
> struct amdgpu_usermode_que
>       const struct amdgpu_userq_funcs *uq_funcs = 
> adev->userq_funcs[queue->queue_type];
>       int r = 0;
>  
> +     trace_amdgpu_userq_destroy_start(queue);
> +
>       cancel_delayed_work_sync(&uq_mgr->resume_work);
>  
>       /* Cancel any pending hang detection work and cleanup */
> @@ -532,6 +535,7 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, 
> struct amdgpu_usermode_que
>       amdgpu_bo_unreserve(queue->db_obj.obj);
>       amdgpu_bo_unref(&queue->db_obj.obj);
>  
> +     trace_amdgpu_userq_destroy_end(queue, r);
>       kfree(queue);
>  
>       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
> @@ -683,6 +687,7 @@ amdgpu_userq_create(struct drm_file *filp, union 
> drm_amdgpu_userq *args)
>       }
>  
>       queue->doorbell_index = index;
> +     trace_amdgpu_userq_create_start(queue);
>       r = uq_funcs->mqd_create(queue, &args->in);
>       if (r) {
>               drm_file_err(uq_mgr->file, "Failed to create Queue\n");
> @@ -706,6 +711,7 @@ amdgpu_userq_create(struct drm_file *filp, union 
> drm_amdgpu_userq *args)
>               r = amdgpu_userq_map_helper(queue);
>               if (r) {
>                       drm_file_err(uq_mgr->file, "Failed to map Queue\n");
> +                     trace_amdgpu_userq_create_end(queue, r);
>                       mutex_unlock(&uq_mgr->userq_mutex);
>                       goto erase_doorbell;
>               }
> @@ -722,11 +728,13 @@ amdgpu_userq_create(struct drm_file *filp, union 
> drm_amdgpu_userq *args)
>                * This drops the last reference which should take care of
>                * all cleanup.
>                */
> +             trace_amdgpu_userq_create_end(queue, r);
>               amdgpu_userq_put(queue);
>               return r;
>       }
>  
>       amdgpu_debugfs_userq_init(filp, queue, qid);
> +     trace_amdgpu_userq_create_end(queue, 0);
>       args->out.queue_id = qid;
>       return 0;
>  
> @@ -742,6 +750,7 @@ amdgpu_userq_create(struct drm_file *filp, union 
> drm_amdgpu_userq *args)
>  free_fence_drv:
>       amdgpu_userq_fence_driver_free(queue);
>  free_queue:
> +     trace_amdgpu_userq_create_end(queue, r);
>       kfree(queue);
>  err_pm_runtime:
>       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);

Reply via email to