Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Jan 2010 14:25:18 +0000 (UTC)
From:      Randall Stewart <rrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r202809 - head/sys/mips/rmi
Message-ID:  <201001221425.o0MEPIC9094891@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rrs
Date: Fri Jan 22 14:25:17 2010
New Revision: 202809
URL: http://svn.freebsd.org/changeset/base/202809

Log:
  This hopefully will fix the network problem I was seeing.
  Basically the msg ring interrupt was being re-enabled
  inside a spinlock as the thread set it self up for rescheduling.
  This won't work since inside the re-enable is another
  spin lock.. which means on return from the reenable
  the  interrupts have been reenabled. Thus you would
  get a clock int and end up panicing holding a spin
  lock to long :-o

Modified:
  head/sys/mips/rmi/xlr_machdep.c

Modified: head/sys/mips/rmi/xlr_machdep.c
==============================================================================
--- head/sys/mips/rmi/xlr_machdep.c	Fri Jan 22 14:09:15 2010	(r202808)
+++ head/sys/mips/rmi/xlr_machdep.c	Fri Jan 22 14:25:17 2010	(r202809)
@@ -618,18 +618,14 @@ msgring_process_fast_intr(void *arg)
 	 */
 	disable_msgring_int(NULL);
 	it->i_pending = 1;
+	thread_lock(td);
 	if (TD_AWAITING_INTR(td)) {
-		thread_lock(td);
 		CTR3(KTR_INTR, "%s: schedule pid %d (%s)", __func__, p->p_pid,
 		    p->p_comm);
 		TD_CLR_IWAIT(td);
 		sched_add(td, SRQ_INTR);
-		thread_unlock(td);
-	} else {
-		CTR4(KTR_INTR, "%s: pid %d (%s): state %d",
-		    __func__, p->p_pid, p->p_comm, td->td_state);
 	}
-
+	thread_unlock(td);
 }
 
 #define MIT_DEAD 4
@@ -668,13 +664,17 @@ msgring_process(void *arg)
 			atomic_store_rel_int(&ithd->i_pending, 0);
 			xlr_msgring_handler(NULL);
 		}
+		enable_msgring_int(NULL);
 		if (!ithd->i_pending && !(ithd->i_flags & MIT_DEAD)) {
 			thread_lock(td);
+			if (ithd->i_pending) {
+			  thread_unlock(td);
+			  continue;
+			}
 			sched_class(td, PRI_ITHD);
 			TD_SET_IWAIT(td);
-			thread_unlock(td);
-			enable_msgring_int(NULL);
 			mi_switch(SW_VOL, NULL);
+			thread_unlock(td);
 		}
 	}
 



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