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

Signed-off-by: James Zhu <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c | 25 ++++++++++++++++++++
 drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.h |  1 +
 drivers/gpu/drm/amd/amdkfd/kfd_process.c     |  3 +++
 3 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
index ea9478c3738a..783844ddd82f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c
@@ -337,6 +337,31 @@ 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;
+       do {
+               pcs_entry = NULL;
+               mutex_lock(&pdd->dev->pcs_data.mutex);
+               idr_for_each_entry(idp, pcs_entry, id) {
+                       if (pcs_entry->pdd != pdd)
+                               continue;
+                       break;
+               }
+               mutex_unlock(&pdd->dev->pcs_data.mutex);
+               if (pcs_entry) {
+                       if (pcs_entry->enabled)
+                               kfd_pc_sample_stop(pdd, pcs_entry);
+                       kfd_pc_sample_destroy(pdd, id, pcs_entry);
+               }
+       } while (pcs_entry);
+}
+
 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 4a450abf9fa9..bbad0b0848df 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