lkml.org 
[lkml]   [2021]   [Jul]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.13 129/189] drm/amdkfd: Walk through list with dqm lock hold
    Date
    From: xinhui pan <xinhui.pan@amd.com>

    [ Upstream commit 56f221b6389e7ab99c30bbf01c71998ae92fc584 ]

    To avoid any list corruption.

    Signed-off-by: xinhui pan <xinhui.pan@amd.com>
    Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../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 e9b3e2e32bf8..f0bad74af230 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,24 +1766,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;
    }
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-07-06 13:40    [W:4.030 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site