Commit 80614c50 authored by Haoxiang Li's avatar Haoxiang Li Committed by Alex Deucher
Browse files

drm/amdkfd: fix a memory leak in device_queue_manager_init()



If dqm->ops.initialize() fails, add deallocate_hiq_sdma_mqd()
to release the memory allocated by allocate_hiq_sdma_mqd().
Move deallocate_hiq_sdma_mqd() up to ensure proper function
visibility at the point of use.

Fixes: 11614c36 ("drm/amdkfd: Allocate MQD trunk for HIQ and SDMA")
Signed-off-by: default avatarHaoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
Signed-off-by: default avatarFelix Kuehling <felix.kuehling@amd.com>
Reviewed-by: default avatarOak Zeng <Oak.Zeng@amd.com>
Reviewed-by: default avatarFelix Kuehling <felix.kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
(cherry picked from commit b7cccc82)
Cc: stable@vger.kernel.org
parent b6dff005
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -2919,6 +2919,14 @@ static int allocate_hiq_sdma_mqd(struct device_queue_manager *dqm)
	return retval;
}

static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
				    struct kfd_mem_obj *mqd)
{
	WARN(!mqd, "No hiq sdma mqd trunk to free");

	amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
}

struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
{
	struct device_queue_manager *dqm;
@@ -3042,19 +3050,14 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
		return dqm;
	}

	if (!dev->kfd->shared_resources.enable_mes)
		deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);

out_free:
	kfree(dqm);
	return NULL;
}

static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
				    struct kfd_mem_obj *mqd)
{
	WARN(!mqd, "No hiq sdma mqd trunk to free");

	amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
}

void device_queue_manager_uninit(struct device_queue_manager *dqm)
{
	dqm->ops.stop(dqm);