Author: kib
Date: Tue May 19 14:21:00 2015
New Revision: 283109
URL: https://svnweb.freebsd.org/changeset/base/283109

Log:
  When sleeping in Sx state using MWAIT instruction, accept fast wakeup
  requests from writes to the monitored line.
  
  Submitted by: avg

Modified:
  head/sys/x86/x86/cpu_machdep.c

Modified: head/sys/x86/x86/cpu_machdep.c
==============================================================================
--- head/sys/x86/x86/cpu_machdep.c      Tue May 19 14:05:15 2015        
(r283108)
+++ head/sys/x86/x86/cpu_machdep.c      Tue May 19 14:21:00 2015        
(r283109)
@@ -101,6 +101,10 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_pager.h>
 #include <vm/vm_param.h>
 
+#define        STATE_RUNNING   0x0
+#define        STATE_MWAIT     0x1
+#define        STATE_SLEEPING  0x2
+
 /*
  * Machine dependent boot() routine
  *
@@ -134,13 +138,24 @@ acpi_cpu_idle_mwait(uint32_t mwait_hint)
 {
        int *state;
 
-       state = (int *)PCPU_PTR(monitorbuf);
        /*
         * XXXKIB.  Software coordination mode should be supported,
         * but all Intel CPUs provide hardware coordination.
         */
+
+       state = (int *)PCPU_PTR(monitorbuf);
+       KASSERT(*state == STATE_SLEEPING,
+               ("cpu_mwait_cx: wrong monitorbuf state"));
+       *state = STATE_MWAIT;
        cpu_monitor(state, 0, 0);
-       cpu_mwait(MWAIT_INTRBREAK, mwait_hint);
+       if (*state == STATE_MWAIT)
+               cpu_mwait(MWAIT_INTRBREAK, mwait_hint);
+
+       /*
+        * We should exit on any event that interrupts mwait, because
+        * that event might be a wanted interrupt.
+        */
+       *state = STATE_RUNNING;
 }
 
 /* Get current clock frequency for the given cpu id. */
@@ -231,10 +246,6 @@ static int idle_mwait = 1;         /* Use MONIT
 SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RWTUN, &idle_mwait,
     0, "Use MONITOR/MWAIT for short idle");
 
-#define        STATE_RUNNING   0x0
-#define        STATE_MWAIT     0x1
-#define        STATE_SLEEPING  0x2
-
 #ifndef PC98
 static void
 cpu_idle_acpi(sbintime_t sbt)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to