Blame view

kernel/time/timekeeping.c 32.8 KB
8524070b7   John Stultz   Move timekeeping ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   *  linux/kernel/time/timekeeping.c
   *
   *  Kernel timekeeping code and accessor functions
   *
   *  This code was moved from linux/kernel/timer.c.
   *  Please see that file for copyright and history logs.
   *
   */
  
  #include <linux/module.h>
  #include <linux/interrupt.h>
  #include <linux/percpu.h>
  #include <linux/init.h>
  #include <linux/mm.h>
d43c36dc6   Alexey Dobriyan   headers: remove s...
16
  #include <linux/sched.h>
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
17
  #include <linux/syscore_ops.h>
8524070b7   John Stultz   Move timekeeping ...
18
19
20
21
  #include <linux/clocksource.h>
  #include <linux/jiffies.h>
  #include <linux/time.h>
  #include <linux/tick.h>
75c5158f7   Martin Schwidefsky   timekeeping: Upda...
22
  #include <linux/stop_machine.h>
8524070b7   John Stultz   Move timekeeping ...
23

155ec6022   Martin Schwidefsky   timekeeping: Intr...
24
25
26
27
  /* Structure holding internal timekeeping values. */
  struct timekeeper {
  	/* Current clocksource used for timekeeping. */
  	struct clocksource *clock;
23ce72117   Martin Schwidefsky   timekeeping: Add ...
28
29
  	/* The shift value of the current clocksource. */
  	int	shift;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
30
31
32
33
34
  
  	/* Number of clock cycles in one NTP interval. */
  	cycle_t cycle_interval;
  	/* Number of clock shifted nano seconds in one NTP interval. */
  	u64	xtime_interval;
a386b5af8   Kasper Pedersen   time: Compensate ...
35
36
  	/* shifted nano seconds left over when rounding cycle_interval */
  	s64	xtime_remainder;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
37
38
39
40
41
42
43
44
  	/* Raw nano seconds accumulated per NTP interval. */
  	u32	raw_interval;
  
  	/* Clock shifted nano seconds remainder not stored in xtime.tv_nsec. */
  	u64	xtime_nsec;
  	/* Difference between accumulated time and NTP time in ntp
  	 * shifted nano seconds. */
  	s64	ntp_error;
23ce72117   Martin Schwidefsky   timekeeping: Add ...
45
46
47
  	/* Shift conversion between clock shifted nano seconds and
  	 * ntp shifted nano seconds. */
  	int	ntp_error_shift;
0a5441983   Martin Schwidefsky   timekeeping: Move...
48
49
  	/* NTP adjusted clock multiplier */
  	u32	mult;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
50
  };
afa14e7c5   H Hartley Sweeten   timekeeping: Make...
51
  static struct timekeeper timekeeper;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  
  /**
   * timekeeper_setup_internals - Set up internals to use clocksource clock.
   *
   * @clock:		Pointer to clocksource.
   *
   * Calculates a fixed cycle/nsec interval for a given clocksource/adjustment
   * pair and interval request.
   *
   * Unless you're the timekeeping code, you should not be using this!
   */
  static void timekeeper_setup_internals(struct clocksource *clock)
  {
  	cycle_t interval;
a386b5af8   Kasper Pedersen   time: Compensate ...
66
  	u64 tmp, ntpinterval;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
67
68
69
70
71
72
73
  
  	timekeeper.clock = clock;
  	clock->cycle_last = clock->read(clock);
  
  	/* Do the ns -> cycle conversion first, using original mult */
  	tmp = NTP_INTERVAL_LENGTH;
  	tmp <<= clock->shift;
a386b5af8   Kasper Pedersen   time: Compensate ...
74
  	ntpinterval = tmp;
0a5441983   Martin Schwidefsky   timekeeping: Move...
75
76
  	tmp += clock->mult/2;
  	do_div(tmp, clock->mult);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
77
78
79
80
81
82
83
84
  	if (tmp == 0)
  		tmp = 1;
  
  	interval = (cycle_t) tmp;
  	timekeeper.cycle_interval = interval;
  
  	/* Go back from cycles -> shifted ns */
  	timekeeper.xtime_interval = (u64) interval * clock->mult;
a386b5af8   Kasper Pedersen   time: Compensate ...
85
  	timekeeper.xtime_remainder = ntpinterval - timekeeper.xtime_interval;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
86
  	timekeeper.raw_interval =
0a5441983   Martin Schwidefsky   timekeeping: Move...
87
  		((u64) interval * clock->mult) >> clock->shift;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
88
89
  
  	timekeeper.xtime_nsec = 0;
23ce72117   Martin Schwidefsky   timekeeping: Add ...
90
  	timekeeper.shift = clock->shift;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
91
92
  
  	timekeeper.ntp_error = 0;
23ce72117   Martin Schwidefsky   timekeeping: Add ...
93
  	timekeeper.ntp_error_shift = NTP_SCALE_SHIFT - clock->shift;
0a5441983   Martin Schwidefsky   timekeeping: Move...
94
95
96
97
98
99
100
  
  	/*
  	 * The timekeeper keeps its own mult values for the currently
  	 * active clocksource. These value will be adjusted via NTP
  	 * to counteract clock drifting.
  	 */
  	timekeeper.mult = clock->mult;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
101
  }
8524070b7   John Stultz   Move timekeeping ...
102

2ba2a3054   Martin Schwidefsky   timekeeping: Add ...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  /* Timekeeper helper functions. */
  static inline s64 timekeeping_get_ns(void)
  {
  	cycle_t cycle_now, cycle_delta;
  	struct clocksource *clock;
  
  	/* read clocksource: */
  	clock = timekeeper.clock;
  	cycle_now = clock->read(clock);
  
  	/* calculate the delta since the last update_wall_time: */
  	cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
  
  	/* return delta convert to nanoseconds using ntp adjusted mult. */
  	return clocksource_cyc2ns(cycle_delta, timekeeper.mult,
  				  timekeeper.shift);
  }
  
  static inline s64 timekeeping_get_ns_raw(void)
  {
  	cycle_t cycle_now, cycle_delta;
  	struct clocksource *clock;
  
  	/* read clocksource: */
  	clock = timekeeper.clock;
  	cycle_now = clock->read(clock);
  
  	/* calculate the delta since the last update_wall_time: */
  	cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
c9fad429d   Dan McGee   time: fix bogus c...
132
  	/* return delta convert to nanoseconds. */
2ba2a3054   Martin Schwidefsky   timekeeping: Add ...
133
134
  	return clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
  }
8524070b7   John Stultz   Move timekeeping ...
135
136
  /*
   * This read-write spinlock protects us from races in SMP while
dce48a84a   Thomas Gleixner   sched, timers: mo...
137
   * playing with xtime.
8524070b7   John Stultz   Move timekeeping ...
138
   */
ba2a631b1   Adrian Bunk   kernel/time/timek...
139
  __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
8524070b7   John Stultz   Move timekeeping ...
140
141
142
143
144
145
146
147
148
  
  
  /*
   * The current time
   * wall_to_monotonic is what we need to add to xtime (or xtime corrected
   * for sub jiffie times) to get to monotonic time.  Monotonic is pegged
   * at zero at system boot time, so wall_to_monotonic will be negative,
   * however, we will ALWAYS keep the tv_nsec part positive so we can use
   * the usual normalization.
7c3f1a573   Tomas Janousek   Introduce boot ba...
149
150
151
152
153
154
155
   *
   * wall_to_monotonic is moved after resume from suspend for the monotonic
   * time not to jump. We need to add total_sleep_time to wall_to_monotonic
   * to get the real boot based time offset.
   *
   * - wall_to_monotonic is no longer the boot time, getboottime must be
   * used instead.
8524070b7   John Stultz   Move timekeeping ...
156
   */
0fb86b062   John Stultz   timekeeping: Make...
157
158
  static struct timespec xtime __attribute__ ((aligned (16)));
  static struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
