monitor/mwait support for idle

Jeff Roberson jroberson at jroberson.net
Sat Apr 19 10:56:20 UTC 2008


http://people.freebsd.org/~jeff/mwait.diff

This patch implements support for the x86/amd64 monitor and mwait 
instructions in the idle loop.  This also implements idle loop selection 
via a sysctl string.  The following loops are supported, in 
decreasing order of performance and power consumption:

spin      - Simply returns
mwait     - Always use mwait to sleep.  CPU enters C0 or C1 depending on
             how busy it is.
mwait_hlt - Use mwait when busy but fall back to hlt/acpi when not.
hlt       - pure hlt loop
acpi      - uses acpi_cpu_idle if available and hlt if not.  This is the 
default.

This also introduces a new MD function 'cpu_wake_idle' which allows MD to 
use a faster mechanism than IPI to wake idle.  In the spin case this is a 
nop.  For hlt and acpi we resort to an IPI.  If the processor is sleeping 
in mwait we can simply write to a per-cpu buffer to wake it up.  This 
saves considerable cpu cycles on the initiator and target.

The prototype for cpu_idle() changed to accept an integer indication of 
how busy we are from the scheduler.  If we have been busy MD code may 
choose to enter a higher power state on idle.  ULE now spins for a short 
while if we have been very busy regardless of MD settings.

There seems to be a problem entering C0 on the Xeons I have access to.  It 
returns from mwait too quickly.  Hopefully intel will respond to my email 
about that.

Feedback welcome.

Thanks,
Jeff


More information about the freebsd-arch mailing list