diff options
| author | John Stultz <john.stultz@linaro.org> | 2012-07-13 01:21:54 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2012-07-15 04:39:06 -0400 |
| commit | 1f4f948706bcec1b51bf6492bf04057d2e21e273 (patch) | |
| tree | 1677cf2f130da9ff53259fdb658fa53a4ef81b4e /kernel/time | |
| parent | 1e75fa8be9fb61e1af46b5b3b176347a4c958ca1 (diff) | |
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: John Stultz <john.stultz@linaro.org>
Reviewed-by: Ingo 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: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/timekeeping.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index b98d9bd73e5e..cb4a433bab97 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -991,6 +991,35 @@ static void timekeeping_adjust(s64 offset) | |||
| 991 | 991 | ||
| 992 | 992 | ||
| 993 | /** | 993 | /** |
| 994 | * accumulate_nsecs_to_secs - Accumulates nsecs into secs | ||
| 995 | * | ||
| 996 | * Helper function that accumulates a the nsecs greater then a second | ||
| 997 | * from the xtime_nsec field to the xtime_secs field. | ||
| 998 | * It also calls into the NTP code to handle leapsecond processing. | ||
| 999 | * | ||
| 1000 | */ | ||
| 1001 | static inline void accumulate_nsecs_to_secs(struct timekeeper *tk) | ||
| 1002 | { | ||
| 1003 | u64 nsecps = (u64)NSEC_PER_SEC << tk->shift; | ||
| 1004 | |||
| 1005 | while (tk->xtime_nsec >= nsecps) { | ||
| 1006 | int leap; | ||
| 1007 | |||
| 1008 | tk->xtime_nsec -= nsecps; | ||
| 1009 | tk->xtime_sec++; | ||
| 1010 | |||
| 1011 | /* Figure out if its a leap sec and apply if needed */ | ||
| 1012 | leap = second_overflow(tk->xtime_sec); | ||
| 1013 | tk->xtime_sec += leap; | ||
| 1014 | tk->wall_to_monotonic.tv_sec -= leap; | ||
| 1015 | if (leap) | ||
| 1016 | clock_was_set_delayed(); | ||
| 1017 | |||
| 1018 | } | ||
| 1019 | } | ||
| 1020 | |||
| 1021 | |||
| 1022 | /** | ||
| 994 | * logarithmic_accumulation - shifted accumulation of cycles | 1023 | * logarithmic_accumulation - shifted accumulation of cycles |
| 995 | * | 1024 | * |
| 996 | * This functions accumulates a shifted interval of cycles into | 1025 | * This functions accumulates a shifted interval of cycles into |
| @@ -1001,7 +1030,6 @@ static void timekeeping_adjust(s64 offset) | |||
| 1001 | */ | 1030 | */ |
| 1002 | static cycle_t logarithmic_accumulation(cycle_t offset, u32 shift) | 1031 | static cycle_t logarithmic_accumulation(cycle_t offset, u32 shift) |
| 1003 | { | 1032 | { |
| 1004 | u64 nsecps = (u64)NSEC_PER_SEC << timekeeper.shift; | ||
| 1005 | u64 raw_nsecs; | 1033 | u64 raw_nsecs; |
| 1006 | 1034 | ||
| 1007 | /* If the offset is smaller than a shifted interval, do nothing */ | 1035 | /* 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) | |||
| 1013 | timekeeper.clock->cycle_last += timekeeper.cycle_interval << shift; | 1041 | timekeeper.clock->cycle_last += timekeeper.cycle_interval << shift; |
| 1014 | 1042 | ||
| 1015 | timekeeper.xtime_nsec += timekeeper.xtime_interval << shift; | 1043 | timekeeper.xtime_nsec += timekeeper.xtime_interval << shift; |
| 1016 | while (timekeeper.xtime_nsec >= nsecps) { | 1044 | |
| 1017 | int leap; | 1045 | accumulate_nsecs_to_secs(&timekeeper); |
| 1018 | timekeeper.xtime_nsec -= nsecps; | ||
| 1019 | timekeeper.xtime_sec++; | ||
| 1020 | leap = second_overflow(timekeeper.xtime_sec); | ||
| 1021 | timekeeper.xtime_sec += leap; | ||
| 1022 | timekeeper.wall_to_monotonic.tv_sec -= leap; | ||
| 1023 | if (leap) | ||
| 1024 | clock_was_set_delayed(); | ||
| 1025 | } | ||
| 1026 | 1046 | ||
| 1027 | /* Accumulate raw time */ | 1047 | /* Accumulate raw time */ |
| 1028 | raw_nsecs = timekeeper.raw_interval << shift; | 1048 | raw_nsecs = timekeeper.raw_interval << shift; |
| @@ -1132,17 +1152,7 @@ static void update_wall_time(void) | |||
| 1132 | * Finally, make sure that after the rounding | 1152 | * Finally, make sure that after the rounding |
| 1133 | * xtime_nsec isn't larger than NSEC_PER_SEC | 1153 | * xtime_nsec isn't larger than NSEC_PER_SEC |
| 1134 | */ | 1154 | */ |
| 1135 | if (unlikely(timekeeper.xtime_nsec >= | 1155 | accumulate_nsecs_to_secs(&timekeeper); |
| 1136 | ((u64)NSEC_PER_SEC << timekeeper.shift))) { | ||
| 1137 | int leap; | ||
| 1138 | timekeeper.xtime_nsec -= (u64)NSEC_PER_SEC << timekeeper.shift; | ||
| 1139 | timekeeper.xtime_sec++; | ||
| 1140 | leap = second_overflow(timekeeper.xtime_sec); | ||
| 1141 | timekeeper.xtime_sec += leap; | ||
| 1142 | timekeeper.wall_to_monotonic.tv_sec -= leap; | ||
| 1143 | if (leap) | ||
| 1144 | clock_was_set_delayed(); | ||
| 1145 | } | ||
| 1146 | 1156 | ||
| 1147 | timekeeping_update(false); | 1157 | timekeeping_update(false); |
| 1148 | 1158 | ||
