Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Sep 2011 14:19:35 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r225875 - head/sys/powerpc/powerpc
Message-ID:  <201109291419.p8TEJZQs026318@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Sep 29 14:19:34 2011
New Revision: 225875
URL: http://svn.freebsd.org/changeset/base/225875

Log:
  Handle the race in cpu_idle() when due to the critical section CPU could get
  into sleep after receiving interrupt, delaying interrupt thread execution
  indefinitely until the next interrupt arrive.
  
  Reviewed by:	nwhitehorn
  MFC after:	3 days

Modified:
  head/sys/powerpc/powerpc/cpu.c

Modified: head/sys/powerpc/powerpc/cpu.c
==============================================================================
--- head/sys/powerpc/powerpc/cpu.c	Thu Sep 29 10:42:51 2011	(r225874)
+++ head/sys/powerpc/powerpc/cpu.c	Thu Sep 29 14:19:34 2011	(r225875)
@@ -553,6 +553,11 @@ cpu_idle_60x(void)
 	vers = mfpvr() >> 16;
 
 #ifdef AIM
+	mtmsr(msr & ~PSL_EE);
+	if (sched_runnable()) {
+		mtmsr(msr);
+		return;
+	}
 	switch (vers) {
 	case IBM970:
 	case IBM970FX:
@@ -583,6 +588,11 @@ cpu_idle_e500(void)
 	msr = mfmsr();
 
 #ifdef E500
+	mtmsr(msr & ~PSL_EE);
+	if (sched_runnable()) {
+		mtmsr(msr);
+		return;
+	}
 	/* Freescale E500 core RM section 6.4.1. */
 	__asm __volatile("msync; mtmsr %0; isync" ::
 	    "r" (msr | PSL_WE));



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