Messages in this thread | | | Subject | Re: [PATCH] irqchip/apple-aic: fix irq_disable from within irq handlers | From | Hector Martin <> | Date | Wed, 18 Aug 2021 20:35:04 +0900 |
| |
*Puts on kernel maintainer hat again*
Sorry for the delay. I've been spending too much time on hardware RE recently...
On 12/08/2021 19.09, Sven Peter wrote: > When disable_irq_nosync for an interrupt is called from within its > interrupt handler, this interrupt is only marked as disabled with the > intention to mask it when it triggers again. > The AIC hardware however automatically masks the interrupt when it is read. > aic_irq_eoi then unmasks it again if it's not disabled *and* not masked. > This results in a state mismatch between the hardware state and the > state kept in irq_data: The hardware interrupt is masked but > IRQD_IRQ_MASKED is not set. Any further calls to unmask_irq will directly > return and the interrupt can never be enabled again. > > Fix this by keeping the hardware and irq_data state in sync by unmasking in > aic_irq_eoi if and only if the irq_data state also assumes the interrupt to > be unmasked. > > Fixes: 76cde2639411 ("irqchip/apple-aic: Add support for the Apple Interrupt Controller") > Signed-off-by: Sven Peter <sven@svenpeter.dev> > --- > drivers/irqchip/irq-apple-aic.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/irqchip/irq-apple-aic.c b/drivers/irqchip/irq-apple-aic.c > index b8c06bd8659e..6fc145aacaf0 100644 > --- a/drivers/irqchip/irq-apple-aic.c > +++ b/drivers/irqchip/irq-apple-aic.c > @@ -226,7 +226,7 @@ static void aic_irq_eoi(struct irq_data *d) > * Reading the interrupt reason automatically acknowledges and masks > * the IRQ, so we just unmask it here if needed. > */ > - if (!irqd_irq_disabled(d) && !irqd_irq_masked(d)) > + if (!irqd_irq_masked(d)) > aic_irq_unmask(d); > } > >
Looks good to me. I can't remember exactly where this code came from, but looking again at the irqchip code it's clear that the mask state and hardware mask always have to be in sync.
Acked-by: Hector Martin <marcan@marcan.st>
-- Hector Martin (marcan@marcan.st) Public Key: https://mrcn.st/pub
| |