Commit f756e631 authored by Harish Kasiviswanathan's avatar Harish Kasiviswanathan Committed by Alex Deucher

drm/amdkfd: Fix compute profile switching

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: default avatarHarish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Signed-off-by: default avatarEric Huang <JinhuiEric.Huang@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c6fd980a
...@@ -462,6 +462,7 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, ...@@ -462,6 +462,7 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,
kfd->pdev = pdev; kfd->pdev = pdev;
kfd->init_complete = false; kfd->init_complete = false;
kfd->kfd2kgd = f2g; kfd->kfd2kgd = f2g;
atomic_set(&kfd->compute_profile, 0);
mutex_init(&kfd->doorbell_mutex); mutex_init(&kfd->doorbell_mutex);
memset(&kfd->doorbell_available_index, 0, memset(&kfd->doorbell_available_index, 0,
...@@ -1036,6 +1037,21 @@ void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd) ...@@ -1036,6 +1037,21 @@ void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)
atomic_inc(&kfd->sram_ecc_flag); 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) #if defined(CONFIG_DEBUG_FS)
/* This function will send a package to HIQ to hang the HWS /* This function will send a package to HIQ to hang the HWS
......
...@@ -811,8 +811,8 @@ static int register_process(struct device_queue_manager *dqm, ...@@ -811,8 +811,8 @@ static int register_process(struct device_queue_manager *dqm,
retval = dqm->asic_ops.update_qpd(dqm, qpd); retval = dqm->asic_ops.update_qpd(dqm, qpd);
if (dqm->processes_count++ == 0) dqm->processes_count++;
amdgpu_amdkfd_set_compute_idle(dqm->dev->kgd, false); kfd_inc_compute_active(dqm->dev);
dqm_unlock(dqm); dqm_unlock(dqm);
...@@ -835,9 +835,8 @@ static int unregister_process(struct device_queue_manager *dqm, ...@@ -835,9 +835,8 @@ static int unregister_process(struct device_queue_manager *dqm,
if (qpd == cur->qpd) { if (qpd == cur->qpd) {
list_del(&cur->list); list_del(&cur->list);
kfree(cur); kfree(cur);
if (--dqm->processes_count == 0) dqm->processes_count--;
amdgpu_amdkfd_set_compute_idle( kfd_dec_compute_active(dqm->dev);
dqm->dev->kgd, true);
goto out; goto out;
} }
} }
...@@ -1542,6 +1541,7 @@ static int process_termination_nocpsch(struct device_queue_manager *dqm, ...@@ -1542,6 +1541,7 @@ static int process_termination_nocpsch(struct device_queue_manager *dqm,
list_del(&cur->list); list_del(&cur->list);
kfree(cur); kfree(cur);
dqm->processes_count--; dqm->processes_count--;
kfd_dec_compute_active(dqm->dev);
break; break;
} }
} }
...@@ -1629,6 +1629,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, ...@@ -1629,6 +1629,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
list_del(&cur->list); list_del(&cur->list);
kfree(cur); kfree(cur);
dqm->processes_count--; dqm->processes_count--;
kfd_dec_compute_active(dqm->dev);
break; break;
} }
} }
......
...@@ -279,6 +279,9 @@ struct kfd_dev { ...@@ -279,6 +279,9 @@ struct kfd_dev {
/* SRAM ECC flag */ /* SRAM ECC flag */
atomic_t sram_ecc_flag; atomic_t sram_ecc_flag;
/* Compute Profile ref. count */
atomic_t compute_profile;
}; };
enum kfd_mempool { enum kfd_mempool {
...@@ -978,6 +981,10 @@ int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p); ...@@ -978,6 +981,10 @@ int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p);
bool kfd_is_locked(void); 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 */ /* Debugfs */
#if defined(CONFIG_DEBUG_FS) #if defined(CONFIG_DEBUG_FS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment