Skip to content

Commit

Permalink
ARCv2: STAR 9000814690: Really Re-enable interrupts to avoid deadlocks
Browse files Browse the repository at this point in the history
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 <vgupta@synopsys.com>
  • Loading branch information
Vineet Gupta committed Jun 22, 2015
1 parent 0d7b885 commit 4de0e52
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions arch/arc/include/asm/irqflags-arcv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ static inline void arch_local_irq_restore(unsigned long flags)
*/
static inline void arch_local_irq_enable(void)
{
unsigned int irqact = read_aux_reg(AUX_IRQ_ACT);

if (irqact & 0xffff)
write_aux_reg(AUX_IRQ_ACT, irqact & ~0xffff);

__asm__ __volatile__(" seti \n" : : : "memory");
}

Expand Down

0 comments on commit 4de0e52

Please sign in to comment.