RE: [PATCH v3] drm/amdkfd: Fix SMI event PID reporting for containers

2026-05-27 Thread Martin, Andrew
Public

Greetings @Kasiviswanathan, Harish<mailto:[email protected]>

Thanks.

One love!

From: Kasiviswanathan, Harish 
Sent: Wednesday, May 27, 2026 6:18 PM
To: Martin, Andrew ; [email protected]
Cc: Claude : Sonnet 4 
Subject: Re: [PATCH v3] drm/amdkfd: Fix SMI event PID reporting for containers

Public


Reviewed-by: Harish Kasiviswanathan 
mailto:[email protected]>>



From: amd-gfx 
mailto:[email protected]>>
 on behalf of Andrew Martin 
mailto:[email protected]>>
Sent: Wednesday, May 27, 2026 5:15 PM
To: [email protected]<mailto:[email protected]> 
mailto:[email protected]>>
Cc: Martin, Andrew mailto:[email protected]>>; 
Martin, Andrew mailto:[email protected]>>; Claude : 
Sonnet 4 mailto:[email protected]>>
Subject: [PATCH v3] drm/amdkfd: Fix SMI event PID reporting for containers

SMI events were reporting incorrect PIDs in containerized environments,
causing test failures where container processes expected to see their
namespace-local PIDs but instead received global host PIDs.

The issue had two root causes:

1. Event functions were called from kernel context (page fault handlers,
   migration workers) where 'current' refers to the kernel worker thread,
   not the userspace GPU process that triggered the event.

2. PID conversion used task_tgid_vnr() which returns the PID in the
   caller's namespace (init namespace for kernel threads), not the task's
   own namespace.

This patch updates the SMI event interface:

- Change 8 event function signatures to accept task_struct pointer
  instead of pid_t, allowing proper namespace-aware PID conversion

- Convert PIDs using task_tgid_nr_ns(task, task_active_pid_ns(task))
  which returns the PID as the process sees it via getpid()

- Update 10 call sites to pass p->lead_thread (the GPU process)
  instead of p->lead_thread->pid or current (kernel worker)

This ensures SMI events report container-local PIDs, which is critical
for containerized GPU workloads to correctly correlate events with their
processes.

Tested-by: Andrew Martin mailto:[email protected]>>
Assisted-by: Claude:Sonnet 4 
mailto:[email protected]>>
Signed-off-by: Andrew Martin 
mailto:[email protected]>>
---
 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c|  8 +-
 drivers/gpu/drm/amd/amdkfd/kfd_process.c|  6 +-
 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 95 +
 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h | 14 +--
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c|  6 +-
 5 files changed, 76 insertions(+), 53 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
index 28dc6886c1ff..226e76ae0be7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
@@ -424,7 +424,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct 
svm_range *prange,
 migrate.dst = migrate.src + npages;
 scratch = (dma_addr_t *)(migrate.dst + npages);