159
  static struct timespec total_sleep_time;
8524070b7   John Stultz   Move timekeeping ...
160

155ec6022   Martin Schwidefsky   timekeeping: Intr...
161
162
163
  /*
   * The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock.
   */
afa14e7c5   H Hartley Sweeten   timekeeping: Make...
164
  static struct timespec raw_time;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
165

1c5745aa3   Thomas Gleixner   sched_clock: prev...
166
167
  /* flag for if timekeeping is suspended */
  int __read_mostly timekeeping_suspended;
31089c13b   John Stultz   timekeeping: Intr...
168
169
170
171
172
  /* must hold xtime_lock */
  void timekeeping_leap_insert(int leapsecond)
  {
  	xtime.tv_sec += leapsecond;
  	wall_to_monotonic.tv_sec -= leapsecond;
7615856eb   John Stultz   timkeeping: Fix u...
173
174
  	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
  			timekeeper.mult);
31089c13b   John Stultz   timekeeping: Intr...
175
  }
8524070b7   John Stultz   Move timekeeping ...
176

8524070b7   John Stultz   Move timekeeping ...
177
  /**
155ec6022   Martin Schwidefsky   timekeeping: Intr...
178
   * timekeeping_forward_now - update clock to the current time
8524070b7   John Stultz   Move timekeeping ...
179
   *
9a055117d   Roman Zippel   clocksource: intr...
180
181
182
   * Forward the current clock to update its state since the last call to
   * update_wall_time(). This is useful before significant clock changes,
   * as it avoids having to deal with this time offset explicitly.
8524070b7   John Stultz   Move timekeeping ...
183
   */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
184
  static void timekeeping_forward_now(void)
8524070b7   John Stultz   Move timekeeping ...
185
186
  {
  	cycle_t cycle_now, cycle_delta;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
187
  	struct clocksource *clock;
9a055117d   Roman Zippel   clocksource: intr...
188
  	s64 nsec;
8524070b7   John Stultz   Move timekeeping ...
189

155ec6022   Martin Schwidefsky   timekeeping: Intr...
190
  	clock = timekeeper.clock;
a0f7d48bf   Martin Schwidefsky   timekeeping: Remo...
191
  	cycle_now = clock->read(clock);
8524070b7   John Stultz   Move timekeeping ...
192
  	cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
9a055117d   Roman Zippel   clocksource: intr...
193
  	clock->cycle_last = cycle_now;
8524070b7   John Stultz   Move timekeeping ...
194

0a5441983   Martin Schwidefsky   timekeeping: Move...
195
196
  	nsec = clocksource_cyc2ns(cycle_delta, timekeeper.mult,
  				  timekeeper.shift);
7d27558c4   John Stultz   timekeeping: crea...
197
198
199
  
  	/* If arch requires, add in gettimeoffset() */
  	nsec += arch_gettimeoffset();
9a055117d   Roman Zippel   clocksource: intr...
200
  	timespec_add_ns(&xtime, nsec);
2d42244ae   John Stultz   clocksource: intr...
201

0a5441983   Martin Schwidefsky   timekeeping: Move...
202
  	nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
203
  	timespec_add_ns(&raw_time, nsec);
8524070b7   John Stultz   Move timekeeping ...
204
205
206
  }
  
  /**
efd9ac863   Geert Uytterhoeven   time: fold __get_...
207
   * getnstimeofday - Returns the time of day in a timespec
8524070b7   John Stultz   Move timekeeping ...
208
209
   * @ts:		pointer to the timespec to be set
   *
efd9ac863   Geert Uytterhoeven   time: fold __get_...
210
   * Returns the time of day in a timespec.
8524070b7   John Stultz   Move timekeeping ...
211
   */
efd9ac863   Geert Uytterhoeven   time: fold __get_...
212
  void getnstimeofday(struct timespec *ts)
8524070b7   John Stultz   Move timekeeping ...
213
214
215
  {
  	unsigned long seq;
  	s64 nsecs;
1c5745aa3   Thomas Gleixner   sched_clock: prev...
216
  	WARN_ON(timekeeping_suspended);
8524070b7   John Stultz   Move timekeeping ...
217
218
219
220
  	do {
  		seq = read_seqbegin(&xtime_lock);
  
  		*ts = xtime;
2ba2a3054   Martin Schwidefsky   timekeeping: Add ...
221
  		nsecs = timekeeping_get_ns();
8524070b7   John Stultz   Move timekeeping ...
222

7d27558c4   John Stultz   timekeeping: crea...
223
224
  		/* If arch requires, add in gettimeoffset() */
  		nsecs += arch_gettimeoffset();
8524070b7   John Stultz   Move timekeeping ...
225
226
227
228
  	} while (read_seqretry(&xtime_lock, seq));
  
  	timespec_add_ns(ts, nsecs);
  }
8524070b7   John Stultz   Move timekeeping ...
229
  EXPORT_SYMBOL(getnstimeofday);
951ed4d36   Martin Schwidefsky   timekeeping: opti...
230
231
  ktime_t ktime_get(void)
  {
951ed4d36   Martin Schwidefsky   timekeeping: opti...
232
233
234
235
236
237
238
239
240
  	unsigned int seq;
  	s64 secs, nsecs;
  
  	WARN_ON(timekeeping_suspended);
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		secs = xtime.tv_sec + wall_to_monotonic.tv_sec;
  		nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec;
2ba2a3054   Martin Schwidefsky   timekeeping: Add ...
241
  		nsecs += timekeeping_get_ns();
d004e0240   Hector Palacios   timekeeping: add ...
242
243
  		/* If arch requires, add in gettimeoffset() */
  		nsecs += arch_gettimeoffset();
951ed4d36   Martin Schwidefsky   timekeeping: opti...
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
  
  	} while (read_seqretry(&xtime_lock, seq));
  	/*
  	 * Use ktime_set/ktime_add_ns to create a proper ktime on
  	 * 32-bit architectures without CONFIG_KTIME_SCALAR.
  	 */
  	return ktime_add_ns(ktime_set(secs, 0), nsecs);
  }
  EXPORT_SYMBOL_GPL(ktime_get);
  
  /**
   * ktime_get_ts - get the monotonic clock in timespec format
   * @ts:		pointer to timespec variable
   *
   * The function calculates the monotonic clock from the realtime
   * clock and the wall_to_monotonic offset and stores the result
   * in normalized timespec format in the variable pointed to by @ts.
   */
  void ktime_get_ts(struct timespec *ts)
  {
951ed4d36   Martin Schwidefsky   timekeeping: opti...
264
265
266
267
268
269
270
271
272
273
  	struct timespec tomono;
  	unsigned int seq;
  	s64 nsecs;
  
  	WARN_ON(timekeeping_suspended);
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		*ts = xtime;
  		tomono = wall_to_monotonic;
2ba2a3054   Martin Schwidefsky   timekeeping: Add ...
274
  		nsecs = timekeeping_get_ns();
d004e0240   Hector Palacios   timekeeping: add ...
275
276
  		/* If arch requires, add in gettimeoffset() */
  		nsecs += arch_gettimeoffset();
951ed4d36   Martin Schwidefsky   timekeeping: opti...
277
278
279
280
281
282
283
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec,
  				ts->tv_nsec + tomono.tv_nsec + nsecs);
  }
  EXPORT_SYMBOL_GPL(ktime_get_ts);
