drm/amdkfd: Add an optional argument into update queue operation(v2)
authorLang Yu <lang.yu@amd.com>
Fri, 8 Oct 2021 04:47:18 +0000 (12:47 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 Oct 2021 18:26:13 +0000 (14:26 -0400)
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: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Lang Yu <lang.yu@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

index f8fce9d05f50cbb9bc572e6faf98cd454b3a11c9..533b27b35fc987469e8cf1231219baeadb2846d3 100644 (file)
@@ -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
index c8719682c4da071567f107bc6fcac642eef81c54..499fc0ea387fabfe14c2e2c21b398e50c0ca663c 100644 (file)
@@ -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);
index 6e6918ccedfdb0d7350c91a9356d5a6a55085afd..965e17c5dbb49abfbcdc3e6217531d7a7077f809 100644 (file)
@@ -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,
index 064914e1e8d627b79b0d489ad4d82a16191bd861..00bcaa11ff5775319c215bfb8f839be69107cd5e 100644 (file)
@@ -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;
 
index c7fb59ca597fb052cd26563599de94bfe101873b..7f11017801359725eb538ff67e37086067e97187 100644 (file)
@@ -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;
 
index 7f4e102ff4bd348065cd3f3183cfb8a32a670bd5..152f29b28a79632a189586238cf927e7d7fcb465 100644 (file)
@@ -188,7 +188,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,
@@ -212,7 +212,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 v9_mqd *m;
 
@@ -366,7 +367,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,
@@ -381,7 +382,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 v9_sdma_mqd *m;
 
index 33dbd22d290f338aa50bcad1413fe155870e8925..4a8f3a06e6df4a7d034ca774529ddaa55a997a8b 100644 (file)
@@ -150,7 +150,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,
@@ -167,8 +167,8 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,
 }
 
 static void __update_mqd(struct mqd_manager *mm, void *mqd,
-                       struct queue_properties *q, unsigned int mtype,
-                       unsigned int atc_bit)
+                       struct queue_properties *q, struct mqd_update_info *minfo,
+                       unsigned int mtype, unsigned int atc_bit)
 {
        struct vi_mqd *m;
 
@@ -238,9 +238,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, MTYPE_CC, 1);
+       __update_mqd(mm, mqd, q, minfo, MTYPE_CC, 1);
 }
 
 static uint32_t read_doorbell_id(void *mqd)
@@ -251,9 +252,10 @@ static uint32_t read_doorbell_id(void *mqd)
 }
 
 static void update_mqd_tonga(struct mqd_manager *mm, void *mqd,
-                       struct queue_properties *q)
+                       struct queue_properties *q,
+                       struct mqd_update_info *minfo)
 {
-       __update_mqd(mm, mqd, q, MTYPE_UC, 0);
+       __update_mqd(mm, mqd, q, minfo, MTYPE_UC, 0);
 }
 
 static int destroy_mqd(struct mqd_manager *mm, void *mqd,
@@ -317,9 +319,10 @@ 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)
 {
-       __update_mqd(mm, mqd, q, MTYPE_UC, 0);
+       __update_mqd(mm, mqd, q, minfo, MTYPE_UC, 0);
 }
 
 static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
@@ -336,7 +339,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,
@@ -349,7 +352,8 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
 }
 
 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 vi_sdma_mqd *m;
 
index 30f08f1606bba14f193991659c241bfc24102ea3..d758a57b17e2e6b6111243118460833bc6edc8f2 100644 (file)
@@ -482,6 +482,8 @@ struct queue_properties {
                            (q).queue_percent > 0 &&    \
                            !(q).is_evicted)
 
+struct mqd_update_info;
+
 /**
  * struct queue
  *
index 243dd1efcdbf5cde9be708dc1a280cd2c8c0d808..37529592457def3c34edc27f14a12a2053cc6ae0 100644 (file)
@@ -121,7 +121,7 @@ int pqm_set_gws(struct process_queue_manager *pqm, unsigned int qid,
        pdd->qpd.num_gws = gws ? amdgpu_amdkfd_get_num_gws(dev->kgd) : 0;
 
        return pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm,
-                                                       pqn->q);
+                                                       pqn->q, NULL);
 }
 
 void kfd_process_dequeue_from_all_devices(struct kfd_process *p)
@@ -429,7 +429,7 @@ int pqm_update_queue(struct process_queue_manager *pqm, unsigned int qid,
        pqn->q->properties.priority = p->priority;
 
        retval = pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm,
-                                                       pqn->q);
+                                                       pqn->q, NULL);
        if (retval != 0)
                return retval;
 
@@ -457,7 +457,7 @@ int pqm_set_cu_mask(struct process_queue_manager *pqm, unsigned int qid,
        pqn->q->properties.cu_mask = p->cu_mask;
 
        retval = pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm,
-                                                       pqn->q);
+                                                       pqn->q, NULL);
        if (retval != 0)
                return retval;