Add pc sampling release when process release, it will force to
stop all activate sessions with this process.

Signed-off-by: James Zhu <james....@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c | 21 ++++++++++++++++++++
 drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.h |  1 +
 drivers/gpu/drm/amd/amdkfd/kfd_process.c     |  3 +++
 3 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
index 04cc25c79a76..a05dd8b1a7da 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
@@ -300,6 +300,27 @@ static int kfd_pc_sample_destroy(struct kfd_process_device 
*pdd, uint32_t trace_
        return 0;
 }
 
+void kfd_pc_sample_release(struct kfd_process_device *pdd)
+{
+       struct pc_sampling_entry *pcs_entry;
+       struct idr *idp;
+       uint32_t id;
+
+       /* force to release all PC sampling task for this process */
+       idp = &pdd->dev->pcs_data.hosttrap_entry.base.pc_sampling_idr;
+       mutex_lock(&pdd->dev->pcs_data.mutex);
+       idr_for_each_entry(idp, pcs_entry, id) {
+               if (pcs_entry->pdd != pdd)
+                       continue;
+               mutex_unlock(&pdd->dev->pcs_data.mutex);
+               if (pcs_entry->enabled)
+                       kfd_pc_sample_stop(pdd, pcs_entry);
+               kfd_pc_sample_destroy(pdd, id, pcs_entry);
+               mutex_lock(&pdd->dev->pcs_data.mutex);
+       }
+       mutex_unlock(&pdd->dev->pcs_data.mutex);
+}
+
 int kfd_pc_sample(struct kfd_process_device *pdd,
                                        struct kfd_ioctl_pc_sample_args __user 
*args)
 {
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.h
index 4eeded4ea5b6..6175563ca9be 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.h
@@ -30,5 +30,6 @@
 
 int kfd_pc_sample(struct kfd_process_device *pdd,
                                        struct kfd_ioctl_pc_sample_args __user 
*args);
+void kfd_pc_sample_release(struct kfd_process_device *pdd);
 
 #endif /* KFD_PC_SAMPLING_H_ */
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 6bc9dcfad484..1f8d6098dfb2 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -43,6 +43,7 @@ struct mm_struct;
 #include "kfd_svm.h"
 #include "kfd_smi_events.h"
 #include "kfd_debug.h"
+#include "kfd_pc_sampling.h"
 
 /*
  * List of struct kfd_process (field kfd_process).
@@ -1021,6 +1022,8 @@ static void kfd_process_destroy_pdds(struct kfd_process 
*p)
                pr_debug("Releasing pdd (topology id %d) for process (pasid 
0x%x)\n",
                                pdd->dev->id, p->pasid);
 
+               kfd_pc_sample_release(pdd);
+
                kfd_process_device_destroy_cwsr_dgpu(pdd);
                kfd_process_device_destroy_ib_mem(pdd);
 
-- 
2.25.1

Reply via email to