e2c18e49a   Alexander Gordeev   pps: capture MONO...
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
  #ifdef CONFIG_NTP_PPS
  
  /**
   * getnstime_raw_and_real - get day and raw monotonic time in timespec format
   * @ts_raw:	pointer to the timespec to be set to raw monotonic time
   * @ts_real:	pointer to the timespec to be set to the time of day
   *
   * This function reads both the time of day and raw monotonic time at the
   * same time atomically and stores the resulting timestamps in timespec
   * format.
   */
  void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real)
  {
  	unsigned long seq;
  	s64 nsecs_raw, nsecs_real;
  
  	WARN_ON_ONCE(timekeeping_suspended);
  
  	do {
  		u32 arch_offset;
  
  		seq = read_seqbegin(&xtime_lock);
  
  		*ts_raw = raw_time;
  		*ts_real = xtime;
  
  		nsecs_raw = timekeeping_get_ns_raw();
  		nsecs_real = timekeeping_get_ns();
  
  		/* If arch requires, add in gettimeoffset() */
  		arch_offset = arch_gettimeoffset();
  		nsecs_raw += arch_offset;
  		nsecs_real += arch_offset;
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	timespec_add_ns(ts_raw, nsecs_raw);
  	timespec_add_ns(ts_real, nsecs_real);
  }
  EXPORT_SYMBOL(getnstime_raw_and_real);
  
  #endif /* CONFIG_NTP_PPS */
8524070b7   John Stultz   Move timekeeping ...
326
327
328
329
  /**
   * do_gettimeofday - Returns the time of day in a timeval
   * @tv:		pointer to the timeval to be set
   *
efd9ac863   Geert Uytterhoeven   time: fold __get_...
330
   * NOTE: Users should be converted to using getnstimeofday()
8524070b7   John Stultz   Move timekeeping ...
331
332
333
334
   */
  void do_gettimeofday(struct timeval *tv)
  {
  	struct timespec now;
efd9ac863   Geert Uytterhoeven   time: fold __get_...
335
  	getnstimeofday(&now);
8524070b7   John Stultz   Move timekeeping ...
336
337
338
339
340
341
342
343
344
345
346
  	tv->tv_sec = now.tv_sec;
  	tv->tv_usec = now.tv_nsec/1000;
  }
  
  EXPORT_SYMBOL(do_gettimeofday);
  /**
   * do_settimeofday - Sets the time of day
   * @tv:		pointer to the timespec variable containing the new time
   *
   * Sets the time of day to the new time and update NTP and notify hrtimers
   */
1e6d76792   Richard Cochran   time: Correct the...
347
  int do_settimeofday(const struct timespec *tv)
8524070b7   John Stultz   Move timekeeping ...
348
  {
9a055117d   Roman Zippel   clocksource: intr...
349
  	struct timespec ts_delta;
8524070b7   John Stultz   Move timekeeping ...
350
  	unsigned long flags;
8524070b7   John Stultz   Move timekeeping ...
351
352
353
354
355
  
  	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
  		return -EINVAL;
  
  	write_seqlock_irqsave(&xtime_lock, flags);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
356
  	timekeeping_forward_now();
9a055117d   Roman Zippel   clocksource: intr...
357
358
359
360
  
  	ts_delta.tv_sec = tv->tv_sec - xtime.tv_sec;
  	ts_delta.tv_nsec = tv->tv_nsec - xtime.tv_nsec;
  	wall_to_monotonic = timespec_sub(wall_to_monotonic, ts_delta);
8524070b7   John Stultz   Move timekeeping ...
361

9a055117d   Roman Zippel   clocksource: intr...
362
  	xtime = *tv;
8524070b7   John Stultz   Move timekeeping ...
363

155ec6022   Martin Schwidefsky   timekeeping: Intr...
364
  	timekeeper.ntp_error = 0;
8524070b7   John Stultz   Move timekeeping ...
365
  	ntp_clear();
7615856eb   John Stultz   timkeeping: Fix u...
366
367
  	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
  				timekeeper.mult);
8524070b7   John Stultz   Move timekeeping ...
368
369
370
371
372
373
374
375
376
377
  
  	write_sequnlock_irqrestore(&xtime_lock, flags);
  
  	/* signal hrtimers about time change */
  	clock_was_set();
  
  	return 0;
  }
  
  EXPORT_SYMBOL(do_settimeofday);
c528f7c6c   John Stultz   time: Introduce t...
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  
  /**
   * timekeeping_inject_offset - Adds or subtracts from the current time.
   * @tv:		pointer to the timespec variable containing the offset
   *
   * Adds or subtracts an offset value from the current time.
   */
  int timekeeping_inject_offset(struct timespec *ts)
  {
  	unsigned long flags;
  
  	if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
  		return -EINVAL;
  
  	write_seqlock_irqsave(&xtime_lock, flags);
  
  	timekeeping_forward_now();
  
  	xtime = timespec_add(xtime, *ts);
  	wall_to_monotonic = timespec_sub(wall_to_monotonic, *ts);
  
  	timekeeper.ntp_error = 0;
  	ntp_clear();
  
  	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
  				timekeeper.mult);
  
  	write_sequnlock_irqrestore(&xtime_lock, flags);
  
  	/* signal hrtimers about time change */
  	clock_was_set();
  
  	return 0;
  }
  EXPORT_SYMBOL(timekeeping_inject_offset);
8524070b7   John Stultz   Move timekeeping ...
413
414
415
416
417
  /**
   * change_clocksource - Swaps clocksources if a new one is available
   *
   * Accumulates current time interval and initializes new clocksource
   */
75c5158f7   Martin Schwidefsky   timekeeping: Upda...
418
  static int change_clocksource(void *data)
8524070b7   John Stultz   Move timekeeping ...
419
  {
4614e6ada   Magnus Damm   clocksource: add ...
420
  	struct clocksource *new, *old;
8524070b7   John Stultz   Move timekeeping ...
421

75c5158f7   Martin Schwidefsky   timekeeping: Upda...
422
  	new = (struct clocksource *) data;
8524070b7   John Stultz   Move timekeeping ...
423

155ec6022   Martin Schwidefsky   timekeeping: Intr...
424
  	timekeeping_forward_now();
75c5158f7   Martin Schwidefsky   timekeeping: Upda...
425
426
427
428
429
430
431
432
  	if (!new->enable || new->enable(new) == 0) {
  		old = timekeeper.clock;
  		timekeeper_setup_internals(new);
  		if (old->disable)
  			old->disable(old);
  	}
  	return 0;
  }
8524070b7   John Stultz   Move timekeeping ...
433

75c5158f7   Martin Schwidefsky   timekeeping: Upda...
434
435
436
437
438
439
440
441
442
443
  /**
   * timekeeping_notify - Install a new clock source
   * @clock:		pointer to the clock source
   *
   * This function is called from clocksource.c after a new, better clock
   * source has been registered. The caller holds the clocksource_mutex.
   */
  void timekeeping_notify(struct clocksource *clock)
  {
  	if (timekeeper.clock == clock)
4614e6ada   Magnus Damm   clocksource: add ...
444
  		return;
75c5158f7   Martin Schwidefsky   timekeeping: Upda...
445
  	stop_machine(change_clocksource, clock, NULL);
8524070b7   John Stultz   Move timekeeping ...
446
  	tick_clock_notify();
8524070b7   John Stultz   Move timekeeping ...
447
  }
75c5158f7   Martin Schwidefsky   timekeeping: Upda...
448

a40f262cc   Thomas Gleixner   timekeeping: Move...
449
450
451
452
453
454
455
456
457
458
459
460
461
462
  /**
   * ktime_get_real - get the real (wall-) time in ktime_t format
   *
   * returns the time in ktime_t format
   */
  ktime_t ktime_get_real(void)
  {
  	struct timespec now;
  
  	getnstimeofday(&now);
  
  	return timespec_to_ktime(now);
  }
  EXPORT_SYMBOL_GPL(ktime_get_real);
