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 >
