Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Feb 2010 05:43:31 +0000 (UTC)
From:      Neel Natu <neel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r203743 - head/sys/mips/mips
Message-ID:  <201002100543.o1A5hWMp097233@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002100543.o1A5hWMp097233>