From 346f6aa7001855b35bd47e96d2a00a08bb8d324a Mon Sep 17 00:00:00 2001 From: Naresh Malladi Date: Mon, 3 Jul 2017 15:53:48 +0530 Subject: cpuidle: lpm-levels: Check for negative sleep times A negative sleep time could be interpreted as a large positive sleep time when its casted to a unsigned type. This could result in CPU sleeping for a longer than expected duration resulting in missed interrupts. Change-Id: I472f355c8ba392ab46d53fceddb448f7e35c178e Signed-off-by: Mahesh Sivasubramanian Signed-off-by: Maulik Shah Signed-off-by: Naresh Malladi --- drivers/cpuidle/lpm-levels.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c index 7cd1bbbe1ee8..d6aee7188516 100644 --- a/drivers/cpuidle/lpm-levels.c +++ b/drivers/cpuidle/lpm-levels.c @@ -694,22 +694,21 @@ static int cpu_power_select(struct cpuidle_device *dev, int best_level = -1; uint32_t latency_us = pm_qos_request_for_cpu(PM_QOS_CPU_DMA_LATENCY, dev->cpu); - uint32_t sleep_us = - (uint32_t)(ktime_to_us(tick_nohz_get_sleep_length())); + s64 sleep_us = ktime_to_us(tick_nohz_get_sleep_length()); uint32_t modified_time_us = 0; uint32_t next_event_us = 0; int i, idx_restrict; uint32_t lvl_latency_us = 0; uint64_t predicted = 0; uint32_t htime = 0, idx_restrict_time = 0; - uint32_t next_wakeup_us = sleep_us; + uint32_t next_wakeup_us = (uint32_t)sleep_us; uint32_t *min_residency = get_per_cpu_min_residency(dev->cpu); uint32_t *max_residency = get_per_cpu_max_residency(dev->cpu); if (!cpu) return -EINVAL; - if (sleep_disabled && !cpu_isolated(dev->cpu)) + if ((sleep_disabled && !cpu_isolated(dev->cpu)) || sleep_us < 0) return 0; idx_restrict = cpu->nlevels + 1; -- cgit v1.2.3