Skip to content

Commit

Permalink
time: Refactor accumulation of nsecs to secs
Browse files Browse the repository at this point in the history
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: John Stultz <[email protected]>
Reviewed-by: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Richard Cochran <[email protected]>
Cc: Prarit Bhargava <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Thomas Gleixner <[email protected]>
  • Loading branch information
johnstultz-work authored and KAGA-KOKO committed Jul 15, 2012
1 parent 1e75fa8 commit 1f4f948
Showing 1 changed file with 32 additions and 22 deletions.
54 changes: 32 additions & 22 deletions kernel/time/timekeeping.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand All @@ -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 */
Expand All @@ -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;
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 1f4f948

Please sign in to comment.