diff options
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/timekeeping.c | 181 |
1 files changed, 110 insertions, 71 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 4fd83df0b14d..b98d9bd73e5e 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -38,8 +38,11 @@ struct timekeeper { | |||
38 | /* Raw nano seconds accumulated per NTP interval. */ | 38 | /* Raw nano seconds accumulated per NTP interval. */ |
39 | u32 raw_interval; | 39 | u32 raw_interval; |
40 | 40 | ||
41 | /* Clock shifted nano seconds remainder not stored in xtime.tv_nsec. */ | 41 | /* Current CLOCK_REALTIME time in seconds */ |
42 | u64 xtime_sec; | ||
43 | /* Clock shifted nano seconds */ | ||
42 | u64 xtime_nsec; | 44 | u64 xtime_nsec; |
45 | |||
43 | /* Difference between accumulated time and NTP time in ntp | 46 | /* Difference between accumulated time and NTP time in ntp |
44 | * shifted nano seconds. */ | 47 | * shifted nano seconds. */ |
45 | s64 ntp_error; | 48 | s64 ntp_error; |
@@ -47,8 +50,6 @@ struct timekeeper { | |||
47 | * ntp shifted nano seconds. */ | 50 | * ntp shifted nano seconds. */ |
48 | u32 ntp_error_shift; | 51 | u32 ntp_error_shift; |
49 | 52 | ||
50 | /* The current time */ | ||
51 | struct timespec xtime; | ||
52 | /* | 53 | /* |
53 | * wall_to_monotonic is what we need to add to xtime (or xtime corrected | 54 | * wall_to_monotonic is what we need to add to xtime (or xtime corrected |
54 | * for sub jiffie times) to get to monotonic time. Monotonic is pegged | 55 | * for sub jiffie times) to get to monotonic time. Monotonic is pegged |
@@ -84,11 +85,37 @@ static struct timekeeper timekeeper; | |||
84 | */ | 85 | */ |
85 | __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock); | 86 | __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock); |
86 | 87 | ||
87 | |||
88 | /* flag for if timekeeping is suspended */ | 88 | /* flag for if timekeeping is suspended */ |
89 | int __read_mostly timekeeping_suspended; | 89 | int __read_mostly timekeeping_suspended; |
90 | 90 | ||
91 | static inline void tk_normalize_xtime(struct timekeeper *tk) | ||
92 | { | ||
93 | while (tk->xtime_nsec >= ((u64)NSEC_PER_SEC << tk->shift)) { | ||
94 | tk->xtime_nsec -= (u64)NSEC_PER_SEC << tk->shift; | ||
95 | tk->xtime_sec++; | ||
96 | } | ||
97 | } | ||
98 | |||
99 | static struct timespec tk_xtime(struct timekeeper *tk) | ||
100 | { | ||
101 | struct timespec ts; | ||
102 | |||
103 | ts.tv_sec = tk->xtime_sec; | ||
104 | ts.tv_nsec = (long)(tk->xtime_nsec >> tk->shift); | ||
105 | return ts; | ||
106 | } | ||
91 | 107 | ||
108 | static void tk_set_xtime(struct timekeeper *tk, const struct timespec *ts) | ||
109 | { | ||
110 | tk->xtime_sec = ts->tv_sec; | ||
111 | tk->xtime_nsec = ts->tv_nsec << tk->shift; | ||
112 | } | ||
113 | |||
114 | static void tk_xtime_add(struct timekeeper *tk, const struct timespec *ts) | ||
115 | { | ||
116 | tk->xtime_sec += ts->tv_sec; | ||
117 | tk->xtime_nsec += ts->tv_nsec << tk->shift; | ||
118 | } | ||
92 | 119 | ||
93 | /** | 120 | /** |
94 | * timekeeper_setup_internals - Set up internals to use clocksource clock. | 121 | * timekeeper_setup_internals - Set up internals to use clocksource clock. |
@@ -104,7 +131,9 @@ static void timekeeper_setup_internals(struct clocksource *clock) | |||
104 | { | 131 | { |
105 | cycle_t interval; | 132 | cycle_t interval; |
106 | u64 tmp, ntpinterval; | 133 | u64 tmp, ntpinterval; |
134 | struct clocksource *old_clock; | ||
107 | 135 | ||
136 | old_clock = timekeeper.clock; | ||
108 | timekeeper.clock = clock; | 137 | timekeeper.clock = clock; |
109 | clock->cycle_last = clock->read(clock); | 138 | clock->cycle_last = clock->read(clock); |
110 | 139 | ||
@@ -126,7 +155,14 @@ static void timekeeper_setup_internals(struct clocksource *clock) | |||
126 | timekeeper.raw_interval = | 155 | timekeeper.raw_interval = |
127 | ((u64) interval * clock->mult) >> clock->shift; | 156 | ((u64) interval * clock->mult) >> clock->shift; |
128 | 157 | ||
129 | timekeeper.xtime_nsec = 0; | 158 | /* if changing clocks, convert xtime_nsec shift units */ |
159 | if (old_clock) { | ||
160 | int shift_change = clock->shift - old_clock->shift; | ||
161 | if (shift_change < 0) | ||
162 | timekeeper.xtime_nsec >>= -shift_change; | ||
163 | else | ||
164 | timekeeper.xtime_nsec <<= shift_change; | ||
165 | } | ||
130 | timekeeper.shift = clock->shift; | 166 | timekeeper.shift = clock->shift; |
131 | 167 | ||
132 | timekeeper.ntp_error = 0; | 168 | timekeeper.ntp_error = 0; |
@@ -145,6 +181,7 @@ static inline s64 timekeeping_get_ns(void) | |||
145 | { | 181 | { |
146 | cycle_t cycle_now, cycle_delta; | 182 | cycle_t cycle_now, cycle_delta; |
147 | struct clocksource *clock; | 183 | struct clocksource *clock; |
184 | s64 nsec; | ||
148 | 185 | ||
149 | /* read clocksource: */ | 186 | /* read clocksource: */ |
150 | clock = timekeeper.clock; | 187 | clock = timekeeper.clock; |
@@ -153,9 +190,8 @@ static inline s64 timekeeping_get_ns(void) | |||
153 | /* calculate the delta since the last update_wall_time: */ | 190 | /* calculate the delta since the last update_wall_time: */ |
154 | cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; | 191 | cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; |
155 | 192 | ||
156 | /* return delta convert to nanoseconds using ntp adjusted mult. */ | 193 | nsec = cycle_delta * timekeeper.mult + timekeeper.xtime_nsec; |
157 | return clocksource_cyc2ns(cycle_delta, timekeeper.mult, | 194 | return nsec >> timekeeper.shift; |
158 | timekeeper.shift); | ||
159 | } | 195 | } |
160 | 196 | ||
161 | static inline s64 timekeeping_get_ns_raw(void) | 197 | static inline s64 timekeeping_get_ns_raw(void) |
@@ -185,12 +221,15 @@ static void update_rt_offset(void) | |||
185 | /* must hold write on timekeeper.lock */ | 221 | /* must hold write on timekeeper.lock */ |
186 | static void timekeeping_update(bool clearntp) | 222 | static void timekeeping_update(bool clearntp) |
187 | { | 223 | { |
224 | struct timespec xt; | ||
225 | |||
188 | if (clearntp) { | 226 | if (clearntp) { |
189 | timekeeper.ntp_error = 0; | 227 | timekeeper.ntp_error = 0; |
190 | ntp_clear(); | 228 | ntp_clear(); |
191 | } | 229 | } |
192 | update_rt_offset(); | 230 | update_rt_offset(); |
193 | update_vsyscall(&timekeeper.xtime, &timekeeper.wall_to_monotonic, | 231 | xt = tk_xtime(&timekeeper); |
232 | update_vsyscall(&xt, &timekeeper.wall_to_monotonic, | ||
194 | timekeeper.clock, timekeeper.mult); | 233 | timekeeper.clock, timekeeper.mult); |
195 | } | 234 | } |
196 | 235 | ||
@@ -213,13 +252,12 @@ static void timekeeping_forward_now(void) | |||
213 | cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; | 252 | cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; |
214 | clock->cycle_last = cycle_now; | 253 | clock->cycle_last = cycle_now; |
215 | 254 | ||
216 | nsec = clocksource_cyc2ns(cycle_delta, timekeeper.mult, | 255 | timekeeper.xtime_nsec += cycle_delta * timekeeper.mult; |
217 | timekeeper.shift); | ||
218 | 256 | ||
219 | /* If arch requires, add in gettimeoffset() */ | 257 | /* If arch requires, add in gettimeoffset() */ |
220 | nsec += arch_gettimeoffset(); | 258 | timekeeper.xtime_nsec += arch_gettimeoffset() << timekeeper.shift; |
221 | 259 | ||
222 | timespec_add_ns(&timekeeper.xtime, nsec); | 260 | tk_normalize_xtime(&timekeeper); |
223 | 261 | ||
224 | nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift); | 262 | nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift); |
225 | timespec_add_ns(&timekeeper.raw_time, nsec); | 263 | timespec_add_ns(&timekeeper.raw_time, nsec); |
@@ -234,15 +272,15 @@ static void timekeeping_forward_now(void) | |||
234 | void getnstimeofday(struct timespec *ts) | 272 | void getnstimeofday(struct timespec *ts) |
235 | { | 273 | { |
236 | unsigned long seq; | 274 | unsigned long seq; |
237 | s64 nsecs; | 275 | s64 nsecs = 0; |
238 | 276 | ||
239 | WARN_ON(timekeeping_suspended); | 277 | WARN_ON(timekeeping_suspended); |
240 | 278 | ||
241 | do { | 279 | do { |
242 | seq = read_seqbegin(&timekeeper.lock); | 280 | seq = read_seqbegin(&timekeeper.lock); |
243 | 281 | ||
244 | *ts = timekeeper.xtime; | 282 | ts->tv_sec = timekeeper.xtime_sec; |
245 | nsecs = timekeeping_get_ns(); | 283 | ts->tv_nsec = timekeeping_get_ns(); |
246 | 284 | ||
247 | /* If arch requires, add in gettimeoffset() */ | 285 | /* If arch requires, add in gettimeoffset() */ |
248 | nsecs += arch_gettimeoffset(); | 286 | nsecs += arch_gettimeoffset(); |
@@ -262,11 +300,10 @@ ktime_t ktime_get(void) | |||
262 | 300 | ||
263 | do { | 301 | do { |
264 | seq = read_seqbegin(&timekeeper.lock); | 302 | seq = read_seqbegin(&timekeeper.lock); |
265 | secs = timekeeper.xtime.tv_sec + | 303 | secs = timekeeper.xtime_sec + |
266 | timekeeper.wall_to_monotonic.tv_sec; | 304 | timekeeper.wall_to_monotonic.tv_sec; |
267 | nsecs = timekeeper.xtime.tv_nsec + | 305 | nsecs = timekeeping_get_ns() + |
268 | timekeeper.wall_to_monotonic.tv_nsec; | 306 | timekeeper.wall_to_monotonic.tv_nsec; |
269 | nsecs += timekeeping_get_ns(); | ||
270 | /* If arch requires, add in gettimeoffset() */ | 307 | /* If arch requires, add in gettimeoffset() */ |
271 | nsecs += arch_gettimeoffset(); | 308 | nsecs += arch_gettimeoffset(); |
272 | 309 | ||
@@ -291,22 +328,21 @@ void ktime_get_ts(struct timespec *ts) | |||
291 | { | 328 | { |
292 | struct timespec tomono; | 329 | struct timespec tomono; |
293 | unsigned int seq; | 330 | unsigned int seq; |
294 | s64 nsecs; | ||
295 | 331 | ||
296 | WARN_ON(timekeeping_suspended); | 332 | WARN_ON(timekeeping_suspended); |
297 | 333 | ||
298 | do { | 334 | do { |
299 | seq = read_seqbegin(&timekeeper.lock); | 335 | seq = read_seqbegin(&timekeeper.lock); |
300 | *ts = timekeeper.xtime; | 336 | ts->tv_sec = timekeeper.xtime_sec; |
337 | ts->tv_nsec = timekeeping_get_ns(); | ||
301 | tomono = timekeeper.wall_to_monotonic; | 338 | tomono = timekeeper.wall_to_monotonic; |
302 | nsecs = timekeeping_get_ns(); | ||
303 | /* If arch requires, add in gettimeoffset() */ | 339 | /* If arch requires, add in gettimeoffset() */ |
304 | nsecs += arch_gettimeoffset(); | 340 | ts->tv_nsec += arch_gettimeoffset(); |
305 | 341 | ||
306 | } while (read_seqretry(&timekeeper.lock, seq)); | 342 | } while (read_seqretry(&timekeeper.lock, seq)); |
307 | 343 | ||
308 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, | 344 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, |
309 | ts->tv_nsec + tomono.tv_nsec + nsecs); | 345 | ts->tv_nsec + tomono.tv_nsec); |
310 | } | 346 | } |
311 | EXPORT_SYMBOL_GPL(ktime_get_ts); | 347 | EXPORT_SYMBOL_GPL(ktime_get_ts); |
312 | 348 | ||
@@ -334,7 +370,8 @@ void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real) | |||
334 | seq = read_seqbegin(&timekeeper.lock); | 370 | seq = read_seqbegin(&timekeeper.lock); |
335 | 371 | ||
336 | *ts_raw = timekeeper.raw_time; | 372 | *ts_raw = timekeeper.raw_time; |
337 | *ts_real = timekeeper.xtime; | 373 | ts_real->tv_sec = timekeeper.xtime_sec; |
374 | ts_real->tv_nsec = 0; | ||
338 | 375 | ||
339 | nsecs_raw = timekeeping_get_ns_raw(); | 376 | nsecs_raw = timekeeping_get_ns_raw(); |
340 | nsecs_real = timekeeping_get_ns(); | 377 | nsecs_real = timekeeping_get_ns(); |
@@ -377,7 +414,7 @@ EXPORT_SYMBOL(do_gettimeofday); | |||
377 | */ | 414 | */ |
378 | int do_settimeofday(const struct timespec *tv) | 415 | int do_settimeofday(const struct timespec *tv) |
379 | { | 416 | { |
380 | struct timespec ts_delta; | 417 | struct timespec ts_delta, xt; |
381 | unsigned long flags; | 418 | unsigned long flags; |
382 | 419 | ||
383 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | 420 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) |
@@ -387,12 +424,15 @@ int do_settimeofday(const struct timespec *tv) | |||
387 | 424 | ||
388 | timekeeping_forward_now(); | 425 | timekeeping_forward_now(); |
389 | 426 | ||
390 | ts_delta.tv_sec = tv->tv_sec - timekeeper.xtime.tv_sec; | 427 | xt = tk_xtime(&timekeeper); |
391 | ts_delta.tv_nsec = tv->tv_nsec - timekeeper.xtime.tv_nsec; | 428 | ts_delta.tv_sec = tv->tv_sec - xt.tv_sec; |
429 | ts_delta.tv_nsec = tv->tv_nsec - xt.tv_nsec; | ||
430 | |||
392 | timekeeper.wall_to_monotonic = | 431 | timekeeper.wall_to_monotonic = |
393 | timespec_sub(timekeeper.wall_to_monotonic, ts_delta); | 432 | timespec_sub(timekeeper.wall_to_monotonic, ts_delta); |
394 | 433 | ||
395 | timekeeper.xtime = *tv; | 434 | tk_set_xtime(&timekeeper, tv); |
435 | |||
396 | timekeeping_update(true); | 436 | timekeeping_update(true); |
397 | 437 | ||
398 | write_sequnlock_irqrestore(&timekeeper.lock, flags); | 438 | write_sequnlock_irqrestore(&timekeeper.lock, flags); |
@@ -422,7 +462,8 @@ int timekeeping_inject_offset(struct timespec *ts) | |||
422 | 462 | ||
423 | timekeeping_forward_now(); | 463 | timekeeping_forward_now(); |
424 | 464 | ||
425 | timekeeper.xtime = timespec_add(timekeeper.xtime, *ts); | 465 | |
466 | tk_xtime_add(&timekeeper, ts); | ||
426 | timekeeper.wall_to_monotonic = | 467 | timekeeper.wall_to_monotonic = |
427 | timespec_sub(timekeeper.wall_to_monotonic, *ts); | 468 | timespec_sub(timekeeper.wall_to_monotonic, *ts); |
428 | 469 | ||
@@ -606,14 +647,12 @@ void __init timekeeping_init(void) | |||
606 | clock->enable(clock); | 647 | clock->enable(clock); |
607 | timekeeper_setup_internals(clock); | 648 | timekeeper_setup_internals(clock); |
608 | 649 | ||
609 | timekeeper.xtime.tv_sec = now.tv_sec; | 650 | tk_set_xtime(&timekeeper, &now); |
610 | timekeeper.xtime.tv_nsec = now.tv_nsec; | ||
611 | timekeeper.raw_time.tv_sec = 0; | 651 | timekeeper.raw_time.tv_sec = 0; |
612 | timekeeper.raw_time.tv_nsec = 0; | 652 | timekeeper.raw_time.tv_nsec = 0; |
613 | if (boot.tv_sec == 0 && boot.tv_nsec == 0) { | 653 | if (boot.tv_sec == 0 && boot.tv_nsec == 0) |
614 | boot.tv_sec = timekeeper.xtime.tv_sec; | 654 | boot = tk_xtime(&timekeeper); |
615 | boot.tv_nsec = timekeeper.xtime.tv_nsec; | 655 | |
616 | } | ||
617 | set_normalized_timespec(&timekeeper.wall_to_monotonic, | 656 | set_normalized_timespec(&timekeeper.wall_to_monotonic, |
618 | -boot.tv_sec, -boot.tv_nsec); | 657 | -boot.tv_sec, -boot.tv_nsec); |
619 | update_rt_offset(); | 658 | update_rt_offset(); |
@@ -646,7 +685,7 @@ static void __timekeeping_inject_sleeptime(struct timespec *delta) | |||
646 | return; | 685 | return; |
647 | } | 686 | } |
648 | 687 | ||
649 | timekeeper.xtime = timespec_add(timekeeper.xtime, *delta); | 688 | tk_xtime_add(&timekeeper, delta); |
650 | timekeeper.wall_to_monotonic = | 689 | timekeeper.wall_to_monotonic = |
651 | timespec_sub(timekeeper.wall_to_monotonic, *delta); | 690 | timespec_sub(timekeeper.wall_to_monotonic, *delta); |
652 | update_sleep_time(timespec_add(timekeeper.total_sleep_time, *delta)); | 691 | update_sleep_time(timespec_add(timekeeper.total_sleep_time, *delta)); |
@@ -742,7 +781,7 @@ static int timekeeping_suspend(void) | |||
742 | * try to compensate so the difference in system time | 781 | * try to compensate so the difference in system time |
743 | * and persistent_clock time stays close to constant. | 782 | * and persistent_clock time stays close to constant. |
744 | */ | 783 | */ |
745 | delta = timespec_sub(timekeeper.xtime, timekeeping_suspend_time); | 784 | delta = timespec_sub(tk_xtime(&timekeeper), timekeeping_suspend_time); |
746 | delta_delta = timespec_sub(delta, old_delta); | 785 | delta_delta = timespec_sub(delta, old_delta); |
747 | if (abs(delta_delta.tv_sec) >= 2) { | 786 | if (abs(delta_delta.tv_sec) >= 2) { |
748 | /* | 787 | /* |
@@ -977,9 +1016,9 @@ static cycle_t logarithmic_accumulation(cycle_t offset, u32 shift) | |||
977 | while (timekeeper.xtime_nsec >= nsecps) { | 1016 | while (timekeeper.xtime_nsec >= nsecps) { |
978 | int leap; | 1017 | int leap; |
979 | timekeeper.xtime_nsec -= nsecps; | 1018 | timekeeper.xtime_nsec -= nsecps; |
980 | timekeeper.xtime.tv_sec++; | 1019 | timekeeper.xtime_sec++; |
981 | leap = second_overflow(timekeeper.xtime.tv_sec); | 1020 | leap = second_overflow(timekeeper.xtime_sec); |
982 | timekeeper.xtime.tv_sec += leap; | 1021 | timekeeper.xtime_sec += leap; |
983 | timekeeper.wall_to_monotonic.tv_sec -= leap; | 1022 | timekeeper.wall_to_monotonic.tv_sec -= leap; |
984 | if (leap) | 1023 | if (leap) |
985 | clock_was_set_delayed(); | 1024 | clock_was_set_delayed(); |
@@ -1015,6 +1054,7 @@ static void update_wall_time(void) | |||
1015 | cycle_t offset; | 1054 | cycle_t offset; |
1016 | int shift = 0, maxshift; | 1055 | int shift = 0, maxshift; |
1017 | unsigned long flags; | 1056 | unsigned long flags; |
1057 | s64 remainder; | ||
1018 | 1058 | ||
1019 | write_seqlock_irqsave(&timekeeper.lock, flags); | 1059 | write_seqlock_irqsave(&timekeeper.lock, flags); |
1020 | 1060 | ||
@@ -1029,8 +1069,6 @@ static void update_wall_time(void) | |||
1029 | #else | 1069 | #else |
1030 | offset = (clock->read(clock) - clock->cycle_last) & clock->mask; | 1070 | offset = (clock->read(clock) - clock->cycle_last) & clock->mask; |
1031 | #endif | 1071 | #endif |
1032 | timekeeper.xtime_nsec = (s64)timekeeper.xtime.tv_nsec << | ||
1033 | timekeeper.shift; | ||
1034 | 1072 | ||
1035 | /* | 1073 | /* |
1036 | * With NO_HZ we may have to accumulate many cycle_intervals | 1074 | * With NO_HZ we may have to accumulate many cycle_intervals |
@@ -1076,28 +1114,31 @@ static void update_wall_time(void) | |||
1076 | timekeeper.ntp_error += neg << timekeeper.ntp_error_shift; | 1114 | timekeeper.ntp_error += neg << timekeeper.ntp_error_shift; |
1077 | } | 1115 | } |
1078 | 1116 | ||
1079 | |||
1080 | /* | 1117 | /* |
1081 | * Store full nanoseconds into xtime after rounding it up and | 1118 | * Store only full nanoseconds into xtime_nsec after rounding |
1082 | * add the remainder to the error difference. | 1119 | * it up and add the remainder to the error difference. |
1083 | */ | 1120 | * XXX - This is necessary to avoid small 1ns inconsistnecies caused |
1084 | timekeeper.xtime.tv_nsec = ((s64)timekeeper.xtime_nsec >> | 1121 | * by truncating the remainder in vsyscalls. However, it causes |
1085 | timekeeper.shift) + 1; | 1122 | * additional work to be done in timekeeping_adjust(). Once |
1086 | timekeeper.xtime_nsec -= (s64)timekeeper.xtime.tv_nsec << | 1123 | * the vsyscall implementations are converted to use xtime_nsec |
1087 | timekeeper.shift; | 1124 | * (shifted nanoseconds), this can be killed. |
1088 | timekeeper.ntp_error += timekeeper.xtime_nsec << | 1125 | */ |
1089 | timekeeper.ntp_error_shift; | 1126 | remainder = timekeeper.xtime_nsec & ((1 << timekeeper.shift) - 1); |
1127 | timekeeper.xtime_nsec -= remainder; | ||
1128 | timekeeper.xtime_nsec += 1 << timekeeper.shift; | ||
1129 | timekeeper.ntp_error += remainder << timekeeper.ntp_error_shift; | ||
1090 | 1130 | ||
1091 | /* | 1131 | /* |
1092 | * Finally, make sure that after the rounding | 1132 | * Finally, make sure that after the rounding |
1093 | * xtime.tv_nsec isn't larger than NSEC_PER_SEC | 1133 | * xtime_nsec isn't larger than NSEC_PER_SEC |
1094 | */ | 1134 | */ |
1095 | if (unlikely(timekeeper.xtime.tv_nsec >= NSEC_PER_SEC)) { | 1135 | if (unlikely(timekeeper.xtime_nsec >= |
1136 | ((u64)NSEC_PER_SEC << timekeeper.shift))) { | ||
1096 | int leap; | 1137 | int leap; |
1097 | timekeeper.xtime.tv_nsec -= NSEC_PER_SEC; | 1138 | timekeeper.xtime_nsec -= (u64)NSEC_PER_SEC << timekeeper.shift; |
1098 | timekeeper.xtime.tv_sec++; | 1139 | timekeeper.xtime_sec++; |
1099 | leap = second_overflow(timekeeper.xtime.tv_sec); | 1140 | leap = second_overflow(timekeeper.xtime_sec); |
1100 | timekeeper.xtime.tv_sec += leap; | 1141 | timekeeper.xtime_sec += leap; |
1101 | timekeeper.wall_to_monotonic.tv_sec -= leap; | 1142 | timekeeper.wall_to_monotonic.tv_sec -= leap; |
1102 | if (leap) | 1143 | if (leap) |
1103 | clock_was_set_delayed(); | 1144 | clock_was_set_delayed(); |
@@ -1148,21 +1189,20 @@ void get_monotonic_boottime(struct timespec *ts) | |||
1148 | { | 1189 | { |
1149 | struct timespec tomono, sleep; | 1190 | struct timespec tomono, sleep; |
1150 | unsigned int seq; | 1191 | unsigned int seq; |
1151 | s64 nsecs; | ||
1152 | 1192 | ||
1153 | WARN_ON(timekeeping_suspended); | 1193 | WARN_ON(timekeeping_suspended); |
1154 | 1194 | ||
1155 | do { | 1195 | do { |
1156 | seq = read_seqbegin(&timekeeper.lock); | 1196 | seq = read_seqbegin(&timekeeper.lock); |
1157 | *ts = timekeeper.xtime; | 1197 | ts->tv_sec = timekeeper.xtime_sec; |
1198 | ts->tv_nsec = timekeeping_get_ns(); | ||
1158 | tomono = timekeeper.wall_to_monotonic; | 1199 | tomono = timekeeper.wall_to_monotonic; |
1159 | sleep = timekeeper.total_sleep_time; | 1200 | sleep = timekeeper.total_sleep_time; |
1160 | nsecs = timekeeping_get_ns(); | ||
1161 | 1201 | ||
1162 | } while (read_seqretry(&timekeeper.lock, seq)); | 1202 | } while (read_seqretry(&timekeeper.lock, seq)); |
1163 | 1203 | ||
1164 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec, | 1204 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec, |
1165 | ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs); | 1205 | ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec); |
1166 | } | 1206 | } |
1167 | EXPORT_SYMBOL_GPL(get_monotonic_boottime); | 1207 | EXPORT_SYMBOL_GPL(get_monotonic_boottime); |
1168 | 1208 | ||
@@ -1195,13 +1235,13 @@ EXPORT_SYMBOL_GPL(monotonic_to_bootbased); | |||
1195 | 1235 | ||
1196 | unsigned long get_seconds(void) | 1236 | unsigned long get_seconds(void) |
1197 | { | 1237 | { |
1198 | return timekeeper.xtime.tv_sec; | 1238 | return timekeeper.xtime_sec; |
1199 | } | 1239 | } |
1200 | EXPORT_SYMBOL(get_seconds); | 1240 | EXPORT_SYMBOL(get_seconds); |
1201 | 1241 | ||
1202 | struct timespec __current_kernel_time(void) | 1242 | struct timespec __current_kernel_time(void) |
1203 | { | 1243 | { |
1204 | return timekeeper.xtime; | 1244 | return tk_xtime(&timekeeper); |
1205 | } | 1245 | } |
1206 | 1246 | ||
1207 | struct timespec current_kernel_time(void) | 1247 | struct timespec current_kernel_time(void) |
@@ -1212,7 +1252,7 @@ struct timespec current_kernel_time(void) | |||
1212 | do { | 1252 | do { |
1213 | seq = read_seqbegin(&timekeeper.lock); | 1253 | seq = read_seqbegin(&timekeeper.lock); |
1214 | 1254 | ||
1215 | now = timekeeper.xtime; | 1255 | now = tk_xtime(&timekeeper); |
1216 | } while (read_seqretry(&timekeeper.lock, seq)); | 1256 | } while (read_seqretry(&timekeeper.lock, seq)); |
1217 | 1257 | ||
1218 | return now; | 1258 | return now; |
@@ -1227,7 +1267,7 @@ struct timespec get_monotonic_coarse(void) | |||
1227 | do { | 1267 | do { |
1228 | seq = read_seqbegin(&timekeeper.lock); | 1268 | seq = read_seqbegin(&timekeeper.lock); |
1229 | 1269 | ||
1230 | now = timekeeper.xtime; | 1270 | now = tk_xtime(&timekeeper); |
1231 | mono = timekeeper.wall_to_monotonic; | 1271 | mono = timekeeper.wall_to_monotonic; |
1232 | } while (read_seqretry(&timekeeper.lock, seq)); | 1272 | } while (read_seqretry(&timekeeper.lock, seq)); |
1233 | 1273 | ||
@@ -1262,7 +1302,7 @@ void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, | |||
1262 | 1302 | ||
1263 | do { | 1303 | do { |
1264 | seq = read_seqbegin(&timekeeper.lock); | 1304 | seq = read_seqbegin(&timekeeper.lock); |
1265 | *xtim = timekeeper.xtime; | 1305 | *xtim = tk_xtime(&timekeeper); |
1266 | *wtom = timekeeper.wall_to_monotonic; | 1306 | *wtom = timekeeper.wall_to_monotonic; |
1267 | *sleep = timekeeper.total_sleep_time; | 1307 | *sleep = timekeeper.total_sleep_time; |
1268 | } while (read_seqretry(&timekeeper.lock, seq)); | 1308 | } while (read_seqretry(&timekeeper.lock, seq)); |
@@ -1286,9 +1326,8 @@ ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot) | |||
1286 | do { | 1326 | do { |
1287 | seq = read_seqbegin(&timekeeper.lock); | 1327 | seq = read_seqbegin(&timekeeper.lock); |
1288 | 1328 | ||
1289 | secs = timekeeper.xtime.tv_sec; | 1329 | secs = timekeeper.xtime_sec; |
1290 | nsecs = timekeeper.xtime.tv_nsec; | 1330 | nsecs = timekeeping_get_ns(); |
1291 | nsecs += timekeeping_get_ns(); | ||
1292 | /* If arch requires, add in gettimeoffset() */ | 1331 | /* If arch requires, add in gettimeoffset() */ |
1293 | nsecs += arch_gettimeoffset(); | 1332 | nsecs += arch_gettimeoffset(); |
1294 | 1333 | ||