svn commit: r283109 - head/sys/x86/x86
Konstantin Belousov
kib at FreeBSD.org
Tue May 19 14:21:01 UTC 2015
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)
More information about the svn-src-head
mailing list