On Mon, Aug 31, 2026 at 3:56 PM David Francis <[email protected]> wrote:
>
> Some debugging applications need to track when a process starts
> or stops using the amdgpu driver. For those processes, add ftrace
> events that track when a amdgpu_vm task info is changed or destroyed.
>
> v2: Deregister in fini, not destroy.
>
> v3: Also report render minor and major
>
> cc: Sunil Khatri <[email protected]>
> Signed-off-by: David Francis <[email protected]>

Reviewed-by: Alex Deucher <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h     | 33 +++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c        | 26 +++++++++++++++
>  .../amd/amdkfd/ctx_save_restore_area_address  |  0
>  3 files changed, 59 insertions(+)
>  create mode 100644 drivers/gpu/drm/amd/amdkfd/ctx_save_restore_area_address
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> index 5324030a13f5..546794097631 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
> @@ -732,6 +732,39 @@ TRACE_EVENT(amdgpu_userq_state_changed,
>                       __entry->client_id, __entry->queue_type, 
> __entry->doorbell_index, __entry->to)
>  );
>
> +TRACE_EVENT(amdgpu_register_pid,
> +           TP_PROTO(uint32_t pid, int major, int minor),
> +           TP_ARGS(pid, major, minor),
> +           TP_STRUCT__entry(
> +                       __field(u32, pid)
> +                       __field(int, major)
> +                       __field(int, minor)
> +           ),
> +           TP_fast_assign(
> +                       __entry->pid = pid;
> +                       __entry->major = major;
> +                       __entry->minor = minor;
> +           ),
> +           TP_printk("amdgpu register pid %d render %d:%d",
> +                     __entry->pid, __entry->major, __entry->minor)
> +);
> +TRACE_EVENT(amdgpu_deregister_pid,
> +           TP_PROTO(uint32_t pid, int major, int minor),
> +           TP_ARGS(pid, major, minor),
> +           TP_STRUCT__entry(
> +                       __field(u32, pid)
> +                       __field(int, major)
> +                       __field(int, minor)
> +           ),
> +           TP_fast_assign(
> +                       __entry->pid = pid;
> +                       __entry->major = major;
> +                       __entry->minor = minor;
> +           ),
> +           TP_printk("amdgpu deregister pid %d render %d:%d",
> +                     __entry->pid, __entry->major, __entry->minor)
> +);
> +
>  #undef AMDGPU_JOB_GET_TIMELINE_NAME
>  #endif
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index aac8ace9d7a6..6be83cd2e162 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -33,6 +33,7 @@
>
>  #include <drm/amdgpu_drm.h>
>  #include <drm/drm_drv.h>
> +#include <drm/drm_ioctl.h>
>  #include <drm/ttm/ttm_tt.h>
>  #include <drm/drm_exec.h>
>  #include "amdgpu.h"
> @@ -2530,6 +2531,12 @@ static int amdgpu_vm_create_task_info(struct amdgpu_vm 
> *vm)
>         return 0;
>  }
>
> +static void amdgpu_vm_render_devt(struct amdgpu_device *adev, int *major, 
> int *minor)
> +{
> +       *major = DRM_MAJOR;
> +       *minor = adev_to_drm(adev)->render->index;
> +}
> +
>  /**
>   * amdgpu_vm_set_task_info - Sets VMs task info.
>   *
> @@ -2543,6 +2550,18 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)
>         if (vm->task_info->task.pid == current->pid)
>                 return;
>
> +       if (vm->root.bo) {
> +               struct amdgpu_device *adev = 
> amdgpu_ttm_adev(vm->root.bo->tbo.bdev);
> +               int major, minor;
> +
> +               amdgpu_vm_render_devt(adev, &major, &minor);
> +
> +               if (vm->task_info->task.pid)
> +                       trace_amdgpu_deregister_pid(vm->task_info->task.pid,
> +                                                   major, minor);
> +               trace_amdgpu_register_pid(current->pid, major, minor);
> +       }
> +
>         vm->task_info->task.pid = current->pid;
>         get_task_comm(vm->task_info->task.comm, current);
>
> @@ -2803,6 +2822,13 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct 
> amdgpu_vm *vm)
>                          ti->process_name, ti->task.pid, ti->task.comm, 
> ti->tgid);
>         }
>
> +       if (vm->task_info->task.pid) {
> +               int major, minor;
> +
> +               amdgpu_vm_render_devt(adev, &major, &minor);
> +               trace_amdgpu_deregister_pid(vm->task_info->task.pid, major, 
> minor);
> +       }
> +
>         amdgpu_vm_put_task_info(vm->task_info);
>  }
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/ctx_save_restore_area_address 
> b/drivers/gpu/drm/amd/amdkfd/ctx_save_restore_area_address
> new file mode 100644
> index 000000000000..e69de29bb2d1
> --
> 2.34.1
>

Reply via email to