Commit c2e1b3a4 authored by Ben Goz's avatar Ben Goz Committed by Oded Gabbay

drm/amdkfd: Fix logic of destroy_queue_nocpsch()

This patch rewrites destroy_queue_nocpsch() as the current logic that is
implemented in the function is completely flawed.

This function is used only in non-HWS mode.
Signed-off-by: default avatarBen Goz <ben.goz@amd.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 04df25d1
...@@ -294,7 +294,8 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm, ...@@ -294,7 +294,8 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
struct queue *q) struct queue *q)
{ {
int retval; int retval;
struct mqd_manager *mqd, *mqd_sdma; struct mqd_manager *mqd;
BUG_ON(!dqm || !q || !q->mqd || !qpd); BUG_ON(!dqm || !q || !q->mqd || !qpd);
retval = 0; retval = 0;
...@@ -302,33 +303,32 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm, ...@@ -302,33 +303,32 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
pr_debug("kfd: In Func %s\n", __func__); pr_debug("kfd: In Func %s\n", __func__);
mutex_lock(&dqm->lock); mutex_lock(&dqm->lock);
mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_COMPUTE);
if (mqd == NULL) {
retval = -ENOMEM;
goto out;
}
mqd_sdma = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_SDMA); if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) {
if (mqd_sdma == NULL) { mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_COMPUTE);
mutex_unlock(&dqm->lock); if (mqd == NULL) {
return -ENOMEM; retval = -ENOMEM;
goto out;
}
deallocate_hqd(dqm, q);
} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_SDMA);
if (mqd == NULL) {
retval = -ENOMEM;
goto out;
}
dqm->sdma_queue_count--;
deallocate_sdma_queue(dqm, q->sdma_id);
} }
retval = mqd->destroy_mqd(mqd, q->mqd, retval = mqd->destroy_mqd(mqd, q->mqd,
KFD_PREEMPT_TYPE_WAVEFRONT, KFD_PREEMPT_TYPE_WAVEFRONT_RESET,
QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS, QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS,
q->pipe, q->queue); q->pipe, q->queue);
if (retval != 0) if (retval != 0)
goto out; goto out;
if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE)
deallocate_hqd(dqm, q);
else if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
dqm->sdma_queue_count--;
deallocate_sdma_queue(dqm, q->sdma_id);
}
mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj);
list_del(&q->list); list_del(&q->list);
......
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