[PATCH v6 9/9] drm/amdgpu: cleanup leftover queues
Alex Deucher
alexdeucher at gmail.com
Wed Sep 20 15:26:08 UTC 2023
On Fri, Sep 8, 2023 at 12:25 PM Shashank Sharma <shashank.sharma at 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.deucher at amd.com>
> Cc: Christian Koenig <christian.koenig at amd.com>
> Suggested-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
> Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
> Signed-off-by: Shashank Sharma <shashank.sharma at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at 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
>
More information about the amd-gfx
mailing list