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 <msivasub@codeaurora.org> Signed-off-by: Maulik Shah <mkshah@codeaurora.org> Signed-off-by: Naresh Malladi <namall@codeaurora.org>
This commit is contained in:
parent
bc399a65c4
commit
346f6aa700
1 changed files with 3 additions and 4 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue