On 7/14/26 10:10, Srinivasan Shanmugam wrote:
> Pending WAIT_EVENT records for queue-scoped events store queue pointers
> and own queue references while queued.
> 
> Remove all WAIT_EVENT records associated with a user queue before USERQ
> drops its queue reference during queue teardown. This mirrors the
> EVENTFD queue cleanup path and prevents pending records from keeping
> stale queue state after the queue is removed from USERQ ownership.
> 
> Cc: Alex Deucher <[email protected]>
> Cc: Christian König <[email protected]>
> Signed-off-by: Srinivasan Shanmugam <[email protected]>
> Reviewed-by: Alex Deucher <[email protected]>

Reviewed-by: Christian König <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 21 +++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h |  2 ++
>  2 files changed, 23 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index 65b20d7a4b18..aa17e55d52e8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -56,6 +56,24 @@ amdgpu_userq_eventfd_mgr(struct amdgpu_userq_mgr 
> *userq_mgr)
>       return &fpriv->eventfd_mgr;
>  }
>  
> +/*
> + * Get the per-file wait-event manager associated with this userq manager.
> + */
> +struct amdgpu_wait_event_mgr *
> +amdgpu_userq_wait_event_mgr(struct amdgpu_userq_mgr *userq_mgr)
> +{
> +     struct amdgpu_fpriv *fpriv;
> +
> +     if (WARN_ON(!userq_mgr || !userq_mgr->file))
> +             return NULL;
> +
> +     fpriv = userq_mgr->file->driver_priv;
> +     if (WARN_ON(!fpriv))
> +             return NULL;
> +
> +     return &fpriv->wait_event_mgr;
> +}
> +
>  u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev)
>  {
>       int i;
> @@ -1035,6 +1053,7 @@ int amdgpu_userq_ioctl(struct drm_device *dev, void 
> *data,
>                       return -ENOENT;
>  
>               amdgpu_eventfd_remove_queue(&fpriv->eventfd_mgr, queue);
> +             amdgpu_wait_event_remove_queue(&fpriv->wait_event_mgr, queue);
>  
>               amdgpu_userq_put(queue);
>               break;
> @@ -1421,6 +1440,8 @@ void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr 
> *userq_mgr)
>  
>               amdgpu_eventfd_remove_queue(amdgpu_userq_eventfd_mgr(userq_mgr),
>                                           queue);
> +             
> amdgpu_wait_event_remove_queue(amdgpu_userq_wait_event_mgr(userq_mgr),
> +                                            queue);
>  
>               amdgpu_userq_put(queue);
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> index 526e007e300e..5d6d68d26c90 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> @@ -204,4 +204,6 @@ int amdgpu_userq_input_cwsr_params_validate(
>       struct amdgpu_cwsr_params *cwsr_params);
>  struct amdgpu_eventfd_mgr *
>  amdgpu_userq_eventfd_mgr(struct amdgpu_userq_mgr *userq_mgr);
> +struct amdgpu_wait_event_mgr *
> +amdgpu_userq_wait_event_mgr(struct amdgpu_userq_mgr *userq_mgr);
>  #endif

Reply via email to