On Wed, Apr 2, 2025 at 8:11 AM Sunil Khatri <sunil.kha...@amd.com> wrote:
>
> mes_userq_unmap could fail due to MES fw unable to
> unmap the queue and the return value needs is not
> to be ignored and handled on first step itself.
>
> Also queue->queue_active set to false in this function
> but only when the queue is removed successfully. If the
> queue is not removed successfully then dont change the active
> state of the queue.
>
> Signed-off-by: Sunil Khatri <sunil.kha...@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c 
> b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> index b469b800119f..8f6c12a78f3a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> @@ -144,7 +144,7 @@ static int mes_userq_map(struct amdgpu_userq_mgr *uq_mgr,
>         return 0;
>  }
>
> -static void mes_userq_unmap(struct amdgpu_userq_mgr *uq_mgr,
> +static int mes_userq_unmap(struct amdgpu_userq_mgr *uq_mgr,
>                             struct amdgpu_usermode_queue *queue)
>  {
>         struct amdgpu_device *adev = uq_mgr->adev;
> @@ -159,9 +159,12 @@ static void mes_userq_unmap(struct amdgpu_userq_mgr 
> *uq_mgr,
>         amdgpu_mes_lock(&adev->mes);
>         r = adev->mes.funcs->remove_hw_queue(&adev->mes, &queue_input);
>         amdgpu_mes_unlock(&adev->mes);
> -       if (r)
> +       if (r) {
>                 DRM_ERROR("Failed to unmap queue in HW, err (%d)\n", r);
> +               return r;
> +       }
>         queue->queue_active = false;
> +       return 0;
>  }
>
>  static int mes_userq_create_ctx_space(struct amdgpu_userq_mgr *uq_mgr,
> @@ -345,7 +348,8 @@ mes_userq_mqd_destroy(struct amdgpu_userq_mgr *uq_mgr,
>         struct amdgpu_device *adev = uq_mgr->adev;
>
>         if (queue->queue_active)
> -               mes_userq_unmap(uq_mgr, queue);
> +               if (mes_userq_unmap(uq_mgr, queue))
> +                       return;

If we return early here, we'll leak the userq props and mqd and it
will also lead to a runtime pm imbalance.

Alex

>
>         amdgpu_userqueue_destroy_object(uq_mgr, &queue->fw_obj);
>         kfree(queue->userq_prop);
> @@ -358,10 +362,8 @@ mes_userq_mqd_destroy(struct amdgpu_userq_mgr *uq_mgr,
>  static int mes_userq_suspend(struct amdgpu_userq_mgr *uq_mgr,
>                                    struct amdgpu_usermode_queue *queue)
>  {
> -       if (queue->queue_active) {
> -               mes_userq_unmap(uq_mgr, queue);
> -               queue->queue_active = false;
> -       }
> +       if (queue->queue_active)
> +               return mes_userq_unmap(uq_mgr, queue);
>
>         return 0;
>  }
> --
> 2.34.1
>

Reply via email to