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]> --- 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 -- 2.34.1
