Skip to content

Commit 4de0e52

Browse files
committed
ARCv2: STAR 9000814690: Really Re-enable interrupts to avoid deadlocks
The issue was, on HS when interrupt is taken, IRQ_ACT is set and that is NOT cleared unless we do RTIE (or manually clear it). Linux interrupt handling has top and bottom halves. Latter lead to softirqs (which can reschedule) AND expect interrupts to be REALLY re-enabled which was NOT happening for us since we only SETI, dont clear IRQ_ACT So we can have a state when both cores have taken interrupt (IRQ_ACT set), get rescheduled, both send IPI and wait in CSD lock which will never be cleared as cores can't take the pending IPI IRQ due to existing IRQ_ACT set. So local_irq_enable() now drops the IRQ_ACT.act bit to re-enable IRQs. Signed-off-by: Vineet Gupta <[email protected]>
1 parent 0d7b885 commit 4de0e52

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

arch/arc/include/asm/irqflags-arcv2.h

+5
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ static inline void arch_local_irq_restore(unsigned long flags)
6464
*/
6565
static inline void arch_local_irq_enable(void)
6666
{
67+
unsigned int irqact = read_aux_reg(AUX_IRQ_ACT);
68+
69+
if (irqact & 0xffff)
70+
write_aux_reg(AUX_IRQ_ACT, irqact & ~0xffff);
71+
6772
__asm__ __volatile__(" seti \n" : : : "memory");
6873
}
6974

0 commit comments

Comments
 (0)