8524070b7   John Stultz   Move timekeeping ...
463
464
  
  /**
2d42244ae   John Stultz   clocksource: intr...
465
466
467
468
469
470
471
472
473
   * getrawmonotonic - Returns the raw monotonic time in a timespec
   * @ts:		pointer to the timespec to be set
   *
   * Returns the raw monotonic time (completely un-modified by ntp)
   */
  void getrawmonotonic(struct timespec *ts)
  {
  	unsigned long seq;
  	s64 nsecs;
2d42244ae   John Stultz   clocksource: intr...
474
475
476
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
2ba2a3054   Martin Schwidefsky   timekeeping: Add ...
477
  		nsecs = timekeeping_get_ns_raw();
155ec6022   Martin Schwidefsky   timekeeping: Intr...
478
  		*ts = raw_time;
2d42244ae   John Stultz   clocksource: intr...
479
480
481
482
483
484
485
486
487
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	timespec_add_ns(ts, nsecs);
  }
  EXPORT_SYMBOL(getrawmonotonic);
  
  
  /**
cf4fc6cb7   Li Zefan   timekeeping: rena...
488
   * timekeeping_valid_for_hres - Check if timekeeping is suitable for hres
8524070b7   John Stultz   Move timekeeping ...
489
   */
cf4fc6cb7   Li Zefan   timekeeping: rena...
490
  int timekeeping_valid_for_hres(void)
8524070b7   John Stultz   Move timekeeping ...
491
492
493
494
495
496
  {
  	unsigned long seq;
  	int ret;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
497
  		ret = timekeeper.clock->flags & CLOCK_SOURCE_VALID_FOR_HRES;
8524070b7   John Stultz   Move timekeeping ...
498
499
500
501
502
503
504
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	return ret;
  }
  
  /**
98962465e   Jon Hunter   nohz: Prevent clo...
505
506
507
508
509
510
511
512
513
514
515
   * timekeeping_max_deferment - Returns max time the clocksource can be deferred
   *
   * Caller must observe xtime_lock via read_seqbegin/read_seqretry to
   * ensure that the clocksource does not change!
   */
  u64 timekeeping_max_deferment(void)
  {
  	return timekeeper.clock->max_idle_ns;
  }
  
  /**
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
516
   * read_persistent_clock -  Return time from the persistent clock.
8524070b7   John Stultz   Move timekeeping ...
517
518
   *
   * Weak dummy function for arches that do not yet support it.
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
519
520
   * Reads the time from the battery backed persistent clock.
   * Returns a timespec with tv_sec=0 and tv_nsec=0 if unsupported.
8524070b7   John Stultz   Move timekeeping ...
521
522
523
   *
   *  XXX - Do be sure to remove it once all arches implement it.
   */
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
524
  void __attribute__((weak)) read_persistent_clock(struct timespec *ts)
8524070b7   John Stultz   Move timekeeping ...
525
  {
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
526
527
  	ts->tv_sec = 0;
  	ts->tv_nsec = 0;
8524070b7   John Stultz   Move timekeeping ...
528
  }
23970e389   Martin Schwidefsky   timekeeping: Intr...
529
530
531
532
533
534
535
536
537
538
539
540
541
542
  /**
   * read_boot_clock -  Return time of the system start.
   *
   * Weak dummy function for arches that do not yet support it.
   * Function to read the exact time the system has been started.
   * Returns a timespec with tv_sec=0 and tv_nsec=0 if unsupported.
   *
   *  XXX - Do be sure to remove it once all arches implement it.
   */
  void __attribute__((weak)) read_boot_clock(struct timespec *ts)
  {
  	ts->tv_sec = 0;
  	ts->tv_nsec = 0;
  }
8524070b7   John Stultz   Move timekeeping ...
543
544
545
546
547
  /*
   * timekeeping_init - Initializes the clocksource and common timekeeping values
   */
  void __init timekeeping_init(void)
  {
155ec6022   Martin Schwidefsky   timekeeping: Intr...
548
  	struct clocksource *clock;
8524070b7   John Stultz   Move timekeeping ...
549
  	unsigned long flags;
23970e389   Martin Schwidefsky   timekeeping: Intr...
550
  	struct timespec now, boot;
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
551
552
  
  	read_persistent_clock(&now);
23970e389   Martin Schwidefsky   timekeeping: Intr...
553
  	read_boot_clock(&boot);
8524070b7   John Stultz   Move timekeeping ...
554
555
  
  	write_seqlock_irqsave(&xtime_lock, flags);
7dffa3c67   Roman Zippel   ntp: handle leap ...
556
  	ntp_init();
8524070b7   John Stultz   Move timekeeping ...
557

f1b82746c   Martin Schwidefsky   clocksource: Clea...
558
  	clock = clocksource_default_clock();
a0f7d48bf   Martin Schwidefsky   timekeeping: Remo...
559
560
  	if (clock->enable)
  		clock->enable(clock);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
561
  	timekeeper_setup_internals(clock);
8524070b7   John Stultz   Move timekeeping ...
562

d4f587c67   Martin Schwidefsky   timekeeping: Incr...
563
564
  	xtime.tv_sec = now.tv_sec;
  	xtime.tv_nsec = now.tv_nsec;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
565
566
  	raw_time.tv_sec = 0;
  	raw_time.tv_nsec = 0;
23970e389   Martin Schwidefsky   timekeeping: Intr...
567
568
569
570
  	if (boot.tv_sec == 0 && boot.tv_nsec == 0) {
  		boot.tv_sec = xtime.tv_sec;
  		boot.tv_nsec = xtime.tv_nsec;
  	}
8524070b7   John Stultz   Move timekeeping ...
571
  	set_normalized_timespec(&wall_to_monotonic,
23970e389   Martin Schwidefsky   timekeeping: Intr...
572
  				-boot.tv_sec, -boot.tv_nsec);
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
573
574
  	total_sleep_time.tv_sec = 0;
  	total_sleep_time.tv_nsec = 0;
8524070b7   John Stultz   Move timekeeping ...
575
576
  	write_sequnlock_irqrestore(&xtime_lock, flags);
  }
8524070b7   John Stultz   Move timekeeping ...
577
  /* time in seconds when suspend began */
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
578
  static struct timespec timekeeping_suspend_time;
8524070b7   John Stultz   Move timekeeping ...
579
580
  
  /**
304529b1b   John Stultz   time: Add timekee...
581
582
583
584
585
586
587
588
   * __timekeeping_inject_sleeptime - Internal function to add sleep interval
   * @delta: pointer to a timespec delta value
   *
   * Takes a timespec offset measuring a suspend interval and properly
   * adds the sleep offset to the timekeeping variables.
   */
  static void __timekeeping_inject_sleeptime(struct timespec *delta)
  {
cb5de2f8d   John Stultz   time: Catch inval...
589
  	if (!timespec_valid(delta)) {
cbaa51524   John Stultz   time: Fix stupid ...
590
  		printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid "
cb5de2f8d   John Stultz   time: Catch inval...
591
592
593
594
  					"sleep delta value!
  ");
  		return;
  	}
304529b1b   John Stultz   time: Add timekee...
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
  	xtime = timespec_add(xtime, *delta);
  	wall_to_monotonic = timespec_sub(wall_to_monotonic, *delta);
  	total_sleep_time = timespec_add(total_sleep_time, *delta);
  }
  
  
  /**
   * timekeeping_inject_sleeptime - Adds suspend interval to timeekeeping values
   * @delta: pointer to a timespec delta value
   *
   * This hook is for architectures that cannot support read_persistent_clock
   * because their RTC/persistent clock is only accessible when irqs are enabled.
   *
   * This function should only be called by rtc_resume(), and allows
   * a suspend offset to be injected into the timekeeping values.
   */
  void timekeeping_inject_sleeptime(struct timespec *delta)
  {
  	unsigned long flags;
  	struct timespec ts;
  
  	/* Make sure we don't set the clock twice */
  	read_persistent_clock(&ts);
  	if (!(ts.tv_sec == 0 && ts.tv_nsec == 0))
  		return;
  
  	write_seqlock_irqsave(&xtime_lock, flags);
  	timekeeping_forward_now();
  
  	__timekeeping_inject_sleeptime(delta);
  
  	timekeeper.ntp_error = 0;
  	ntp_clear();
  	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
  				timekeeper.mult);
  
  	write_sequnlock_irqrestore(&xtime_lock, flags);
  
  	/* signal hrtimers about time change */
  	clock_was_set();
  }
  
  
  /**
8524070b7   John Stultz   Move timekeeping ...
639
   * timekeeping_resume - Resumes the generic timekeeping subsystem.
8524070b7   John Stultz   Move timekeeping ...
640
641
642
643
644
   *
   * This is for the generic clocksource timekeeping.
   * xtime/wall_to_monotonic/jiffies/etc are
   * still managed by arch specific suspend/resume code.
   */
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
645
  static void timekeeping_resume(void)
