On Fri, Sep 8, 2023 at 12:25 PM Shashank Sharma <shashank.sharma@xxxxxxx> 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@xxxxxxx> > Cc: Christian Koenig <christian.koenig@xxxxxxx> > Suggested-by: Bas Nieuwenhuizen <bas@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Bas Nieuwenhuizen <bas@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Shashank Sharma <shashank.sharma@xxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > 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 >