On Fri, Sep 8, 2023 at 12:25 PM Shashank Sharma <shashank.sha...@amd.com> wrote:
>
> This patch adds code to cleanup any leftover userqueues which
> a user might have missed to destroy due to a crash or any other
> programming error.
>
> Cc: Alex Deucher <alexander.deuc...@amd.com>
> Cc: Christian Koenig <christian.koe...@amd.com>
> Suggested-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
> Signed-off-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
> Signed-off-by: Shashank Sharma <shashank.sha...@amd.com>

Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c | 25 +++++++++++++++----
>  1 file changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> index a311d4949bb8..0c78579b0791 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> @@ -61,12 +61,23 @@ amdgpu_userqueue_get_doorbell_index(struct 
> amdgpu_userq_mgr *uq_mgr,
>         return index;
>  }
>
> +static void
> +amdgpu_userqueue_cleanup(struct amdgpu_userq_mgr *uq_mgr,
> +                        struct amdgpu_usermode_queue *queue,
> +                        int queue_id)
> +{
> +       const struct amdgpu_userq_funcs *uq_funcs = 
> uq_mgr->userq_funcs[queue->queue_type];
> +
> +       uq_funcs->mqd_destroy(uq_mgr, queue);
> +       idr_remove(&uq_mgr->userq_idr, queue_id);
> +       kfree(queue);
> +}
> +
>  static int
>  amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id)
>  {
>         struct amdgpu_fpriv *fpriv = filp->driver_priv;
>         struct amdgpu_userq_mgr *uq_mgr = &fpriv->userq_mgr;
> -       const struct amdgpu_userq_funcs *uq_funcs;
>         struct amdgpu_usermode_queue *queue;
>
>         mutex_lock(&uq_mgr->userq_mutex);
> @@ -77,12 +88,10 @@ amdgpu_userqueue_destroy(struct drm_file *filp, int 
> queue_id)
>                 mutex_unlock(&uq_mgr->userq_mutex);
>                 return -EINVAL;
>         }
> -       uq_funcs = uq_mgr->userq_funcs[queue->queue_type];
> -       uq_funcs->mqd_destroy(uq_mgr, queue);
> +
>         amdgpu_bo_unpin(queue->db_bo);
>         amdgpu_bo_unref(&queue->db_bo);
> -       idr_remove(&uq_mgr->userq_idr, queue_id);
> -       kfree(queue);
> +       amdgpu_userqueue_cleanup(uq_mgr, queue, queue_id);
>
>         mutex_unlock(&uq_mgr->userq_mutex);
>         return 0;
> @@ -207,6 +216,12 @@ int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr 
> *userq_mgr, struct amdgpu_devi
>
>  void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr)
>  {
> +       uint32_t queue_id;
> +       struct amdgpu_usermode_queue *queue;
> +
> +       idr_for_each_entry(&userq_mgr->userq_idr, queue, queue_id)
> +               amdgpu_userqueue_cleanup(userq_mgr, queue, queue_id);
> +
>         idr_destroy(&userq_mgr->userq_idr);
>         mutex_destroy(&userq_mgr->userq_mutex);
>  }
> --
> 2.42.0
>

Reply via email to