Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 May 2015 14:21:01 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r283109 - head/sys/x86/x86
Message-ID:  <201505191421.t4JEL1vd075036@svn.freebsd.org>

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



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