From: Harish Kasiviswanathan <harish.kasiviswanat...@amd.com>

Fix compute profile switching on process termination.

Add a dedicated reference counter to keep track of entry/exit to/from
compute profile. This enables switching compute profiles for other
reasons than process creation or termination.

Signed-off-by: Harish Kasiviswanathan <harish.kasiviswanat...@amd.com>
Signed-off-by: Eric Huang <jinhuieric.hu...@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehl...@amd.com>
Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_device.c          | 16 ++++++++++++++++
 .../drm/amd/amdkfd/kfd_device_queue_manager.c    | 11 ++++++-----
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h            |  7 +++++++
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index c1e4d44d6137..8202a5db3a35 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -462,6 +462,7 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,
        kfd->pdev = pdev;
        kfd->init_complete = false;
        kfd->kfd2kgd = f2g;
+       atomic_set(&kfd->compute_profile, 0);
 
        mutex_init(&kfd->doorbell_mutex);
        memset(&kfd->doorbell_available_index, 0,
@@ -1036,6 +1037,21 @@ void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)
                atomic_inc(&kfd->sram_ecc_flag);
 }
 
+void kfd_inc_compute_active(struct kfd_dev *kfd)
+{
+       if (atomic_inc_return(&kfd->compute_profile) == 1)
+               amdgpu_amdkfd_set_compute_idle(kfd->kgd, false);
+}
+
+void kfd_dec_compute_active(struct kfd_dev *kfd)
+{
+       int count = atomic_dec_return(&kfd->compute_profile);
+
+       if (count == 0)
+               amdgpu_amdkfd_set_compute_idle(kfd->kgd, true);
+       WARN_ONCE(count < 0, "Compute profile ref. count error");
+}
+
 #if defined(CONFIG_DEBUG_FS)
 
 /* This function will send a package to HIQ to hang the HWS
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 38c66b8ffd31..bac1f36d38a2 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -772,8 +772,8 @@ static int register_process(struct device_queue_manager 
*dqm,
 
        retval = dqm->asic_ops.update_qpd(dqm, qpd);
 
-       if (dqm->processes_count++ == 0)
-               amdgpu_amdkfd_set_compute_idle(dqm->dev->kgd, false);
+       dqm->processes_count++;
+       kfd_inc_compute_active(dqm->dev);
 
        dqm_unlock(dqm);
 
@@ -796,9 +796,8 @@ static int unregister_process(struct device_queue_manager 
*dqm,
                if (qpd == cur->qpd) {
                        list_del(&cur->list);
                        kfree(cur);
-                       if (--dqm->processes_count == 0)
-                               amdgpu_amdkfd_set_compute_idle(
-                                       dqm->dev->kgd, true);
+                       dqm->processes_count--;
+                       kfd_dec_compute_active(dqm->dev);
                        goto out;
                }
        }
@@ -1479,6 +1478,7 @@ static int process_termination_nocpsch(struct 
device_queue_manager *dqm,
                        list_del(&cur->list);
                        kfree(cur);
                        dqm->processes_count--;
+                       kfd_dec_compute_active(dqm->dev);
                        break;
                }
        }
@@ -1562,6 +1562,7 @@ static int process_termination_cpsch(struct 
device_queue_manager *dqm,
                        list_del(&cur->list);
                        kfree(cur);
                        dqm->processes_count--;
+                       kfd_dec_compute_active(dqm->dev);
                        break;
                }
        }
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index d1d60336172a..87328c96b0f1 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -279,6 +279,9 @@ struct kfd_dev {
 
        /* SRAM ECC flag */
        atomic_t sram_ecc_flag;
+
+       /* Compute Profile ref. count */
+       atomic_t compute_profile;
 };
 
 enum kfd_mempool {
@@ -977,6 +980,10 @@ int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, 
struct kfd_process *p);
 
 bool kfd_is_locked(void);
 
+/* Compute profile */
+void kfd_inc_compute_active(struct kfd_dev *dev);
+void kfd_dec_compute_active(struct kfd_dev *dev);
+
 /* Debugfs */
 #if defined(CONFIG_DEBUG_FS)
 
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to