PM-runtime: Fix autosuspend_delay on 32bits arch
Cast autosuspend_delay to u64 to make sure that the full computation
of 'expires' or slack will be done in u64, even on 32bits arch.
Otherwise, any delay greater than 2^31 nsec can overflow if signed
32bits is used when converting delay from msec to nsec.
Fixes: 8234f6734c
(PM-runtime: Switch autosuspend over to using hrtimers)
Reported-by: Tony Lindgren <tony@atomide.com>
Tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
1f7b708156
commit
ca27e4cd0b
@ -141,7 +141,7 @@ u64 pm_runtime_autosuspend_expiration(struct device *dev)
|
||||
|
||||
last_busy = READ_ONCE(dev->power.last_busy);
|
||||
|
||||
expires = last_busy + autosuspend_delay * NSEC_PER_MSEC;
|
||||
expires = last_busy + (u64)autosuspend_delay * NSEC_PER_MSEC;
|
||||
if (expires <= now)
|
||||
expires = 0; /* Already expired. */
|
||||
|
||||
@ -525,7 +525,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
|
||||
* We add a slack of 25% to gather wakeups
|
||||
* without sacrificing the granularity.
|
||||
*/
|
||||
u64 slack = READ_ONCE(dev->power.autosuspend_delay) *
|
||||
u64 slack = (u64)READ_ONCE(dev->power.autosuspend_delay) *
|
||||
(NSEC_PER_MSEC >> 2);
|
||||
|
||||
dev->power.timer_expires = expires;
|
||||
|
Loading…
Reference in New Issue
Block a user