• J
    cpuidle: Measure idle state durations with monotonic clock · a474a515
    Julius Werner 提交于
    Many cpuidle drivers measure their time spent in an idle state by
    reading the wallclock time before and after idling and calculating the
    difference. This leads to erroneous results when the wallclock time gets
    updated by another processor in the meantime, adding that clock
    adjustment to the idle state's time counter.
    
    If the clock adjustment was negative, the result is even worse due to an
    erroneous cast from int to unsigned long long of the last_residency
    variable. The negative 32 bit integer will zero-extend and result in a
    forward time jump of roughly four billion milliseconds or 1.3 hours on
    the idle state residency counter.
    
    This patch changes all affected cpuidle drivers to either use the
    monotonic clock for their measurements or make use of the generic time
    measurement wrapper in cpuidle.c, which was already working correctly.
    Some superfluous CLIs/STIs in the ACPI code are removed (interrupts
    should always already be disabled before entering the idle function, and
    not get reenabled until the generic wrapper has performed its second
    measurement). It also removes the erroneous cast, making sure that
    negative residency values are applied correctly even though they should
    not appear anymore.
    Signed-off-by: NJulius Werner <jwerner@chromium.org>
    Reviewed-by: NPreeti U Murthy <preeti@linux.vnet.ibm.com>
    Tested-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
    Acked-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
    Acked-by: NLen Brown <len.brown@intel.com>
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    a474a515
cpuidle.c 11.8 KB