On 01/31/2014 10:39 AM, Preeti U Murthy wrote:
Hi Peter,
On 01/31/2014 02:32 PM, Peter Zijlstra wrote:
On Fri, Jan 31, 2014 at 02:15:47PM +0530, Preeti Murthy wrote:
If the driver does its own random mapping that will break the governor logic. So yes, the states are ordered, the higher the index is, the more you save power and the higher the exit latency is.
The above point holds true for only the ladder governor which sees the idle states indexed in the increasing order of target_residency/exit_latency.
However this is not true as far as I can see in the menu governor. It acknowledges the dynamic ordering of idle states as can be seen in the menu_select() function in the menu governor, where the idle state for the CPU gets chosen. You will notice that, even if it is found that the predicted idle time of the CPU is smaller than the target residency of an idle state, the governor continues to search for suitable idle states in the higher indexed states although it should have halted if the idle states' were ordered according to their target residency.. The same holds for exit_latency.
Hence I think this patch would make sense only with additional information like exit_latency or target_residency is present for the scheduler. The idle state index alone will not be sufficient.
Alternatively, can we enforce sanity on the cpuidle infrastructure to make the index naturally ordered? If not, please explain why :-)
The commit id 71abbbf856a0e70 says that there are SOCs which could have their target_residency and exit_latency values change at runtime. This commit thus removed the ordering of the idle states according to their target_residency/exit_latency. Adding Len and Arjan to the CC.
This commit is outdated, AFAICT.
Indeed, there are dynamic idle states. Some idle states are added or removed when a laptop is going to battery or plugged in.
In ACPI, the power event leads the acpi cpuidle driver to disable the cpuidle framework, get the idle states which are ordered, and re-enable the cpuidle framework which in turn kicks all the cpus. So the index in the struct rq should be always ok.