From 56f221b6389e7ab99c30bbf01c71998ae92fc584 Mon Sep 17 00:00:00 2001 From: xinhui pan Date: Tue, 15 Jun 2021 15:11:07 +0800 Subject: [PATCH] drm/amdkfd: Walk through list with dqm lock hold To avoid any list corruption. Signed-off-by: xinhui pan Reviewed-by: Felix Kuehling Signed-off-by: Alex Deucher --- .../drm/amd/amdkfd/kfd_device_queue_manager.c | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index c069fa259b30..16a1713808c2 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -1709,7 +1709,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, struct qcm_process_device *qpd) { int retval; - struct queue *q, *next; + struct queue *q; struct kernel_queue *kq, *kq_next; struct mqd_manager *mqd_mgr; struct device_process_node *cur, *next_dpn; @@ -1766,6 +1766,19 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, qpd->reset_wavefronts = false; } + /* Lastly, free mqd resources. + * Do free_mqd() after dqm_unlock to avoid circular locking. + */ + while (!list_empty(&qpd->queues_list)) { + q = list_first_entry(&qpd->queues_list, struct queue, list); + mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( + q->properties.type)]; + list_del(&q->list); + qpd->queue_count--; + dqm_unlock(dqm); + mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj); + dqm_lock(dqm); + } dqm_unlock(dqm); /* Outside the DQM lock because under the DQM lock we can't do @@ -1774,17 +1787,6 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, if (found) kfd_dec_compute_active(dqm->dev); - /* Lastly, free mqd resources. - * Do free_mqd() after dqm_unlock to avoid circular locking. - */ - list_for_each_entry_safe(q, next, &qpd->queues_list, list) { - mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( - q->properties.type)]; - list_del(&q->list); - qpd->queue_count--; - mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj); - } - return retval; }