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