On 6/12/26 07:52, Srinivasan Shanmugam wrote:
> Signal USERQ EOP EVENTFD subscriptions from the USERQ IRQ path.
>
> The EOP interrupt already tells us which queue completed. Use that queue
> to wake up the matching EVENTFD subscribers.
>
> This keeps EVENTFD routing based on the actual queue object instead of
> queue identifiers or doorbell offsets, avoiding issues with queue
> identifier reuse.
>
> EVENTFD remains notification-only.
>
> Cc: Alex Deucher <[email protected]>
> Cc: Christian König <[email protected]>
> Signed-off-by: Srinivasan Shanmugam <[email protected]>
> ---
> drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> index 1941bfbcbfbf..565447d7790b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
> @@ -6488,7 +6488,22 @@ static int gfx_v11_0_eop_irq(struct amdgpu_device
> *adev,
> DRM_DEBUG("IH: CP EOP\n");
>
> if (adev->enable_mes && doorbell_offset) {
> + struct amdgpu_usermode_queue *queue;
> + struct amdgpu_eventfd_mgr *eventfd_mgr;
> + struct xarray *xa = &adev->userq_doorbell_xa;
> + unsigned long flags;
> +
> amdgpu_userq_process_fence_irq(adev, doorbell_offset);
> +
> + xa_lock_irqsave(xa, flags);
> + queue = xa_load(xa, doorbell_offset);
> + if (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);
Please put that into amdgpu_userq_process_fence_irq(), apart from that looks
good to me.
Regards,
Christian.
> } else {
> me_id = (entry->ring_id & 0x0c) >> 2;
> pipe_id = (entry->ring_id & 0x03) >> 0;