Re: [PATCH] gpio: dwapb: Add robust error handling in interrupt handler
From: Linus Walleij
Date: Fri Jul 03 2026 - 17:22:05 EST
Hi Liang,
thanks for your patch!
Top posting so tglx get the context...
On Fri, Jul 3, 2026 at 3:49 PM Liang Hao <haohlliang@xxxxxxxxx> wrote:
> The current interrupt handler silently continues if an interrupt
> handling fails, which may lead to interrupt storms. Add proper
> error handling to gracefully recover from failed interrupt
> handling.
>
> When generic_handle_irq() fails, the following recovery actions are
> taken:
> - Write EOI to clear the pending interrupt
> - Mask the interrupt to prevent immediate re-triggering
> - Disable the interrupt to stop further interrupts on this line
>
> These measures prevent the system from being overwhelmed by repeated
> unhandled interrupts while logging a rate-limited warning for
> debugging purposes.
>
> Signed-off-by: Liang Hao <haohlliang@xxxxxxxxx>
> ---
> drivers/gpio/gpio-dwapb.c | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
> index 7b92b233fafe..dec700e3cfb0 100644
> --- a/drivers/gpio/gpio-dwapb.c
> +++ b/drivers/gpio/gpio-dwapb.c
> @@ -209,8 +209,20 @@ static u32 dwapb_do_irq(struct dwapb_gpio *gpio)
> for_each_set_bit(hwirq, &irq_status, DWAPB_MAX_GPIOS) {
> int gpio_irq = irq_find_mapping(gen_gc->gc.irq.domain, hwirq);
> u32 irq_type = irq_get_trigger_type(gpio_irq);
> -
> - generic_handle_irq(gpio_irq);
> + int ret;
> + u32 val_intmask, val_inten;
> +
> + ret = generic_handle_irq(gpio_irq);
> + if (ret) {
> + dev_warn_ratelimited(gpio->dev, "Failed to handle irq %d\n", gpio_irq);
> + /* Clear the interrupt */
> + dwapb_write(gpio, GPIO_PORTA_EOI, BIT(hwirq));
> + val_intmask = dwapb_read(gpio, GPIO_INTMASK);
> + dwapb_write(gpio, GPIO_INTMASK, val_intmask | BIT(hwirq));
> + val_inten = dwapb_read(gpio, GPIO_INTEN);
> + dwapb_write(gpio, GPIO_INTEN, val_inten & ~BIT(hwirq));
> + continue;
> + }
>
> if ((irq_type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
> dwapb_toggle_trigger(gpio, hwirq);
Ugh I don't know if that is how you'r supposed to deal with the return value
from generic_handle_irq(), we better get tglx eyes on this.
Yours,
Linus Walleij