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

Commit 1f4f9487 authored by John Stultz's avatar John Stultz Committed by Thomas Gleixner
Browse files

time: Refactor accumulation of nsecs to secs



We do the exact same logic moving nsecs to secs in the
timekeeper in multiple places, so condense this into a
single function.

Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
Reviewed-by: default avatarIngo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Link: http://lkml.kernel.org/r/1342156917-25092-6-git-send-email-john.stultz@linaro.org


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 1e75fa8b
Loading
Loading
Loading
Loading
+32 −22
Original line number Diff line number Diff line
@@ -990,6 +990,35 @@ static void timekeeping_adjust(s64 offset)
}


/**
 * accumulate_nsecs_to_secs - Accumulates nsecs into secs
 *
 * Helper function that accumulates a the nsecs greater then a second
 * from the xtime_nsec field to the xtime_secs field.
 * It also calls into the NTP code to handle leapsecond processing.
 *
 */
static inline void accumulate_nsecs_to_secs(struct timekeeper *tk)
{
	u64 nsecps = (u64)NSEC_PER_SEC << tk->shift;

	while (tk->xtime_nsec >= nsecps) {
		int leap;

		tk->xtime_nsec -= nsecps;
		tk->xtime_sec++;

		/* Figure out if its a leap sec and apply if needed */
		leap = second_overflow(tk->xtime_sec);
		tk->xtime_sec += leap;
		tk->wall_to_monotonic.tv_sec -= leap;
		if (leap)
			clock_was_set_delayed();

	}
}


/**
 * logarithmic_accumulation - shifted accumulation of cycles
 *
@@ -1001,7 +1030,6 @@ static void timekeeping_adjust(s64 offset)
 */
static cycle_t logarithmic_accumulation(cycle_t offset, u32 shift)
{
	u64 nsecps = (u64)NSEC_PER_SEC << timekeeper.shift;
	u64 raw_nsecs;

	/* If the offset is smaller than a shifted interval, do nothing */
@@ -1013,16 +1041,8 @@ static cycle_t logarithmic_accumulation(cycle_t offset, u32 shift)
	timekeeper.clock->cycle_last += timekeeper.cycle_interval << shift;

	timekeeper.xtime_nsec += timekeeper.xtime_interval << shift;
	while (timekeeper.xtime_nsec >= nsecps) {
		int leap;
		timekeeper.xtime_nsec -= nsecps;
		timekeeper.xtime_sec++;
		leap = second_overflow(timekeeper.xtime_sec);
		timekeeper.xtime_sec += leap;
		timekeeper.wall_to_monotonic.tv_sec -= leap;
		if (leap)
			clock_was_set_delayed();
	}

	accumulate_nsecs_to_secs(&timekeeper);

	/* Accumulate raw time */
	raw_nsecs = timekeeper.raw_interval << shift;
@@ -1132,17 +1152,7 @@ static void update_wall_time(void)
	 * Finally, make sure that after the rounding
	 * xtime_nsec isn't larger than NSEC_PER_SEC
	 */
	if (unlikely(timekeeper.xtime_nsec >=
			((u64)NSEC_PER_SEC << timekeeper.shift))) {
		int leap;
		timekeeper.xtime_nsec -= (u64)NSEC_PER_SEC << timekeeper.shift;
		timekeeper.xtime_sec++;
		leap = second_overflow(timekeeper.xtime_sec);
		timekeeper.xtime_sec += leap;
		timekeeper.wall_to_monotonic.tv_sec -= leap;
		if (leap)
			clock_was_set_delayed();
	}
	accumulate_nsecs_to_secs(&timekeeper);

	timekeeping_update(false);