Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;