8524070b7   John Stultz   Move timekeeping ...
646
647
  {
  	unsigned long flags;
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
648
649
650
  	struct timespec ts;
  
  	read_persistent_clock(&ts);
8524070b7   John Stultz   Move timekeeping ...
651

d10ff3fb6   Thomas Gleixner   timekeeping fix p...
652
  	clocksource_resume();
8524070b7   John Stultz   Move timekeeping ...
653
  	write_seqlock_irqsave(&xtime_lock, flags);
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
654
655
  	if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
  		ts = timespec_sub(ts, timekeeping_suspend_time);
304529b1b   John Stultz   time: Add timekee...
656
  		__timekeeping_inject_sleeptime(&ts);
8524070b7   John Stultz   Move timekeeping ...
657
658
  	}
  	/* re-base the last cycle value */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
659
660
  	timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock);
  	timekeeper.ntp_error = 0;
8524070b7   John Stultz   Move timekeeping ...
661
662
663
664
665
666
667
668
  	timekeeping_suspended = 0;
  	write_sequnlock_irqrestore(&xtime_lock, flags);
  
  	touch_softlockup_watchdog();
  
  	clockevents_notify(CLOCK_EVT_NOTIFY_RESUME, NULL);
  
  	/* Resume hrtimers */
b12a03ce4   Thomas Gleixner   hrtimers: Prepare...
669
  	hrtimers_resume();
8524070b7   John Stultz   Move timekeeping ...
670
  }
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
671
  static int timekeeping_suspend(void)
8524070b7   John Stultz   Move timekeeping ...
672
673
  {
  	unsigned long flags;
cb33217b1   John Stultz   time: Avoid accum...
674
675
  	struct timespec		delta, delta_delta;
  	static struct timespec	old_delta;
8524070b7   John Stultz   Move timekeeping ...
676

d4f587c67   Martin Schwidefsky   timekeeping: Incr...
677
  	read_persistent_clock(&timekeeping_suspend_time);
3be909506   Thomas Gleixner   timekeeping: acce...
678

8524070b7   John Stultz   Move timekeeping ...
679
  	write_seqlock_irqsave(&xtime_lock, flags);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
680
  	timekeeping_forward_now();
8524070b7   John Stultz   Move timekeeping ...
681
  	timekeeping_suspended = 1;
cb33217b1   John Stultz   time: Avoid accum...
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
  
  	/*
  	 * To avoid drift caused by repeated suspend/resumes,
  	 * which each can add ~1 second drift error,
  	 * try to compensate so the difference in system time
  	 * and persistent_clock time stays close to constant.
  	 */
  	delta = timespec_sub(xtime, timekeeping_suspend_time);
  	delta_delta = timespec_sub(delta, old_delta);
  	if (abs(delta_delta.tv_sec)  >= 2) {
  		/*
  		 * if delta_delta is too large, assume time correction
  		 * has occured and set old_delta to the current delta.
  		 */
  		old_delta = delta;
  	} else {
  		/* Otherwise try to adjust old_system to compensate */
  		timekeeping_suspend_time =
  			timespec_add(timekeeping_suspend_time, delta_delta);
  	}
8524070b7   John Stultz   Move timekeeping ...
702
703
704
  	write_sequnlock_irqrestore(&xtime_lock, flags);
  
  	clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL);
c54a42b19   Magnus Damm   clocksource: add ...
705
  	clocksource_suspend();
8524070b7   John Stultz   Move timekeeping ...
706
707
708
709
710
  
  	return 0;
  }
  
  /* sysfs resume/suspend bits for timekeeping */
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
711
  static struct syscore_ops timekeeping_syscore_ops = {
8524070b7   John Stultz   Move timekeeping ...
712
713
  	.resume		= timekeeping_resume,
  	.suspend	= timekeeping_suspend,
8524070b7   John Stultz   Move timekeeping ...
714
  };
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
715
  static int __init timekeeping_init_ops(void)
8524070b7   John Stultz   Move timekeeping ...
716
  {
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
717
718
  	register_syscore_ops(&timekeeping_syscore_ops);
  	return 0;
8524070b7   John Stultz   Move timekeeping ...
719
  }
e1a85b2c5   Rafael J. Wysocki   timekeeping: Use ...
720
  device_initcall(timekeeping_init_ops);
8524070b7   John Stultz   Move timekeeping ...
721
722
723
724
725
  
  /*
   * If the error is already larger, we look ahead even further
   * to compensate for late or lost adjustments.
   */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
726
  static __always_inline int timekeeping_bigadjust(s64 error, s64 *interval,
8524070b7   John Stultz   Move timekeeping ...
727
728
729
730
731
732
733
734
735
736
737
738
  						 s64 *offset)
  {
  	s64 tick_error, i;
  	u32 look_ahead, adj;
  	s32 error2, mult;
  
  	/*
  	 * Use the current error value to determine how much to look ahead.
  	 * The larger the error the slower we adjust for it to avoid problems
  	 * with losing too many ticks, otherwise we would overadjust and
  	 * produce an even larger error.  The smaller the adjustment the
  	 * faster we try to adjust for it, as lost ticks can do less harm
3eb056764   Li Zefan   time: fix typo in...
739
  	 * here.  This is tuned so that an error of about 1 msec is adjusted
8524070b7   John Stultz   Move timekeeping ...
740
741
  	 * within about 1 sec (or 2^20 nsec in 2^SHIFT_HZ ticks).
  	 */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
742
  	error2 = timekeeper.ntp_error >> (NTP_SCALE_SHIFT + 22 - 2 * SHIFT_HZ);
8524070b7   John Stultz   Move timekeeping ...
743
744
745
746
747
748
749
750
  	error2 = abs(error2);
  	for (look_ahead = 0; error2 > 0; look_ahead++)
  		error2 >>= 2;
  
  	/*
  	 * Now calculate the error in (1 << look_ahead) ticks, but first
  	 * remove the single look ahead already included in the error.
  	 */
23ce72117   Martin Schwidefsky   timekeeping: Add ...
751
  	tick_error = tick_length >> (timekeeper.ntp_error_shift + 1);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
752
  	tick_error -= timekeeper.xtime_interval >> 1;
8524070b7   John Stultz   Move timekeeping ...
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
  	error = ((error - tick_error) >> look_ahead) + tick_error;
  
  	/* Finally calculate the adjustment shift value.  */
  	i = *interval;
  	mult = 1;
  	if (error < 0) {
  		error = -error;
  		*interval = -*interval;
  		*offset = -*offset;
  		mult = -1;
  	}
  	for (adj = 0; error > i; adj++)
  		error >>= 1;
  
  	*interval <<= adj;
  	*offset <<= adj;
  	return mult << adj;
  }
  
  /*
   * Adjust the multiplier to reduce the error value,
   * this is optimized for the most common adjustments of -1,0,1,
   * for other values we can do a bit more work.
   */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
777
  static void timekeeping_adjust(s64 offset)
