monitor/mwait support for idle

Jeff Roberson jroberson at jroberson.net
Sat Apr 19 22:47:22 UTC 2008


On Sat, 19 Apr 2008, Alfred Perlstein wrote:

> Jeff, this is very interesting!
>
> I have a question about your earlier email.  You mentioned that the
> IPIs and communication to enter the idle state (hlt, mwait) is expensive.
>
> Perhaps something to track the number of times entering and exiting
> the state would be a good idea.

options COUNT_IPIS will tell you the number of physical IPIs delivered.
options SCHED_STATS has statistics on the number of times we were 
preempted by a remote cpu.

>
> Additionally a tuneable for the number of spins before entering the
> state might be a good idea.  Perhaps spinning for "1" or "2" (where
> 1/2 is one unit of hz) before entering idle might be a good compromise
> to avoid hlt enter/exit thrashing.
>
> Let me know your thoughts on this.  It may already be implemented
> so just saying "we do that" would be fine too. :)

Presently it's kern.sched.idlespinthresh and idlespins.

I'm not sure I intend to leave those sysctls indefinitely.

Jeff

>
> -Alfred
>
> * Jeff Roberson <jroberson at jroberson.net> [080419 03:56] wrote:
>> 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
>> _______________________________________________
>> freebsd-arch at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> To unsubscribe, send any mail to "freebsd-arch-unsubscribe at freebsd.org"
>
> -- 
> - Alfred Perlstein
>


More information about the freebsd-arch mailing list