svn commit: r203743 - head/sys/mips/mips
Neel Natu
neel at FreeBSD.org
Wed Feb 10 05:43:32 UTC 2010
Author: neel
Date: Wed Feb 10 05:43:31 2010
New Revision: 203743
URL: http://svn.freebsd.org/changeset/base/203743
Log:
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.
Modified:
head/sys/mips/mips/exception.S
Modified: head/sys/mips/mips/exception.S
==============================================================================
--- head/sys/mips/mips/exception.S Wed Feb 10 04:12:55 2010 (r203742)
+++ head/sys/mips/mips/exception.S Wed Feb 10 05:43:31 2010 (r203743)
@@ -728,6 +728,18 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE
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
*/
DO_AST
More information about the svn-src-all
mailing list