8524070b7   John Stultz   Move timekeeping ...
778
  {
155ec6022   Martin Schwidefsky   timekeeping: Intr...
779
  	s64 error, interval = timekeeper.cycle_interval;
8524070b7   John Stultz   Move timekeeping ...
780
  	int adj;
c2bc11113   John Stultz   time: Improve doc...
781
782
783
784
785
786
787
  	/*
  	 * The point of this is to check if the error is greater then half
  	 * an interval.
  	 *
  	 * First we shift it down from NTP_SHIFT to clocksource->shifted nsecs.
  	 *
  	 * Note we subtract one in the shift, so that error is really error*2.
3f86f28ff   John Stultz   time: Fix spellin...
788
789
  	 * This "saves" dividing(shifting) interval twice, but keeps the
  	 * (error > interval) comparison as still measuring if error is
c2bc11113   John Stultz   time: Improve doc...
790
791
  	 * larger then half an interval.
  	 *
3f86f28ff   John Stultz   time: Fix spellin...
792
  	 * Note: It does not "save" on aggravation when reading the code.
c2bc11113   John Stultz   time: Improve doc...
793
  	 */
23ce72117   Martin Schwidefsky   timekeeping: Add ...
794
  	error = timekeeper.ntp_error >> (timekeeper.ntp_error_shift - 1);
8524070b7   John Stultz   Move timekeeping ...
795
  	if (error > interval) {
c2bc11113   John Stultz   time: Improve doc...
796
797
798
799
800
801
  		/*
  		 * We now divide error by 4(via shift), which checks if
  		 * the error is greater then twice the interval.
  		 * If it is greater, we need a bigadjust, if its smaller,
  		 * we can adjust by 1.
  		 */
8524070b7   John Stultz   Move timekeeping ...
802
  		error >>= 2;
c2bc11113   John Stultz   time: Improve doc...
803
804
805
806
807
  		/*
  		 * XXX - In update_wall_time, we round up to the next
  		 * nanosecond, and store the amount rounded up into
  		 * the error. This causes the likely below to be unlikely.
  		 *
3f86f28ff   John Stultz   time: Fix spellin...
808
  		 * The proper fix is to avoid rounding up by using
c2bc11113   John Stultz   time: Improve doc...
809
810
811
812
  		 * the high precision timekeeper.xtime_nsec instead of
  		 * xtime.tv_nsec everywhere. Fixing this will take some
  		 * time.
  		 */
8524070b7   John Stultz   Move timekeeping ...
813
814
815
  		if (likely(error <= interval))
  			adj = 1;
  		else
155ec6022   Martin Schwidefsky   timekeeping: Intr...
816
  			adj = timekeeping_bigadjust(error, &interval, &offset);
8524070b7   John Stultz   Move timekeeping ...
817
  	} else if (error < -interval) {
c2bc11113   John Stultz   time: Improve doc...
818
  		/* See comment above, this is just switched for the negative */
8524070b7   John Stultz   Move timekeeping ...
819
820
821
822
823
824
  		error >>= 2;
  		if (likely(error >= -interval)) {
  			adj = -1;
  			interval = -interval;
  			offset = -offset;
  		} else
155ec6022   Martin Schwidefsky   timekeeping: Intr...
825
  			adj = timekeeping_bigadjust(error, &interval, &offset);
c2bc11113   John Stultz   time: Improve doc...
826
  	} else /* No adjustment needed */
8524070b7   John Stultz   Move timekeeping ...
827
  		return;
d65670a78   John Stultz   clocksource: Avoi...
828
829
830
831
832
833
834
835
  	WARN_ONCE(timekeeper.clock->maxadj &&
  			(timekeeper.mult + adj > timekeeper.clock->mult +
  						timekeeper.clock->maxadj),
  			"Adjusting %s more then 11%% (%ld vs %ld)
  ",
  			timekeeper.clock->name, (long)timekeeper.mult + adj,
  			(long)timekeeper.clock->mult +
  				timekeeper.clock->maxadj);
c2bc11113   John Stultz   time: Improve doc...
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
  	/*
  	 * So the following can be confusing.
  	 *
  	 * To keep things simple, lets assume adj == 1 for now.
  	 *
  	 * When adj != 1, remember that the interval and offset values
  	 * have been appropriately scaled so the math is the same.
  	 *
  	 * The basic idea here is that we're increasing the multiplier
  	 * by one, this causes the xtime_interval to be incremented by
  	 * one cycle_interval. This is because:
  	 *	xtime_interval = cycle_interval * mult
  	 * So if mult is being incremented by one:
  	 *	xtime_interval = cycle_interval * (mult + 1)
  	 * Its the same as:
  	 *	xtime_interval = (cycle_interval * mult) + cycle_interval
  	 * Which can be shortened to:
  	 *	xtime_interval += cycle_interval
  	 *
  	 * So offset stores the non-accumulated cycles. Thus the current
  	 * time (in shifted nanoseconds) is:
  	 *	now = (offset * adj) + xtime_nsec
  	 * Now, even though we're adjusting the clock frequency, we have
  	 * to keep time consistent. In other words, we can't jump back
  	 * in time, and we also want to avoid jumping forward in time.
  	 *
  	 * So given the same offset value, we need the time to be the same
  	 * both before and after the freq adjustment.
  	 *	now = (offset * adj_1) + xtime_nsec_1
  	 *	now = (offset * adj_2) + xtime_nsec_2
  	 * So:
  	 *	(offset * adj_1) + xtime_nsec_1 =
  	 *		(offset * adj_2) + xtime_nsec_2
  	 * And we know:
  	 *	adj_2 = adj_1 + 1
  	 * So:
  	 *	(offset * adj_1) + xtime_nsec_1 =
  	 *		(offset * (adj_1+1)) + xtime_nsec_2
  	 *	(offset * adj_1) + xtime_nsec_1 =
  	 *		(offset * adj_1) + offset + xtime_nsec_2
  	 * Canceling the sides:
  	 *	xtime_nsec_1 = offset + xtime_nsec_2
  	 * Which gives us:
  	 *	xtime_nsec_2 = xtime_nsec_1 - offset
  	 * Which simplfies to:
  	 *	xtime_nsec -= offset
  	 *
  	 * XXX - TODO: Doc ntp_error calculation.
  	 */
0a5441983   Martin Schwidefsky   timekeeping: Move...
885
  	timekeeper.mult += adj;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
886
887
888
  	timekeeper.xtime_interval += interval;
  	timekeeper.xtime_nsec -= offset;
  	timekeeper.ntp_error -= (interval - offset) <<
23ce72117   Martin Schwidefsky   timekeeping: Add ...
889
  				timekeeper.ntp_error_shift;
8524070b7   John Stultz   Move timekeeping ...
890
  }
83f57a11d   Linus Torvalds   Revert "time: Rem...
891

8524070b7   John Stultz   Move timekeeping ...
892
  /**
a092ff0f9   John Stultz   time: Implement l...
893
894
895
896
897
898
899
900
901
902
903
   * logarithmic_accumulation - shifted accumulation of cycles
   *
   * This functions accumulates a shifted interval of cycles into
   * into a shifted interval nanoseconds. Allows for O(log) accumulation
   * loop.
   *
   * Returns the unconsumed cycles.
   */
  static cycle_t logarithmic_accumulation(cycle_t offset, int shift)
  {
  	u64 nsecps = (u64)NSEC_PER_SEC << timekeeper.shift;
deda2e819   Jason Wessel   timekeeping: Fix ...
904
  	u64 raw_nsecs;
a092ff0f9   John Stultz   time: Implement l...
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
  
  	/* If the offset is smaller then a shifted interval, do nothing */
  	if (offset < timekeeper.cycle_interval<<shift)
  		return offset;
  
  	/* Accumulate one shifted interval */
  	offset -= timekeeper.cycle_interval << shift;
  	timekeeper.clock->cycle_last += timekeeper.cycle_interval << shift;
  
  	timekeeper.xtime_nsec += timekeeper.xtime_interval << shift;
  	while (timekeeper.xtime_nsec >= nsecps) {
  		timekeeper.xtime_nsec -= nsecps;
  		xtime.tv_sec++;
  		second_overflow();
  	}
deda2e819   Jason Wessel   timekeeping: Fix ...
920
921
922
  	/* Accumulate raw time */
  	raw_nsecs = timekeeper.raw_interval << shift;
  	raw_nsecs += raw_time.tv_nsec;
c7dcf87a6   John Stultz   time: Workaround ...
923
924
925
926
  	if (raw_nsecs >= NSEC_PER_SEC) {
  		u64 raw_secs = raw_nsecs;
  		raw_nsecs = do_div(raw_secs, NSEC_PER_SEC);
  		raw_time.tv_sec += raw_secs;
a092ff0f9   John Stultz   time: Implement l...
927
  	}
deda2e819   Jason Wessel   timekeeping: Fix ...
928
  	raw_time.tv_nsec = raw_nsecs;
a092ff0f9   John Stultz   time: Implement l...
929
930
931
  
  	/* Accumulate error between NTP and clock interval */
  	timekeeper.ntp_error += tick_length << shift;
a386b5af8   Kasper Pedersen   time: Compensate ...
932
933
  	timekeeper.ntp_error -=
  	    (timekeeper.xtime_interval + timekeeper.xtime_remainder) <<
a092ff0f9   John Stultz   time: Implement l...
934
935
936
937
  				(timekeeper.ntp_error_shift + shift);
  
  	return offset;
  }
