• Len Brown's avatar
    cpuidle: ladder: Better idle duration measurement without using CPUIDLE_FLAG_TIME_INVALID · b73026b9
    Len Brown authored
    When the ladder governor sees the CPUIDLE_FLAG_TIME_INVALID flag,
    it unconditionally causes a state promotion by setting last_residency
    to a number higher than the state's promotion_time:
    
    last_residency = last_state->threshold.promotion_time + 1
    
    It does this for fear that cpuidle_get_last_residency()
    will be in-accurate, because cpuidle_enter_state() invoked
    a state with CPUIDLE_FLAG_TIME_INVALID.
    
    But the only state with CPUIDLE_FLAG_TIME_INVALID is
    acpi_safe_halt(), which may return well after its actual
    idle duration because it enables interrupts, so cpuidle_enter_state()
    also measures interrupt service time.
    
    So what?  In ladder, a huge invalid last_residency has exactly
    the same effect as the current code -- it unconditionally
    causes a state promotion.
    
    In the case where the idle residency plus measured interrupt
    handling time is less than the state's demotion_time -- we should
    use that timestamp to give ladder a chance to demote, rather than
    unconditionally promoting.
    
    This can be done by simply ignoring the CPUIDLE_FLAG_TIME_INVALID,
    and using the "invalid" time, as it is either equal to what we are
    doing today, or better.
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    Acked-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    b73026b9
ladder.c 5.04 KB