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