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: Eric Huang <jinhuieric.huang@amd.com>
Reviewed-by: Kent Russell <kent.russell@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Eric Huang 2025-04-07 15:32:33 -04:00 committed by Alex Deucher
parent 1d9bff4cf8
commit 4172b556fd
4 changed files with 31 additions and 0 deletions

View File

@ -1054,6 +1054,8 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
for (i = 0; i < p->n_pdds; i++) { for (i = 0; i < p->n_pdds; i++) {
struct kfd_process_device *pdd = p->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", pr_debug("Releasing pdd (topology id %d, for pid %d)\n",
pdd->dev->id, p->lead_thread->pid); pdd->dev->id, p->lead_thread->pid);
kfd_process_device_destroy_cwsr_dgpu(pdd); 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->pasid = avm->pasid;
pdd->drm_file = drm_file; pdd->drm_file = drm_file;
kfd_smi_event_process(pdd, true);
return 0; return 0;
err_get_pasid: err_get_pasid:

View File

@ -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)); 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) int kfd_smi_event_open(struct kfd_node *dev, uint32_t *fd)
{ {
struct kfd_smi_client *client; struct kfd_smi_client *client;

View File

@ -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, void kfd_smi_event_unmap_from_gpu(struct kfd_node *node, pid_t pid,
unsigned long address, unsigned long last, unsigned long address, unsigned long last,
uint32_t trigger); uint32_t trigger);
void kfd_smi_event_process(struct kfd_process_device *pdd, bool start);
#endif #endif

View File

@ -536,6 +536,8 @@ enum kfd_smi_event {
KFD_SMI_EVENT_QUEUE_EVICTION = 9, KFD_SMI_EVENT_QUEUE_EVICTION = 9,
KFD_SMI_EVENT_QUEUE_RESTORE = 10, KFD_SMI_EVENT_QUEUE_RESTORE = 10,
KFD_SMI_EVENT_UNMAP_FROM_GPU = 11, 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, * 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),\ "%lld -%d @%lx(%lx) %x %d\n", (ns), (pid), (addr), (size),\
(node), (unmap_trigger) (node), (unmap_trigger)
#define KFD_EVENT_FMT_PROCESS(pid, task_name)\
"%x %s\n", (pid), (task_name)
/************************************************************************************************** /**************************************************************************************************
* CRIU IOCTLs (Checkpoint Restore In Userspace) * CRIU IOCTLs (Checkpoint Restore In Userspace)
* *