Re: [PATCH] drm/amdgpu/mes12: use basic+ unmapped-doorbell handling for concurrent AQL queues

Alex Deucher <[email protected]> Thu, 30 Jul 2026 10:49:52 -0400
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <CADnq5_MiL8fgKUWGnWhVG91PEXcB6gCOxAbfZ0re=Z2pwm4nXg@mail.gmail.com>
On Thu, Jul 30, 2026 at 5:48 AM Jesse Zhang <[email protected]> wrote:
>
> On gfx12, concurrent dispatch from multiple AQL compute user queues in one
> process can intermittently stall one queue's first dispatch: its completion
> never signals, while queue creation succeeds and no obvious dmesg error is
> reported.
>
> With unmapped-doorbell mode 1 (basic), a doorbell hit only sets a coarse
> level-wide hasReadyQueues flag. Queue-level selection can still be filtered by
> work_done/is_queue_ready, so under concurrency the ringing queue may be
> skipped and its new dispatch not fetched in time.
>
> Switch mes12 to mode 2 (basic+). In this mode, MES consumes per-queue
> CP_UNMAPPED_QUEUE bitmaps, identifies the ringing queue, and clears that
> queue's work_done in the unmapped-doorbell path so it is reconsidered
> promptly by scheduling.
>
> Tested on the amd-unified-interface branch on gfx1201: multiple
> concurrent AQL compute queues now pass repeatedly.
>
> Signed-off-by: Jesse Zhang <[email protected]>

Acked-by: Alex Deucher <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/mes_v12_0.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
> index 04465804c254..5f9e28f8f007 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
> @@ -990,10 +990,21 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
>         /*
>          * Keep oversubscribe timer for sdma . When we have unmapped doorbell
>          * handling support, other queue will not use the oversubscribe timer.
> -        * handling  mode - 0: disabled; 1: basic version; 2: basic+ version
> +        * handling  mode - 0: disabled; 1: basic; 2: basic+; 3: basic++
> +        *
> +        * Use basic+ (2): on an unmapped-queue doorbell ring MES reads the
> +        * per-queue CP_UNMAPPED_QUEUE bitmap to identify exactly which queue(s)
> +        * rang and clears their work_done so the scheduler re-maps them. The
> +        * basic (1) mode only sets a coarse level-wide "ready" flag without
> +        * clearing the ringing queue's work_done, so a concurrent AQL compute
> +        * queue whose doorbell rings after work_done was set gets skipped by the
> +        * scheduler and its dispatch is silently lost (intermittent hang with
> +        * multiple concurrent queues). basic++ (3) additionally map_gang()s in
> +        * the interrupt handler for lower latency, but basic+ is sufficient and
> +        * touches less state.
>          */
>         mes_set_hw_res_pkt.oversubscription_timer = mes_rev < 0x8b ? 0 : 50;
> -       mes_set_hw_res_pkt.unmapped_doorbell_handling = 1;
> +       mes_set_hw_res_pkt.unmapped_doorbell_handling = 2;
>
>         if (amdgpu_mes_log_enable) {
>                 mes_set_hw_res_pkt.enable_mes_event_int_logging = 1;
> --
> 2.49.0
>