From ed6933b2524e577d466cbb42d0cfb8f42a359d23 Mon Sep 17 00:00:00 2001 From: Neel Natu Date: Wed, 10 Feb 2010 05:43:31 +0000 Subject: [PATCH] Enable interrupts before doing AST processing to avoid a deadlock. Specifically on an SMP kernel it was observed that if both the processors are doing an exit1() via ast()->postsig()->sigexit() then we will deadlock. This happens because exit1() calls vmspace_exit() that in turn calls pmap_invalidate_all(). This function tries to do a smp_rendezvous() which blocks because the other processor is not responding to IPIs - because it too is doing AST processing with interrupts disabled. --- sys/mips/mips/exception.S | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S index 1d511ee74315..262701eb124e 100644 --- a/sys/mips/mips/exception.S +++ b/sys/mips/mips/exception.S @@ -727,6 +727,18 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) jalr k0 sw a3, STAND_RA_OFFSET(sp) # for debugging +/* + * Enable interrupts before doing ast(). + * + * On SMP kernels the AST processing might trigger IPI to other processors. + * If that processor is also doing AST processing with interrupts disabled + * then we may deadlock. + */ + mfc0 a0, COP_0_STATUS_REG + or a0, a0, SR_INT_ENAB + mtc0 a0, COP_0_STATUS_REG + ITLBNOPFIX + /* * DO_AST enabled interrupts */