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]> --- 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 7f605501c84c..43fd60b1dc6d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -54,6 +54,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; @@ -874,6 +892,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; @@ -1244,6 +1263,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 e1a7d0dbc436..ff76241a3446 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h @@ -182,4 +182,6 @@ void amdgpu_userq_gem_va_unmap_validate(struct amdgpu_device *adev, struct amdgpu_bo_va_mapping *mapping); 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
