Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Apr 2008 12:47:47 -1000 (HST)
From:      Jeff Roberson <jroberson@jroberson.net>
To:        Alfred Perlstein <alfred@freebsd.org>
Cc:        arch@freebsd.org
Subject:   Re: monitor/mwait support for idle
Message-ID:  <20080419124622.Q942@desktop>
In-Reply-To: <20080419192152.GX95731@elvis.mu.org>
References:  <20080419004911.R942@desktop> <20080419192152.GX95731@elvis.mu.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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@freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> To unsubscribe, send any mail to "freebsd-arch-unsubscribe@freebsd.org"
>
> -- 
> - Alfred Perlstein
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080419124622.Q942>