83f57a11d   Linus Torvalds   Revert "time: Rem...
938

8524070b7   John Stultz   Move timekeeping ...
939
940
941
942
943
  /**
   * update_wall_time - Uses the current clocksource to increment the wall time
   *
   * Called from the timer interrupt, must hold a write on xtime_lock.
   */
871cf1e5f   Torben Hohn   time: Move do_tim...
944
  static void update_wall_time(void)
8524070b7   John Stultz   Move timekeeping ...
945
  {
155ec6022   Martin Schwidefsky   timekeeping: Intr...
946
  	struct clocksource *clock;
8524070b7   John Stultz   Move timekeeping ...
947
  	cycle_t offset;
a092ff0f9   John Stultz   time: Implement l...
948
  	int shift = 0, maxshift;
8524070b7   John Stultz   Move timekeeping ...
949
950
951
952
  
  	/* Make sure we're fully resumed: */
  	if (unlikely(timekeeping_suspended))
  		return;
155ec6022   Martin Schwidefsky   timekeeping: Intr...
953
  	clock = timekeeper.clock;
592913ecb   John Stultz   time: Kill off CO...
954
955
  
  #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
155ec6022   Martin Schwidefsky   timekeeping: Intr...
956
  	offset = timekeeper.cycle_interval;
592913ecb   John Stultz   time: Kill off CO...
957
958
  #else
  	offset = (clock->read(clock) - clock->cycle_last) & clock->mask;
8524070b7   John Stultz   Move timekeeping ...
959
  #endif
23ce72117   Martin Schwidefsky   timekeeping: Add ...
960
  	timekeeper.xtime_nsec = (s64)xtime.tv_nsec << timekeeper.shift;
8524070b7   John Stultz   Move timekeeping ...
961

a092ff0f9   John Stultz   time: Implement l...
962
963
964
965
966
967
968
  	/*
  	 * With NO_HZ we may have to accumulate many cycle_intervals
  	 * (think "ticks") worth of time at once. To do this efficiently,
  	 * we calculate the largest doubling multiple of cycle_intervals
  	 * that is smaller then the offset. We then accumulate that
  	 * chunk in one go, and then try to consume the next smaller
  	 * doubled multiple.
8524070b7   John Stultz   Move timekeeping ...
969
  	 */
a092ff0f9   John Stultz   time: Implement l...
970
971
972
973
974
  	shift = ilog2(offset) - ilog2(timekeeper.cycle_interval);
  	shift = max(0, shift);
  	/* Bound shift to one less then what overflows tick_length */
  	maxshift = (8*sizeof(tick_length) - (ilog2(tick_length)+1)) - 1;
  	shift = min(shift, maxshift);
155ec6022   Martin Schwidefsky   timekeeping: Intr...
975
  	while (offset >= timekeeper.cycle_interval) {
a092ff0f9   John Stultz   time: Implement l...
976
  		offset = logarithmic_accumulation(offset, shift);
830ec0458   John Stultz   time: Fix accumul...
977
978
  		if(offset < timekeeper.cycle_interval<<shift)
  			shift--;
8524070b7   John Stultz   Move timekeeping ...
979
980
981
  	}
  
  	/* correct the clock when NTP error is too big */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
982
  	timekeeping_adjust(offset);
8524070b7   John Stultz   Move timekeeping ...
983

6c9bacb41   John Stultz   time: catch xtime...
984
985
986
987
  	/*
  	 * Since in the loop above, we accumulate any amount of time
  	 * in xtime_nsec over a second into xtime.tv_sec, its possible for
  	 * xtime_nsec to be fairly small after the loop. Further, if we're
155ec6022   Martin Schwidefsky   timekeeping: Intr...
988
  	 * slightly speeding the clocksource up in timekeeping_adjust(),
6c9bacb41   John Stultz   time: catch xtime...
989
990
991
992
993
994
995
996
997
998
999
  	 * its possible the required corrective factor to xtime_nsec could
  	 * cause it to underflow.
  	 *
  	 * Now, we cannot simply roll the accumulated second back, since
  	 * the NTP subsystem has been notified via second_overflow. So
  	 * instead we push xtime_nsec forward by the amount we underflowed,
  	 * and add that amount into the error.
  	 *
  	 * We'll correct this error next time through this function, when
  	 * xtime_nsec is not as small.
  	 */
155ec6022   Martin Schwidefsky   timekeeping: Intr...
1000
1001
1002
  	if (unlikely((s64)timekeeper.xtime_nsec < 0)) {
  		s64 neg = -(s64)timekeeper.xtime_nsec;
  		timekeeper.xtime_nsec = 0;
23ce72117   Martin Schwidefsky   timekeeping: Add ...
1003
  		timekeeper.ntp_error += neg << timekeeper.ntp_error_shift;
6c9bacb41   John Stultz   time: catch xtime...
1004
  	}
6a867a395   John Stultz   time: Remove xtim...
1005
1006
1007
  
  	/*
  	 * Store full nanoseconds into xtime after rounding it up and
5cd1c9c5c   Roman Zippel   timekeeping: fix ...
1008
1009
  	 * add the remainder to the error difference.
  	 */
23ce72117   Martin Schwidefsky   timekeeping: Add ...
1010
1011
1012
1013
  	xtime.tv_nsec =	((s64) timekeeper.xtime_nsec >> timekeeper.shift) + 1;
  	timekeeper.xtime_nsec -= (s64) xtime.tv_nsec << timekeeper.shift;
  	timekeeper.ntp_error +=	timekeeper.xtime_nsec <<
  				timekeeper.ntp_error_shift;
8524070b7   John Stultz   Move timekeeping ...
1014

6a867a395   John Stultz   time: Remove xtim...
1015
1016
1017
1018
1019
1020
1021
1022
1023
  	/*
  	 * Finally, make sure that after the rounding
  	 * xtime.tv_nsec isn't larger then NSEC_PER_SEC
  	 */
  	if (unlikely(xtime.tv_nsec >= NSEC_PER_SEC)) {
  		xtime.tv_nsec -= NSEC_PER_SEC;
  		xtime.tv_sec++;
  		second_overflow();
  	}
83f57a11d   Linus Torvalds   Revert "time: Rem...
1024

8524070b7   John Stultz   Move timekeeping ...
1025
  	/* check to see if there is a new clocksource to use */
7615856eb   John Stultz   timkeeping: Fix u...
1026
1027
  	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
  				timekeeper.mult);
8524070b7   John Stultz   Move timekeeping ...
1028
  }
