Commit c6e559eb authored by Lang Yu's avatar Lang Yu Committed by Alex Deucher
Browse files

drm/amdkfd: Add an optional argument into update queue operation(v2)



Currently, queue is updated with data in queue_properties.
And all allocated resource in queue_properties will not
be freed until the queue is destroyed.

But some properties(e.g., cu mask) bring some memory
management headaches(e.g., memory leak) and make code
complex. Actually they have been copied to mqd and
don't have to persist in queue_properties.

Add an argument into update queue to pass such properties,
then we can remove them from queue_properties.

v2: Don't use void *.

Suggested-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarLang Yu <lang.yu@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f7e05343
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -557,7 +557,8 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
	return retval;
}

static int update_queue(struct device_queue_manager *dqm, struct queue *q)
static int update_queue(struct device_queue_manager *dqm, struct queue *q,
			struct mqd_update_info *minfo)
{
	int retval = 0;
	struct mqd_manager *mqd_mgr;
@@ -605,7 +606,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q)
		}
	}

	mqd_mgr->update_mqd(mqd_mgr, q->mqd, &q->properties);
	mqd_mgr->update_mqd(mqd_mgr, q->mqd, &q->properties, minfo);

	/*
	 * check active state vs. the previous state and modify
+1 −1
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ struct device_queue_manager_ops {
				struct queue *q);

	int	(*update_queue)(struct device_queue_manager *dqm,
				struct queue *q);
				struct queue *q, struct mqd_update_info *minfo);

	int	(*register_process)(struct device_queue_manager *dqm,
					struct qcm_process_device *qpd);
+2 −1
Original line number Diff line number Diff line
@@ -80,7 +80,8 @@ struct mqd_manager {
				struct mm_struct *mms);

	void	(*update_mqd)(struct mqd_manager *mm, void *mqd,
				struct queue_properties *q);
				struct queue_properties *q,
				struct mqd_update_info *minfo);

	int	(*destroy_mqd)(struct mqd_manager *mm, void *mqd,
				enum kfd_preempt_type type,
+14 −9
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
	*mqd = m;
	if (gart_addr)
		*gart_addr = addr;
	mm->update_mqd(mm, m, q);
	mm->update_mqd(mm, m, q, NULL);
}

static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
@@ -152,7 +152,7 @@ static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
	if (gart_addr)
		*gart_addr = mqd_mem_obj->gpu_addr;

	mm->update_mqd(mm, m, q);
	mm->update_mqd(mm, m, q, NULL);
}

static void free_mqd(struct mqd_manager *mm, void *mqd,
@@ -185,7 +185,8 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
}

static void __update_mqd(struct mqd_manager *mm, void *mqd,
			struct queue_properties *q, unsigned int atc_bit)
			struct queue_properties *q, struct mqd_update_info *minfo,
			unsigned int atc_bit)
{
	struct cik_mqd *m;

@@ -221,9 +222,10 @@ static void __update_mqd(struct mqd_manager *mm, void *mqd,
}

static void update_mqd(struct mqd_manager *mm, void *mqd,
			struct queue_properties *q)
			struct queue_properties *q,
			struct mqd_update_info *minfo)
{
	__update_mqd(mm, mqd, q, 1);
	__update_mqd(mm, mqd, q, minfo, 1);
}

static uint32_t read_doorbell_id(void *mqd)
@@ -234,13 +236,15 @@ static uint32_t read_doorbell_id(void *mqd)
}

static void update_mqd_hawaii(struct mqd_manager *mm, void *mqd,
			struct queue_properties *q)
			struct queue_properties *q,
			struct mqd_update_info *minfo)
{
	__update_mqd(mm, mqd, q, 0);
	__update_mqd(mm, mqd, q, minfo, 0);
}

static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
				struct queue_properties *q)
			struct queue_properties *q,
			struct mqd_update_info *minfo)
{
	struct cik_sdma_rlc_registers *m;

@@ -318,7 +322,8 @@ static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
}

static void update_mqd_hiq(struct mqd_manager *mm, void *mqd,
				struct queue_properties *q)
			struct queue_properties *q,
			struct mqd_update_info *minfo)
{
	struct cik_mqd *m;

+6 −4
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
	*mqd = m;
	if (gart_addr)
		*gart_addr = addr;
	mm->update_mqd(mm, m, q);
	mm->update_mqd(mm, m, q, NULL);
}

static int load_mqd(struct mqd_manager *mm, void *mqd,
@@ -162,7 +162,8 @@ static int hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,
}

static void update_mqd(struct mqd_manager *mm, void *mqd,
		      struct queue_properties *q)
			struct queue_properties *q,
			struct mqd_update_info *minfo)
{
	struct v10_compute_mqd *m;

@@ -311,7 +312,7 @@ static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
	if (gart_addr)
		*gart_addr = mqd_mem_obj->gpu_addr;

	mm->update_mqd(mm, m, q);
	mm->update_mqd(mm, m, q, NULL);
}

static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
@@ -326,7 +327,8 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
#define SDMA_RLC_DUMMY_DEFAULT 0xf

static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
		struct queue_properties *q)
			struct queue_properties *q,
			struct mqd_update_info *minfo)
{
	struct v10_sdma_mqd *m;

Loading