lkml.org 
[lkml]   [2014]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6/7] Cpuidle: Deal with timer expiring in the past
    Date
    Sometimes (fairly often) when the cpuidle menu governor is making a decision
    about idle state to enter the next timer for the cpu appears to expire in
    the past. The menu governor expects the expiry to always be in the future
    and in fact stores the time delta in an unsigned variable. However, when
    the expiry is in the past, the value returned by tick_nohz_get_sleep_length
    can be negative. This patch prevents using negative values, instead making
    the governor return immediately similar to having latency requirement set
    to 0.

    Note: As with latency == 0, the return value is 0 with no check to see if
    the state 0 has been disabled or not.

    Signed-off-by: Tuukka Tikkanen <tuukka.tikkanen@linaro.org>
    ---
    drivers/cpuidle/governors/menu.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
    index 71b5232..c414468 100644
    --- a/drivers/cpuidle/governors/menu.c
    +++ b/drivers/cpuidle/governors/menu.c
    @@ -302,8 +302,16 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
    if (unlikely(latency_req == 0))
    return 0;

    - /* determine the expected residency time, round up */
    + /*
    + * Determine the expected residency time. If the time is negative,
    + * a timer interrupt has probably just expired after disabling
    + * interrupts. Return as quickly as possible in the most shallow
    + * state possible. tv_nsec is always positive, so only check the
    + * seconds.
    + */
    t = ktime_to_timespec(tick_nohz_get_sleep_length());
    + if (t.tv_sec < 0)
    + return 0;
    data->next_timer_us =
    t.tv_sec * USEC_PER_SEC + t.tv_nsec / NSEC_PER_USEC;

    --
    1.7.9.5


    \
     
     \ /
      Last update: 2014-02-24 09:21    [W:2.139 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site