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]>
---
 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