[PATCH v2 1/2] irqchip/riscv-aplic: Use handle_edge_irq() for edge-triggered MSI sources
Thomas Gleixner
tglx at kernel.org
Tue Nov 10 16:07:47 PST 2026
On Tue, Nov 10 2026 at 12:06, Troy Mitchell wrote:
> In MSI mode, all APLIC interrupts are handled by handle_fasteoi_irq().
> For an edge-triggered source the APLIC forwards each edge as an MSI and
> keeps no state after that, so an edge which the CPU side drops is lost.
> After an affinity change, the next MSI can arrive on the new CPU while
> the previous one is still being handled on the old CPU, and
> handle_fasteoi_irq() then drops it.
>
> The fasteoi flow also never calls irq_ack(), which is where IMSIC applies
> an affinity change that was deferred while a previous vector move was in
> flight. Such a change stays pending, and later affinity changes of the
> interrupt only update the pending mask.
>
> Use handle_edge_irq() for edge-triggered sources. It acknowledges the
> interrupt before invoking the handler. If the interrupt is still in
> progress on the previous target CPU, it either waits for it to complete
> or marks it pending so that the handler runs again.
>
> Fixes: ca8df97fe679 ("irqchip/riscv-aplic: Add support for MSI-mode")
> Signed-off-by: Troy Mitchell <troy.mitchell at linux.dev>
Not that I care at all about showing up in some made up git-tag metrics,
but in general it's a matter of courtesy to point out that the solution
to the problem was suggested by someone else, no?
> + /*
> + * Edge-triggered sources are fire and forget, so they must be
> + * acknowledged before the handler runs. The edge flow handler also
> + * replays an interrupt which arrives while the previous one is
> + * still being handled on another CPU after an affinity change.
> + */
> + if (type & IRQ_TYPE_EDGE_BOTH)
> + irq_set_chip_handler_name_locked(d, irq_data_get_irq_chip(d),
> + handle_edge_irq, "edge");
> + else
> + irq_set_chip_handler_name_locked(d, irq_data_get_irq_chip(d),
> + handle_fasteoi_irq, "fasteoi");
> +
https://docs.kernel.org/process/maintainer-tip.html#bracket-rules
Thanks,
tglx
More information about the linux-riscv
mailing list