Date: Fri, 22 May 2015 13:43:33 +0300 From: Andriy Gapon <avg@FreeBSD.org> To: Konstantin Belousov <kib@FreeBSD.org>, src-committers@FreeBSD.org, svn-src-all@FreeBSD.org, svn-src-head@FreeBSD.org Subject: Re: svn commit: r283109 - head/sys/x86/x86 Message-ID: <555F0855.4030805@FreeBSD.org> In-Reply-To: <201505191421.t4JEL1vd075036@svn.freebsd.org> References: <201505191421.t4JEL1vd075036@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 19/05/2015 17:21, Konstantin Belousov wrote: > 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 Thanks! > 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) > -- Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?555F0855.4030805>