Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+18 −18
Original line number Original line Diff line number Diff line
@@ -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,
	pr_debug("kfd: In Func %s\n", __func__);
	pr_debug("kfd: In Func %s\n", __func__);


	mutex_lock(&dqm->lock);
	mutex_lock(&dqm->lock);

	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) {
		mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_COMPUTE);
		mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_COMPUTE);
		if (mqd == NULL) {
		if (mqd == NULL) {
			retval = -ENOMEM;
			retval = -ENOMEM;
			goto out;
			goto out;
		}
		}

		deallocate_hqd(dqm, q);
	mqd_sdma = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_SDMA);
	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
	if (mqd_sdma == NULL) {
		mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_SDMA);
		mutex_unlock(&dqm->lock);
		if (mqd == NULL) {
		return -ENOMEM;
			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);