drm/amdgpu: Add support for logging process info in amdgpu_vm.
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Fri, 29 Jun 2018 02:51:32 +0000 (22:51 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 10 Jul 2018 19:17:29 +0000 (14:17 -0500)
Add process and thread names and pids and a function to extract
this info from relevant amdgpu_vm.

v2: Add documentation and fix identation.

v3: Add getter and setter functions for amdgpu_task_info.

Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Acked-by: Jim Qu <Jim.Qu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h

index 712af5c1a5d692a68e4da876de531960b2e48a4f..d18f24748b344e294fe6fb55b94ecd5601bee089 100644 (file)
@@ -2942,3 +2942,42 @@ int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 
        return 0;
 }
+
+/**
+ * amdgpu_vm_get_task_info - Extracts task info for a PASID.
+ *
+ * @dev: drm device pointer
+ * @pasid: PASID identifier for VM
+ * @task_info: task_info to fill.
+ */
+void amdgpu_vm_get_task_info(struct amdgpu_device *adev, unsigned int pasid,
+                        struct amdgpu_task_info *task_info)
+{
+       struct amdgpu_vm *vm;
+
+       spin_lock(&adev->vm_manager.pasid_lock);
+
+       vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
+       if (vm)
+               *task_info = vm->task_info;
+
+       spin_unlock(&adev->vm_manager.pasid_lock);
+}
+
+/**
+ * amdgpu_vm_set_task_info - Sets VMs task info.
+ *
+ * @vm: vm for which to set the info
+ */
+void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)
+{
+       if (!vm->task_info.pid) {
+               vm->task_info.pid = current->pid;
+               get_task_comm(vm->task_info.task_name, current);
+
+               if (current->group_leader->mm == current->mm) {
+                       vm->task_info.tgid = current->group_leader->pid;
+                       get_task_comm(vm->task_info.process_name, current->group_leader);
+               }
+       }
+}
index 061b99a18cb81d7b2a9fb197bbc33c4df14d9d02..d416f895233d3b89dd0f535ba61006412b30bbb1 100644 (file)
@@ -164,6 +164,14 @@ struct amdgpu_vm_pt {
 #define AMDGPU_VM_FAULT_PASID(fault) ((u64)(fault) >> 48)
 #define AMDGPU_VM_FAULT_ADDR(fault)  ((u64)(fault) & 0xfffffffff000ULL)
 
+
+struct amdgpu_task_info {
+       char    process_name[TASK_COMM_LEN];
+       char    task_name[TASK_COMM_LEN];
+       pid_t   pid;
+       pid_t   tgid;
+};
+
 struct amdgpu_vm {
        /* tree of virtual addresses mapped */
        struct rb_root_cached   va;
@@ -215,6 +223,9 @@ struct amdgpu_vm {
 
        /* Valid while the PD is reserved or fenced */
        uint64_t                pd_phys_addr;
+
+       /* Some basic info about the task */
+       struct amdgpu_task_info task_info;
 };
 
 struct amdgpu_vm_manager {
@@ -317,4 +328,9 @@ bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring,
                                  struct amdgpu_job *job);
 void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev);
 
+void amdgpu_vm_get_task_info(struct amdgpu_device *adev, unsigned int pasid,
+                        struct amdgpu_task_info *task_info);
+
+void amdgpu_vm_set_task_info(struct amdgpu_vm *vm);
+
 #endif