Commit 4172b556 authored by Eric Huang's avatar Eric Huang Committed by Alex Deucher
Browse files

drm/amdkfd: add smi events for process start and end



rocm-smi will be able to show the events for KFD process
start/end, it is the implementation of this feature.

Signed-off-by: default avatarEric Huang <jinhuieric.huang@amd.com>
Reviewed-by: default avatarKent Russell <kent.russell@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1d9bff4c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1054,6 +1054,8 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
	for (i = 0; i < p->n_pdds; i++) {
		struct kfd_process_device *pdd = p->pdds[i];

		kfd_smi_event_process(pdd, false);

		pr_debug("Releasing pdd (topology id %d, for pid %d)\n",
			pdd->dev->id, p->lead_thread->pid);
		kfd_process_device_destroy_cwsr_dgpu(pdd);
@@ -1715,6 +1717,8 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
	pdd->pasid = avm->pasid;
	pdd->drm_file = drm_file;

	kfd_smi_event_process(pdd, true);

	return 0;

err_get_pasid:
+21 −0
Original line number Diff line number Diff line
@@ -345,6 +345,27 @@ void kfd_smi_event_unmap_from_gpu(struct kfd_node *node, pid_t pid,
			  pid, address, last - address + 1, node->id, trigger));
}

void kfd_smi_event_process(struct kfd_process_device *pdd, bool start)
{
	struct amdgpu_task_info *task_info;
	struct amdgpu_vm *avm;

	if (pdd->drm_priv)
		return;

	avm = drm_priv_to_vm(pdd->drm_priv);
	task_info = amdgpu_vm_get_task_info_vm(avm);

	if (task_info) {
		kfd_smi_event_add(0, pdd->dev,
				  start ? KFD_SMI_EVENT_PROCESS_START :
				  KFD_SMI_EVENT_PROCESS_END,
				  KFD_EVENT_FMT_PROCESS(task_info->pid,
				  task_info->task_name));
		amdgpu_vm_put_task_info(task_info);
	}
}

int kfd_smi_event_open(struct kfd_node *dev, uint32_t *fd)
{
	struct kfd_smi_client *client;
+1 −0
Original line number Diff line number Diff line
@@ -53,4 +53,5 @@ void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm);
void kfd_smi_event_unmap_from_gpu(struct kfd_node *node, pid_t pid,
				  unsigned long address, unsigned long last,
				  uint32_t trigger);
void kfd_smi_event_process(struct kfd_process_device *pdd, bool start);
#endif
+5 −0
Original line number Diff line number Diff line
@@ -536,6 +536,8 @@ enum kfd_smi_event {
	KFD_SMI_EVENT_QUEUE_EVICTION = 9,
	KFD_SMI_EVENT_QUEUE_RESTORE = 10,
	KFD_SMI_EVENT_UNMAP_FROM_GPU = 11,
	KFD_SMI_EVENT_PROCESS_START = 12,
	KFD_SMI_EVENT_PROCESS_END = 13,

	/*
	 * max event number, as a flag bit to get events from all processes,
@@ -651,6 +653,9 @@ struct kfd_ioctl_smi_events_args {
		"%lld -%d @%lx(%lx) %x %d\n", (ns), (pid), (addr), (size),\
		(node), (unmap_trigger)

#define KFD_EVENT_FMT_PROCESS(pid, task_name)\
		"%x %s\n", (pid), (task_name)

/**************************************************************************************************
 * CRIU IOCTLs (Checkpoint Restore In Userspace)
 *