On 3/20/26 09:41, Prike Liang wrote:
> It needs to drop the old userq fence dereference, otherwise
> it can't be walked during freeing the queue.
>
> Signed-off-by: Prike Liang <[email protected]>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> index 9df62f71f27c..f1acd785c27d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> @@ -105,9 +105,21 @@ int amdgpu_userq_fence_driver_alloc(struct amdgpu_device
> *adev,
> get_task_comm(fence_drv->timeline_name, current);
>
> xa_lock_irqsave(&adev->userq_xa, flags);
> - r = xa_err(__xa_store(&adev->userq_xa, userq->doorbell_index,
> - fence_drv, GFP_KERNEL));
> + struct amdgpu_userq_fence_driver *old;
> +
> + old = __xa_store(&adev->userq_xa, userq->doorbell_index,
> + fence_drv, GFP_KERNEL);
> xa_unlock_irqrestore(&adev->userq_xa, flags);
> +
> + if (xa_is_err(old)) {
> + r = xa_err(old);
> + } else if (old) {
> + /* Doorbell index was reused: drop the replaced driver's ref */
> + amdgpu_userq_fence_driver_put(old);
What? Why is a doorbell index re-used while there is still an userq fence
driver for it around?
That doesn't make to much sense.
Regards,
Christian.
> + r = 0;
> + } else {
> + r = 0;
> + }
> if (r)
> goto free_seq64;
>