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 >