On 5/19/26 13:17, Sunil Khatri wrote: > mutex fence_drv_lock is destroyed in amdgpu_userq_fence_driver_free > also in one of the jump condition mutex_destroy is also called leading > to double mutex_destroy. > > So rearranging the code so amdgpu_userq_fence_driver_free takes care > of the clean up along with mutex_destroy.
Please also move amdgpu_userq_fence_driver_free() into amdgpu_userq.c or eventually completely drop it. The cleanup done in there is actually on the queue and not the fence driver. Regards, Christian. > > Signed-off-by: Sunil Khatri <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > index eedea84c5e0f..3bfb9ae2cb3a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c > @@ -748,12 +748,12 @@ amdgpu_userq_create(struct drm_file *filp, union > drm_amdgpu_userq *args) > INIT_DELAYED_WORK(&queue->hang_detect_work, > amdgpu_userq_hang_detect_work); > > - mutex_init(&queue->fence_drv_lock); > - xa_init_flags(&queue->fence_drv_xa, XA_FLAGS_ALLOC); > r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv); > if (r) > goto free_queue; > > + xa_init_flags(&queue->fence_drv_xa, XA_FLAGS_ALLOC); > + mutex_init(&queue->fence_drv_lock); > /* Make sure the queue can actually run with those virtual addresses. */ > r = amdgpu_bo_reserve(fpriv->vm.root.bo, false); > if (r) > @@ -844,7 +844,6 @@ amdgpu_userq_create(struct drm_file *filp, union > drm_amdgpu_userq *args) > amdgpu_bo_reserve(fpriv->vm.root.bo, true); > amdgpu_userq_buffer_vas_list_cleanup(adev, queue); > amdgpu_bo_unreserve(fpriv->vm.root.bo); > - mutex_destroy(&queue->fence_drv_lock); > free_fence_drv: > amdgpu_userq_fence_driver_free(queue); > free_queue:
