[PATCH v2 2/2] drm/amdkfd: Walk through list with dqm lock hold

Felix Kuehling felix.kuehling at amd.com
Thu Jun 17 21:52:45 UTC 2021


Am 2021-06-17 um 8:02 a.m. schrieb xinhui pan:
> To avoid any list corruption.
>
> Signed-off-by: xinhui pan <xinhui.pan at amd.com>

This patch is

Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>


> ---
>  .../drm/amd/amdkfd/kfd_device_queue_manager.c | 22 ++++++++++---------
>  1 file changed, 12 insertions(+), 10 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 63a9a19a3987..d62374746c93 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> @@ -1722,7 +1722,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;
> @@ -1779,24 +1779,26 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
>  		qpd->reset_wavefronts = false;
>  	}
>  
> -	dqm_unlock(dqm);
> -
> -	/* Outside the DQM lock because under the DQM lock we can't do
> -	 * reclaim or take other locks that others hold while reclaiming.
> -	 */
> -	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) {
> +	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
> +	 * reclaim or take other locks that others hold while reclaiming.
> +	 */
> +	if (found)
> +		kfd_dec_compute_active(dqm->dev);
>  
>  	return retval;
>  }


More information about the amd-gfx mailing list