Commit ca27e4cd authored by Vincent Guittot's avatar Vincent Guittot Committed by Rafael J. Wysocki

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: 8234f673 (PM-runtime: Switch autosuspend over to using hrtimers)
Reported-by: default avatarTony Lindgren <tony@atomide.com>
Tested-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 1f7b7081
...@@ -141,7 +141,7 @@ u64 pm_runtime_autosuspend_expiration(struct device *dev) ...@@ -141,7 +141,7 @@ u64 pm_runtime_autosuspend_expiration(struct device *dev)
last_busy = READ_ONCE(dev->power.last_busy); 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) if (expires <= now)
expires = 0; /* Already expired. */ expires = 0; /* Already expired. */
...@@ -525,7 +525,7 @@ static int rpm_suspend(struct device *dev, int rpmflags) ...@@ -525,7 +525,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
* We add a slack of 25% to gather wakeups * We add a slack of 25% to gather wakeups
* without sacrificing the granularity. * 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); (NSEC_PER_MSEC >> 2);
dev->power.timer_expires = expires; dev->power.timer_expires = expires;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment