On 7/14/26 10:02, Srinivasan Shanmugam wrote:
> Signal USERQ_EOP EVENTFD subscriptions from the USERQ interrupt path.
>
> The EOP interrupt already identifies the queue that completed. Use the
> queue object directly to notify matching EVENTFD subscribers.
>
> Routing notifications through the queue object keeps delivery tied to
> the queue instance that generated the completion event, avoiding
> ambiguities from reused queue identifiers or doorbell indices.
>
> EVENTFD remains notification-only and carries no event payload.
>
> v2: (per Christian)
> - Move USERQ_EOP EVENTFD signaling into amdgpu_userq_process_fence_irq().
> - Reuse the existing doorbell-to-queue lookup instead of duplicating it
> in the interrupt handler.
> - Keep fence processing and EVENTFD notification handling together in a
> single helper.
>
> 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 | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index fbf783946f6d..ab3ef3a9f655 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -215,6 +215,7 @@ void amdgpu_userq_process_fence_irq(struct amdgpu_device
> *adev, u32 doorbell)
> {
> struct xarray *xa = &adev->userq_doorbell_xa;
> struct amdgpu_usermode_queue *queue;
> + struct amdgpu_eventfd_mgr *eventfd_mgr;
> unsigned long flags;
> int r;
>
> @@ -232,6 +233,11 @@ void amdgpu_userq_process_fence_irq(struct amdgpu_device
> *adev, u32 doorbell)
> /* Restart the timer when there are still fences pending */
> if (r == 1)
> amdgpu_userq_start_hang_detect_work(queue);
> +
> + eventfd_mgr = amdgpu_userq_eventfd_mgr(queue->userq_mgr);
> + amdgpu_eventfd_signal(eventfd_mgr,
> + DRM_AMDGPU_EVENT_TYPE_USERQ_EOP,
> + queue);
> }
> xa_unlock_irqrestore(xa, flags);
> }