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