7c3f1a573   Tomas Janousek   Introduce boot ba...
1029
1030
1031
1032
1033
  
  /**
   * getboottime - Return the real time of system boot.
   * @ts:		pointer to the timespec to be set
   *
abb3a4ea2   John Stultz   time: Introduce g...
1034
   * Returns the wall-time of boot in a timespec.
7c3f1a573   Tomas Janousek   Introduce boot ba...
1035
1036
1037
1038
1039
1040
1041
1042
   *
   * This is based on the wall_to_monotonic offset and the total suspend
   * time. Calls to settimeofday will affect the value returned (which
   * basically means that however wrong your real time clock is at boot time,
   * you get the right time here).
   */
  void getboottime(struct timespec *ts)
  {
36d47481b   Hiroshi Shimamoto   timekeeping: Fix ...
1043
1044
1045
1046
  	struct timespec boottime = {
  		.tv_sec = wall_to_monotonic.tv_sec + total_sleep_time.tv_sec,
  		.tv_nsec = wall_to_monotonic.tv_nsec + total_sleep_time.tv_nsec
  	};
d4f587c67   Martin Schwidefsky   timekeeping: Incr...
1047

d4f587c67   Martin Schwidefsky   timekeeping: Incr...
1048
  	set_normalized_timespec(ts, -boottime.tv_sec, -boottime.tv_nsec);
7c3f1a573   Tomas Janousek   Introduce boot ba...
1049
  }
c93d89f3d   Jason Wang   Export the symbol...
1050
  EXPORT_SYMBOL_GPL(getboottime);
7c3f1a573   Tomas Janousek   Introduce boot ba...
1051

abb3a4ea2   John Stultz   time: Introduce g...
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
  
  /**
   * get_monotonic_boottime - Returns monotonic time since boot
   * @ts:		pointer to the timespec to be set
   *
   * Returns the monotonic time since boot in a timespec.
   *
   * This is similar to CLOCK_MONTONIC/ktime_get_ts, but also
   * includes the time spent in suspend.
   */
  void get_monotonic_boottime(struct timespec *ts)
  {
  	struct timespec tomono, sleep;
  	unsigned int seq;
  	s64 nsecs;
  
  	WARN_ON(timekeeping_suspended);
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		*ts = xtime;
  		tomono = wall_to_monotonic;
  		sleep = total_sleep_time;
  		nsecs = timekeeping_get_ns();
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec,
  			ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs);
  }
  EXPORT_SYMBOL_GPL(get_monotonic_boottime);
  
  /**
   * ktime_get_boottime - Returns monotonic time since boot in a ktime
   *
   * Returns the monotonic time since boot in a ktime
   *
   * This is similar to CLOCK_MONTONIC/ktime_get, but also
   * includes the time spent in suspend.
   */
  ktime_t ktime_get_boottime(void)
  {
  	struct timespec ts;
  
  	get_monotonic_boottime(&ts);
  	return timespec_to_ktime(ts);
  }
  EXPORT_SYMBOL_GPL(ktime_get_boottime);
7c3f1a573   Tomas Janousek   Introduce boot ba...
1100
1101
1102
1103
1104
1105
  /**
   * monotonic_to_bootbased - Convert the monotonic time to boot based.
   * @ts:		pointer to the timespec to be converted
   */
  void monotonic_to_bootbased(struct timespec *ts)
  {
ce3bf7ab2   John Stultz   time: Implement t...
1106
  	*ts = timespec_add(*ts, total_sleep_time);
7c3f1a573   Tomas Janousek   Introduce boot ba...
1107
  }
c93d89f3d   Jason Wang   Export the symbol...
1108
  EXPORT_SYMBOL_GPL(monotonic_to_bootbased);
2c6b47de1   John Stultz   Cleanup non-arch ...
1109

17c38b749   John Stultz   Cache xtime every...
1110
1111
  unsigned long get_seconds(void)
  {
6a867a395   John Stultz   time: Remove xtim...
1112
  	return xtime.tv_sec;
17c38b749   John Stultz   Cache xtime every...
1113
1114
  }
  EXPORT_SYMBOL(get_seconds);
da15cfdae   John Stultz   time: Introduce C...
1115
1116
  struct timespec __current_kernel_time(void)
  {
6a867a395   John Stultz   time: Remove xtim...
1117
  	return xtime;
da15cfdae   John Stultz   time: Introduce C...
1118
  }
17c38b749   John Stultz   Cache xtime every...
1119

2c6b47de1   John Stultz   Cleanup non-arch ...
1120
1121
1122
1123
1124
1125
1126
  struct timespec current_kernel_time(void)
  {
  	struct timespec now;
  	unsigned long seq;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
83f57a11d   Linus Torvalds   Revert "time: Rem...
1127

6a867a395   John Stultz   time: Remove xtim...
1128
  		now = xtime;
2c6b47de1   John Stultz   Cleanup non-arch ...
1129
1130
1131
1132
  	} while (read_seqretry(&xtime_lock, seq));
  
  	return now;
  }
2c6b47de1   John Stultz   Cleanup non-arch ...
1133
  EXPORT_SYMBOL(current_kernel_time);
da15cfdae   John Stultz   time: Introduce C...
1134
1135
1136
1137
1138
1139
1140
1141
  
  struct timespec get_monotonic_coarse(void)
  {
  	struct timespec now, mono;
  	unsigned long seq;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
83f57a11d   Linus Torvalds   Revert "time: Rem...
1142

6a867a395   John Stultz   time: Remove xtim...
1143
  		now = xtime;
da15cfdae   John Stultz   time: Introduce C...
1144
1145
1146
1147
1148
1149
1150
  		mono = wall_to_monotonic;
  	} while (read_seqretry(&xtime_lock, seq));
  
  	set_normalized_timespec(&now, now.tv_sec + mono.tv_sec,
  				now.tv_nsec + mono.tv_nsec);
  	return now;
  }
871cf1e5f   Torben Hohn   time: Move do_tim...
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
  
  /*
   * The 64-bit jiffies value is not atomic - you MUST NOT read it
   * without sampling the sequence number in xtime_lock.
   * jiffies is defined in the linker script...
   */
  void do_timer(unsigned long ticks)
  {
  	jiffies_64 += ticks;
  	update_wall_time();
  	calc_global_load(ticks);
  }
48cf76f71   Torben Hohn   time: Provide get...
1163
1164
  
  /**
314ac3715   John Stultz   time: Extend get_...
1165
1166
   * get_xtime_and_monotonic_and_sleep_offset() - get xtime, wall_to_monotonic,
   *    and sleep offsets.
48cf76f71   Torben Hohn   time: Provide get...
1167
1168
   * @xtim:	pointer to timespec to be set with xtime
   * @wtom:	pointer to timespec to be set with wall_to_monotonic
314ac3715   John Stultz   time: Extend get_...
1169
   * @sleep:	pointer to timespec to be set with time in suspend
48cf76f71   Torben Hohn   time: Provide get...
1170
   */
314ac3715   John Stultz   time: Extend get_...
1171
1172
  void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
  				struct timespec *wtom, struct timespec *sleep)
48cf76f71   Torben Hohn   time: Provide get...
1173
1174
1175
1176
1177
1178
1179
  {
  	unsigned long seq;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		*xtim = xtime;
  		*wtom = wall_to_monotonic;
314ac3715   John Stultz   time: Extend get_...
1180
  		*sleep = total_sleep_time;
48cf76f71   Torben Hohn   time: Provide get...
1181
1182
  	} while (read_seqretry(&xtime_lock, seq));
  }
f0af911a9   Torben Hohn   time: Provide xti...
1183
1184
  
  /**
99ee5315d   Thomas Gleixner   timerfd: Allow ti...
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
   * ktime_get_monotonic_offset() - get wall_to_monotonic in ktime_t format
   */
  ktime_t ktime_get_monotonic_offset(void)
  {
  	unsigned long seq;
  	struct timespec wtom;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		wtom = wall_to_monotonic;
  	} while (read_seqretry(&xtime_lock, seq));
  	return timespec_to_ktime(wtom);
  }
  
  /**
f0af911a9   Torben Hohn   time: Provide xti...
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
   * xtime_update() - advances the timekeeping infrastructure
   * @ticks:	number of ticks, that have elapsed since the last call.
   *
   * Must be called with interrupts disabled.
   */
  void xtime_update(unsigned long ticks)
  {
  	write_seqlock(&xtime_lock);
  	do_timer(ticks);
  	write_sequnlock(&xtime_lock);
  }