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

Commit cf1eb40f authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

[S390] correct ktime to tod clock comparator conversion



The conversion of the ktime to a value suitable for the clock comparator
does not take changes to wall_to_monotonic into account. In fact the
conversion just needs the boot clock (sched_clock_base_cc) and the
total_sleep_time.

This is applicable to 3.2+ kernels.

CC: stable@vger.kernel.org
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 656d9125
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -113,11 +113,14 @@ static void fixup_clock_comparator(unsigned long long delta)
static int s390_next_ktime(ktime_t expires,
			   struct clock_event_device *evt)
{
	struct timespec ts;
	u64 nsecs;

	nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset()));
	ts.tv_sec = ts.tv_nsec = 0;
	monotonic_to_bootbased(&ts);
	nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));
	do_div(nsecs, 125);
	S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9);
	S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);
	set_clock_comparator(S390_lowcore.clock_comparator);
	return 0;
}