-   kfd_smi_event_migration_start(node, p->lead_thread->pid,
+   kfd_smi_event_migration_start(node, p->lead_thread,
   start >> PAGE_SHIFT, end >> PAGE_SHIFT,
   0, node->id, prange->prefetch_loc,
   prange->preferred_loc, trigger);
@@ -462,7 +462,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct 
svm_range *prange,

 out_free:
 kvfree(buf);
-   kfd_smi_event_migration_end(node, p->lead_thread->pid,
+   kfd_smi_event_migration_end(node, p->lead_thread,
 start >> PAGE_SHIFT, end >> PAGE_SHIFT,
 0, node->id, trigger, r);
 out:
@@ -727,7 +727,7 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct 
svm_range *prange,
 migrate.fault_page = fault_page;
 scratch = (dma_addr_t *)(migrate.dst + npages);

-   kfd_smi_event_migration_start(node, p->lead_thread->pid,
+   kfd_smi_event_migration_start(node, p->lead_thread,
   start >> PAGE_SHIFT, end >> PAGE_SHIFT,
   node->id, 0, prange->prefetch_loc,
   prange->preferred_loc, trigger);
@@ -766,7 +766,7 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct 
svm_range *prange,

 out_free:
 kvfree(buf);
-   kfd_smi_event_migration_end(node, p->lead_thread->pid,
+   kfd_smi_event_migration_end(node, p->lead_thread,
 start >> PAGE_SHIFT, end >> PAGE_SHIFT,
 node->id, 0, trigger, r);
 out:
diff --git a/drivers/g

Re: [PATCH v3] drm/amdkfd: Fix SMI event PID reporting for containers

2026-05-27 Thread Kasiviswanathan, Harish
Public


Reviewed-by: Harish Kasiviswanathan 



From: amd-gfx  on behalf of Andrew 
Martin 
Sent: Wednesday, May 27, 2026 5:15 PM
To: [email protected] 
Cc: Martin, Andrew ; Martin, Andrew 
; Claude : Sonnet 4 
Subject: [PATCH v3] drm/amdkfd: Fix SMI event PID reporting for containers

SMI events were reporting incorrect PIDs in containerized environments,
causing test failures where container processes expected to see their
namespace-local PIDs but instead received global host PIDs.

The issue had two root causes:

1. Event functions were called from kernel context (page fault handlers,
   migration workers) where 'current' refers to the kernel worker thread,
   not the userspace GPU process that triggered the event.

2. PID conversion used task_tgid_vnr() which returns the PID in the
   caller's namespace (init namespace for kernel threads), not the task's
   own namespace.

This patch updates the SMI event interface:

- Change 8 event function signatures to accept task_struct pointer
  instead of pid_t, allowing proper namespace-aware PID conversion

- Convert PIDs using task_tgid_nr_ns(task, task_active_pid_ns(task))
  which returns the PID as the process sees it via getpid()

- Update 10 call sites to pass p->lead_thread (the GPU process)
  instead of p->lead_thread->pid or current (kernel worker)

This ensures SMI events report container-local PIDs, which is critical
for containerized GPU workloads to correctly correlate events with their
processes.

Tested-by: Andrew Martin 
Assisted-by: Claude:Sonnet 4 
Signed-off-by: Andrew Martin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c|  8 +-
 drivers/gpu/drm/amd/amdkfd/kfd_process.c|  6 +-
 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 95 +
 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h | 14 +--
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c|  6 +-
 5 files changed, 76 insertions(+), 53 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
index 28dc6886c1ff..226e76ae0be7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
@@ -424,7 +424,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct 
svm_range *prange,
 migrate.dst = migrate.src + npages;
 scratch = (dma_addr_t *)(migrate.dst + npages);

-   kfd_smi_event_migration_start(node, p->lead_thread->pid,
+   kfd_smi_event_migration_start(node, p->lead_thread,
   start >> PAGE_SHIFT, end >> PAGE_SHIFT,
   0, node->id, prange->prefetch_loc,
   prange->preferred_loc, trigger);
@@ -462,7 +462,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct 
svm_range *prange,

 out_free:
 kvfree(buf);
-   kfd_smi_event_migration_end(node, p->lead_thread->pid,
+   kfd_smi_event_migration_end(node, p->lead_thread,
 start >> PAGE_SHIFT, end >> PAGE_SHIFT,
 0, node->id, trigger, r);
 out:
@@ -727,7 +727,7 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct 
svm_range *prange,
 migrate.fault_page = fault_page;
 scratch = (dma_addr_t *)(migrate.dst + npages);

-   kfd_smi_event_migration_start(node, p->lead_thread->pid,
+   kfd_smi_event_migration_start(node, p->lead_thread,
   start >> PAGE_SHIFT, end >> PAGE_SHIFT,
   node->id, 0, prange->prefetch_loc,
   prange->preferred_loc, trigger);
@@ -766,7 +766,7 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct 
svm_range *prange,

 out_free:
 kvfree(buf);
-   kfd_smi_event_migration_end(node, p->lead_thread->pid,
+   kfd_smi_event_migration_end(node, p->lead_thread,
 start >> PAGE_SHIFT, end >> PAGE_SHIFT,
 node->id, 0, trigger, r);
 out:
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 419bb8086ccd..0ed315eb0bca 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -1975,7 +1975,7 @@ int kfd_process_evict_queues(struct kfd_process *p, 
uint32_t trigger)
 struct kfd_process_device *pdd = p->pdds[i];
 struct device *dev = pdd->dev->adev->dev;

-   kfd_smi_event_queue_eviction(pdd->dev, p->lead_thread->pid,
+   kfd_smi_event_queue_eviction(pdd->dev, p->lead_thread,
  trigger);

 r = pdd->dev->dqm->ops.evict_process_queues(pdd->dev->dqm,
@@ -2005,7 +2005,7 @@ int k

[PATCH v3] drm/amdkfd: Fix SMI event PID reporting for containers

2026-05-27 Thread Andrew Martin
SMI events were reporting incorrect PIDs in containerized environments,
causing test failures where container processes expected to see their
namespace-local PIDs but instead received global host PIDs.

The issue had two root causes:

1. Event functions were called from kernel context (page fault handlers,
   migration workers) where 'current' refers to the kernel worker thread,
   not the userspace GPU process that triggered the event.

2. PID conversion used task_tgid_vnr() which returns the PID in the
   caller's namespace (init namespace for kernel threads), not the task's
   own namespace.

This patch updates the SMI event interface:

- Change 8 event function signatures to accept task_struct pointer
  instead of pid_t, allowing proper namespace-aware PID conversion

- Convert PIDs using task_tgid_nr_ns(task, task_active_pid_ns(task))
  which returns the PID as the process sees it via getpid()

- Update 10 call sites to pass p->lead_thread (the GPU process)
  instead of p->lead_thread->pid or current (kernel worker)

This ensures SMI events report container-local PIDs, which is critical
for containerized GPU workloads to correctly correlate events with their
processes.

Tested-by: Andrew Martin 
Assisted-by: Claude:Sonnet 4 
Signed-off-by: Andrew Martin 
---
 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c|  8 +-
 drivers/gpu/drm/amd/amdkfd/kfd_process.c|  6 +-
 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 95 +
 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h | 14 +--
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c|  6 +-
 5 files changed, 76 insertions(+), 53 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
index 28dc6886c1ff..226e76ae0be7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
@@ -424,7 +424,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct 
svm_range *prange,
migrate.dst = migrate.src + npages;
scratch = (dma_addr_t *)(migrate.dst + npages);
 
-   kfd_smi_event_migration_start(node, p->lead_thread->pid,
+   kfd_smi_event_migration_start(node, p->lead_thread,
  start >> PAGE_SHIFT, end >> PAGE_SHIFT,
  0, node->id, prange->prefetch_loc,
  prange->preferred_loc, trigger);
@@ -462,7 +462,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct 
svm_range *prange,
 
 out_free:
kvfree(buf);
-   kfd_smi_event_migration_end(node, p->lead_thread->pid,
+   kfd_smi_event_migration_end(node, p->lead_thread,
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
0, node->id, trigger, r);
 out:
@@ -727,7 +727,7 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct 
svm_range *prange,
migrate.fault_page = fault_page;
scratch = (dma_addr_t *)(migrate.dst + npages);
 
-   kfd_smi_event_migration_start(node, p->lead_thread->pid,
+   kfd_smi_event_migration_start(node, p->lead_thread,
  start >> PAGE_SHIFT, end >> PAGE_SHIFT,
  node->id, 0, prange->prefetch_loc,
  prange->preferred_loc, trigger);
@@ -766,7 +766,7 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct 
svm_range *prange,
 
 out_free:
kvfree(buf);
-   kfd_smi_event_migration_end(node, p->lead_thread->pid,
+   kfd_smi_event_migration_end(node, p->lead_thread,
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
node->id, 0, trigger, r);
 out:
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 419bb8086ccd..0ed315eb0bca 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -1975,7 +1975,7 @@ int kfd_process_evict_queues(struct kfd_process *p, 
uint32_t trigger)
struct kfd_process_device *pdd = p->pdds[i];
struct device *dev = pdd->dev->adev->dev;
 
-   kfd_smi_event_queue_eviction(pdd->dev, p->lead_thread->pid,
+   kfd_smi_event_queue_eviction(pdd->dev, p->lead_thread,
 trigger);
 
r = pdd->dev->dqm->ops.evict_process_queues(pdd->dev->dqm,
@@ -2005,7 +2005,7 @@ int kfd_process_evict_queues(struct kfd_process *p, 
uint32_t trigger)
if (n_evicted == 0)
break;
 
-   kfd_smi_event_queue_restore(pdd->dev, p->lead_thread->pid);
+   kfd_smi_event_queue_restore(pdd->dev, p->lead_thread);
 
if (pdd->dev->dqm->ops.restore_process_queues(pdd->dev->dqm,
  &pdd->qpd))
@@ -2028,7 +2028,7 @@ int kfd_process_restore_queues(struct kfd_process *p)