timekeeping.c 36.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*
 *  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.
 *
 */

11
#include <linux/timekeeper_internal.h>
12 13 14 15 16
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/percpu.h>
#include <linux/init.h>
#include <linux/mm.h>
17
#include <linux/sched.h>
18
#include <linux/syscore_ops.h>
19 20 21 22
#include <linux/clocksource.h>
#include <linux/jiffies.h>
#include <linux/time.h>
#include <linux/tick.h>
23
#include <linux/stop_machine.h>
24
#include <linux/pvclock_gtod.h>
25

26

27
static struct timekeeper timekeeper;
28

29 30 31 32 33 34 35 36 37
/*
 * This read-write spinlock protects us from races in SMP while
 * playing with xtime.
 */
__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);

/* flag for if timekeeping is suspended */
int __read_mostly timekeeping_suspended;

38 39 40 41 42 43 44 45 46 47 48
static inline void tk_normalize_xtime(struct timekeeper *tk)
{
	while (tk->xtime_nsec >= ((u64)NSEC_PER_SEC << tk->shift)) {
		tk->xtime_nsec -= (u64)NSEC_PER_SEC << tk->shift;
		tk->xtime_sec++;
	}
}

static void tk_set_xtime(struct timekeeper *tk, const struct timespec *ts)
{
	tk->xtime_sec = ts->tv_sec;
49
	tk->xtime_nsec = (u64)ts->tv_nsec << tk->shift;
50 51 52 53 54
}

static void tk_xtime_add(struct timekeeper *tk, const struct timespec *ts)
{
	tk->xtime_sec += ts->tv_sec;
55
	tk->xtime_nsec += (u64)ts->tv_nsec << tk->shift;
56
	tk_normalize_xtime(tk);
57
}
58

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
static void tk_set_wall_to_mono(struct timekeeper *tk, struct timespec wtm)
{
	struct timespec tmp;

	/*
	 * Verify consistency of: offset_real = -wall_to_monotonic
	 * before modifying anything
	 */
	set_normalized_timespec(&tmp, -tk->wall_to_monotonic.tv_sec,
					-tk->wall_to_monotonic.tv_nsec);
	WARN_ON_ONCE(tk->offs_real.tv64 != timespec_to_ktime(tmp).tv64);
	tk->wall_to_monotonic = wtm;
	set_normalized_timespec(&tmp, -wtm.tv_sec, -wtm.tv_nsec);
	tk->offs_real = timespec_to_ktime(tmp);
}

static void tk_set_sleep_time(struct timekeeper *tk, struct timespec t)
{
	/* Verify consistency before modifying */
	WARN_ON_ONCE(tk->offs_boot.tv64 != timespec_to_ktime(tk->total_sleep_time).tv64);

	tk->total_sleep_time	= t;
	tk->offs_boot		= timespec_to_ktime(t);
}

84 85 86 87 88 89 90 91 92 93
/**
 * 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!
 */
94
static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock)
95 96
{
	cycle_t interval;
97
	u64 tmp, ntpinterval;
98
	struct clocksource *old_clock;
99

100 101
	old_clock = tk->clock;
	tk->clock = clock;
102 103 104 105 106
	clock->cycle_last = clock->read(clock);

	/* Do the ns -> cycle conversion first, using original mult */
	tmp = NTP_INTERVAL_LENGTH;
	tmp <<= clock->shift;
107
	ntpinterval = tmp;
108 109
	tmp += clock->mult/2;
	do_div(tmp, clock->mult);
110 111 112 113
	if (tmp == 0)
		tmp = 1;

	interval = (cycle_t) tmp;
114
	tk->cycle_interval = interval;
115 116

	/* Go back from cycles -> shifted ns */
117 118 119
	tk->xtime_interval = (u64) interval * clock->mult;
	tk->xtime_remainder = ntpinterval - tk->xtime_interval;
	tk->raw_interval =
120
		((u64) interval * clock->mult) >> clock->shift;
121

122 123 124 125
	 /* if changing clocks, convert xtime_nsec shift units */
	if (old_clock) {
		int shift_change = clock->shift - old_clock->shift;
		if (shift_change < 0)
126
			tk->xtime_nsec >>= -shift_change;
127
		else
128
			tk->xtime_nsec <<= shift_change;
129
	}
130
	tk->shift = clock->shift;
131

132 133
	tk->ntp_error = 0;
	tk->ntp_error_shift = NTP_SCALE_SHIFT - clock->shift;
134 135 136 137 138 139

	/*
	 * The timekeeper keeps its own mult values for the currently
	 * active clocksource. These value will be adjusted via NTP
	 * to counteract clock drifting.
	 */
140
	tk->mult = clock->mult;
141
}
142

143
/* Timekeeper helper functions. */
144
static inline s64 timekeeping_get_ns(struct timekeeper *tk)
145 146 147
{
	cycle_t cycle_now, cycle_delta;
	struct clocksource *clock;
148
	s64 nsec;
149 150

	/* read clocksource: */
151
	clock = tk->clock;
152 153 154 155 156
	cycle_now = clock->read(clock);

	/* calculate the delta since the last update_wall_time: */
	cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;

157 158
	nsec = cycle_delta * tk->mult + tk->xtime_nsec;
	nsec >>= tk->shift;
159 160 161

	/* If arch requires, add in gettimeoffset() */
	return nsec + arch_gettimeoffset();
162 163
}

164
static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk)
165 166 167
{
	cycle_t cycle_now, cycle_delta;
	struct clocksource *clock;
168
	s64 nsec;
169 170

	/* read clocksource: */
171
	clock = tk->clock;
172 173 174 175 176
	cycle_now = clock->read(clock);

	/* calculate the delta since the last update_wall_time: */
	cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;

177 178 179 180 181
	/* convert delta to nanoseconds. */
	nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);

	/* If arch requires, add in gettimeoffset() */
	return nsec + arch_gettimeoffset();
182 183
}

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
static RAW_NOTIFIER_HEAD(pvclock_gtod_chain);

static void update_pvclock_gtod(struct timekeeper *tk)
{
	raw_notifier_call_chain(&pvclock_gtod_chain, 0, tk);
}

/**
 * pvclock_gtod_register_notifier - register a pvclock timedata update listener
 *
 * Must hold write on timekeeper.lock
 */
int pvclock_gtod_register_notifier(struct notifier_block *nb)
{
	struct timekeeper *tk = &timekeeper;
	unsigned long flags;
	int ret;

	write_seqlock_irqsave(&tk->lock, flags);
	ret = raw_notifier_chain_register(&pvclock_gtod_chain, nb);
	/* update timekeeping data */
	update_pvclock_gtod(tk);
	write_sequnlock_irqrestore(&tk->lock, flags);

	return ret;
}
EXPORT_SYMBOL_GPL(pvclock_gtod_register_notifier);

/**
 * pvclock_gtod_unregister_notifier - unregister a pvclock
 * timedata update listener
 *
 * Must hold write on timekeeper.lock
 */
int pvclock_gtod_unregister_notifier(struct notifier_block *nb)
{
	struct timekeeper *tk = &timekeeper;
	unsigned long flags;
	int ret;

	write_seqlock_irqsave(&tk->lock, flags);
	ret = raw_notifier_chain_unregister(&pvclock_gtod_chain, nb);
	write_sequnlock_irqrestore(&tk->lock, flags);

	return ret;
}
EXPORT_SYMBOL_GPL(pvclock_gtod_unregister_notifier);

232
/* must hold write on timekeeper.lock */
233
static void timekeeping_update(struct timekeeper *tk, bool clearntp)
234 235
{
	if (clearntp) {
236
		tk->ntp_error = 0;
237 238
		ntp_clear();
	}
239
	update_vsyscall(tk);
240
	update_pvclock_gtod(tk);
241 242
}

243
/**
244
 * timekeeping_forward_now - update clock to the current time
245
 *
246 247 248
 * 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.
249
 */
250
static void timekeeping_forward_now(struct timekeeper *tk)
251 252
{
	cycle_t cycle_now, cycle_delta;
253
	struct clocksource *clock;
254
	s64 nsec;
255

256
	clock = tk->clock;
257
	cycle_now = clock->read(clock);
258
	cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
259
	clock->cycle_last = cycle_now;
260

261
	tk->xtime_nsec += cycle_delta * tk->mult;
262 263

	/* If arch requires, add in gettimeoffset() */
264
	tk->xtime_nsec += (u64)arch_gettimeoffset() << tk->shift;
265

266
	tk_normalize_xtime(tk);
267

268
	nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
269
	timespec_add_ns(&tk->raw_time, nsec);
270 271 272
}

/**
273
 * getnstimeofday - Returns the time of day in a timespec
274 275
 * @ts:		pointer to the timespec to be set
 *
276
 * Returns the time of day in a timespec.
277
 */
278
void getnstimeofday(struct timespec *ts)
279
{
280
	struct timekeeper *tk = &timekeeper;
281
	unsigned long seq;
282
	s64 nsecs = 0;
283

284 285
	WARN_ON(timekeeping_suspended);

286
	do {
287
		seq = read_seqbegin(&tk->lock);
288

289
		ts->tv_sec = tk->xtime_sec;
290
		nsecs = timekeeping_get_ns(tk);
291

292
	} while (read_seqretry(&tk->lock, seq));
293

294
	ts->tv_nsec = 0;
295 296 297 298
	timespec_add_ns(ts, nsecs);
}
EXPORT_SYMBOL(getnstimeofday);

299 300
ktime_t ktime_get(void)
{
301
	struct timekeeper *tk = &timekeeper;
302 303 304 305 306 307
	unsigned int seq;
	s64 secs, nsecs;

	WARN_ON(timekeeping_suspended);

	do {
308 309 310
		seq = read_seqbegin(&tk->lock);
		secs = tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
		nsecs = timekeeping_get_ns(tk) + tk->wall_to_monotonic.tv_nsec;
311

312
	} while (read_seqretry(&tk->lock, seq));
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
	/*
	 * 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)
{
331
	struct timekeeper *tk = &timekeeper;
332
	struct timespec tomono;
333
	s64 nsec;
334 335 336 337 338
	unsigned int seq;

	WARN_ON(timekeeping_suspended);

	do {
339 340
		seq = read_seqbegin(&tk->lock);
		ts->tv_sec = tk->xtime_sec;
341
		nsec = timekeeping_get_ns(tk);
342
		tomono = tk->wall_to_monotonic;
343

344
	} while (read_seqretry(&tk->lock, seq));
345

346 347 348
	ts->tv_sec += tomono.tv_sec;
	ts->tv_nsec = 0;
	timespec_add_ns(ts, nsec + tomono.tv_nsec);
349 350 351
}
EXPORT_SYMBOL_GPL(ktime_get_ts);

352 353 354 355 356 357 358 359 360 361 362 363 364
#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)
{
365
	struct timekeeper *tk = &timekeeper;
366 367 368 369 370 371
	unsigned long seq;
	s64 nsecs_raw, nsecs_real;

	WARN_ON_ONCE(timekeeping_suspended);

	do {
372
		seq = read_seqbegin(&tk->lock);
373

374 375
		*ts_raw = tk->raw_time;
		ts_real->tv_sec = tk->xtime_sec;
376
		ts_real->tv_nsec = 0;
377

378 379
		nsecs_raw = timekeeping_get_ns_raw(tk);
		nsecs_real = timekeeping_get_ns(tk);
380

381
	} while (read_seqretry(&tk->lock, seq));
382 383 384 385 386 387 388 389

	timespec_add_ns(ts_raw, nsecs_raw);
	timespec_add_ns(ts_real, nsecs_real);
}
EXPORT_SYMBOL(getnstime_raw_and_real);

#endif /* CONFIG_NTP_PPS */

390 391 392 393
/**
 * do_gettimeofday - Returns the time of day in a timeval
 * @tv:		pointer to the timeval to be set
 *
394
 * NOTE: Users should be converted to using getnstimeofday()
395 396 397 398 399
 */
void do_gettimeofday(struct timeval *tv)
{
	struct timespec now;

400
	getnstimeofday(&now);
401 402 403 404
	tv->tv_sec = now.tv_sec;
	tv->tv_usec = now.tv_nsec/1000;
}
EXPORT_SYMBOL(do_gettimeofday);
405

406 407 408 409 410 411
/**
 * 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
 */
412
int do_settimeofday(const struct timespec *tv)
413
{
414
	struct timekeeper *tk = &timekeeper;
415
	struct timespec ts_delta, xt;
416
	unsigned long flags;
417

418
	if (!timespec_valid_strict(tv))
419 420
		return -EINVAL;

421
	write_seqlock_irqsave(&tk->lock, flags);
422

423
	timekeeping_forward_now(tk);
424

425
	xt = tk_xtime(tk);
426 427 428
	ts_delta.tv_sec = tv->tv_sec - xt.tv_sec;
	ts_delta.tv_nsec = tv->tv_nsec - xt.tv_nsec;

429
	tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, ts_delta));
430

431
	tk_set_xtime(tk, tv);
432

433
	timekeeping_update(tk, true);
434

435
	write_sequnlock_irqrestore(&tk->lock, flags);
436 437 438 439 440 441 442 443

	/* signal hrtimers about time change */
	clock_was_set();

	return 0;
}
EXPORT_SYMBOL(do_settimeofday);

444 445 446 447 448 449 450 451
/**
 * 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)
{
452
	struct timekeeper *tk = &timekeeper;
453
	unsigned long flags;
454 455
	struct timespec tmp;
	int ret = 0;
456 457 458 459

	if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
		return -EINVAL;

460
	write_seqlock_irqsave(&tk->lock, flags);
461

462
	timekeeping_forward_now(tk);
463

464 465
	/* Make sure the proposed value is valid */
	tmp = timespec_add(tk_xtime(tk),  *ts);
466
	if (!timespec_valid_strict(&tmp)) {
467 468 469
		ret = -EINVAL;
		goto error;
	}
470

471 472
	tk_xtime_add(tk, ts);
	tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, *ts));
473

474
error: /* even if we error out, we forwarded the time, so call update */
475
	timekeeping_update(tk, true);
476

477
	write_sequnlock_irqrestore(&tk->lock, flags);
478 479 480 481

	/* signal hrtimers about time change */
	clock_was_set();

482
	return ret;
483 484 485
}
EXPORT_SYMBOL(timekeeping_inject_offset);

486 487 488 489 490
/**
 * change_clocksource - Swaps clocksources if a new one is available
 *
 * Accumulates current time interval and initializes new clocksource
 */
491
static int change_clocksource(void *data)
492
{
493
	struct timekeeper *tk = &timekeeper;
494
	struct clocksource *new, *old;
495
	unsigned long flags;
496

497
	new = (struct clocksource *) data;
498

499
	write_seqlock_irqsave(&tk->lock, flags);
500

501
	timekeeping_forward_now(tk);
502
	if (!new->enable || new->enable(new) == 0) {
503 504
		old = tk->clock;
		tk_setup_internals(tk, new);
505 506 507
		if (old->disable)
			old->disable(old);
	}
508
	timekeeping_update(tk, true);
509

510
	write_sequnlock_irqrestore(&tk->lock, flags);
511

512 513
	return 0;
}
514

515 516 517 518 519 520 521 522 523
/**
 * 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)
{
524 525 526
	struct timekeeper *tk = &timekeeper;

	if (tk->clock == clock)
527
		return;
528
	stop_machine(change_clocksource, clock, NULL);
529 530
	tick_clock_notify();
}
531

532 533 534 535 536 537 538 539 540 541 542 543 544 545
/**
 * 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);
546

547 548 549 550 551 552 553 554
/**
 * 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)
{
555
	struct timekeeper *tk = &timekeeper;
556 557 558 559
	unsigned long seq;
	s64 nsecs;

	do {
560 561 562
		seq = read_seqbegin(&tk->lock);
		nsecs = timekeeping_get_ns_raw(tk);
		*ts = tk->raw_time;
563

564
	} while (read_seqretry(&tk->lock, seq));
565 566 567 568 569

	timespec_add_ns(ts, nsecs);
}
EXPORT_SYMBOL(getrawmonotonic);

570
/**
571
 * timekeeping_valid_for_hres - Check if timekeeping is suitable for hres
572
 */
573
int timekeeping_valid_for_hres(void)
574
{
575
	struct timekeeper *tk = &timekeeper;
576 577 578 579
	unsigned long seq;
	int ret;

	do {
580
		seq = read_seqbegin(&tk->lock);
581

582
		ret = tk->clock->flags & CLOCK_SOURCE_VALID_FOR_HRES;
583

584
	} while (read_seqretry(&tk->lock, seq));
585 586 587 588

	return ret;
}

589 590 591 592 593
/**
 * timekeeping_max_deferment - Returns max time the clocksource can be deferred
 */
u64 timekeeping_max_deferment(void)
{
594
	struct timekeeper *tk = &timekeeper;
J
John Stultz 已提交
595 596
	unsigned long seq;
	u64 ret;
597

J
John Stultz 已提交
598
	do {
599
		seq = read_seqbegin(&tk->lock);
J
John Stultz 已提交
600

601
		ret = tk->clock->max_idle_ns;
J
John Stultz 已提交
602

603
	} while (read_seqretry(&tk->lock, seq));
J
John Stultz 已提交
604 605

	return ret;
606 607
}

608
/**
609
 * read_persistent_clock -  Return time from the persistent clock.
610 611
 *
 * Weak dummy function for arches that do not yet support it.
612 613
 * Reads the time from the battery backed persistent clock.
 * Returns a timespec with tv_sec=0 and tv_nsec=0 if unsupported.
614 615 616
 *
 *  XXX - Do be sure to remove it once all arches implement it.
 */
617
void __attribute__((weak)) read_persistent_clock(struct timespec *ts)
618
{
619 620
	ts->tv_sec = 0;
	ts->tv_nsec = 0;
621 622
}

623 624 625 626 627 628 629 630 631 632 633 634 635 636 637
/**
 * 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;
}

638 639 640 641 642
/*
 * timekeeping_init - Initializes the clocksource and common timekeeping values
 */
void __init timekeeping_init(void)
{
643
	struct timekeeper *tk = &timekeeper;
644
	struct clocksource *clock;
645
	unsigned long flags;
646
	struct timespec now, boot, tmp;
647 648

	read_persistent_clock(&now);
649
	if (!timespec_valid_strict(&now)) {
650 651 652 653 654 655
		pr_warn("WARNING: Persistent clock returned invalid value!\n"
			"         Check your CMOS/BIOS settings.\n");
		now.tv_sec = 0;
		now.tv_nsec = 0;
	}

656
	read_boot_clock(&boot);
657
	if (!timespec_valid_strict(&boot)) {
658 659 660 661 662
		pr_warn("WARNING: Boot clock returned invalid value!\n"
			"         Check your CMOS/BIOS settings.\n");
		boot.tv_sec = 0;
		boot.tv_nsec = 0;
	}
663

664
	seqlock_init(&tk->lock);
665

R
Roman Zippel 已提交
666
	ntp_init();
667

668
	write_seqlock_irqsave(&tk->lock, flags);
669
	clock = clocksource_default_clock();
670 671
	if (clock->enable)
		clock->enable(clock);
672
	tk_setup_internals(tk, clock);
673

674 675 676
	tk_set_xtime(tk, &now);
	tk->raw_time.tv_sec = 0;
	tk->raw_time.tv_nsec = 0;
677
	if (boot.tv_sec == 0 && boot.tv_nsec == 0)
678
		boot = tk_xtime(tk);
679

680
	set_normalized_timespec(&tmp, -boot.tv_sec, -boot.tv_nsec);
681
	tk_set_wall_to_mono(tk, tmp);
682 683 684

	tmp.tv_sec = 0;
	tmp.tv_nsec = 0;
685
	tk_set_sleep_time(tk, tmp);
686

687
	write_sequnlock_irqrestore(&tk->lock, flags);
688 689 690
}

/* time in seconds when suspend began */
691
static struct timespec timekeeping_suspend_time;
692

693 694 695 696 697 698 699
/**
 * __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.
 */
700 701
static void __timekeeping_inject_sleeptime(struct timekeeper *tk,
							struct timespec *delta)
702
{
703
	if (!timespec_valid_strict(delta)) {
704
		printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid "
705 706 707
					"sleep delta value!\n");
		return;
	}
708
	tk_xtime_add(tk, delta);
709 710
	tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, *delta));
	tk_set_sleep_time(tk, timespec_add(tk->total_sleep_time, *delta));
711 712 713 714 715 716 717 718 719 720 721 722 723 724
}

/**
 * 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)
{
725
	struct timekeeper *tk = &timekeeper;
726
	unsigned long flags;
727 728 729 730 731 732 733
	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;

734
	write_seqlock_irqsave(&tk->lock, flags);
J
John Stultz 已提交
735

736
	timekeeping_forward_now(tk);
737

738
	__timekeeping_inject_sleeptime(tk, delta);
739

740
	timekeeping_update(tk, true);
741

742
	write_sequnlock_irqrestore(&tk->lock, flags);
743 744 745 746 747

	/* signal hrtimers about time change */
	clock_was_set();
}

748 749 750 751 752 753 754
/**
 * timekeeping_resume - Resumes the generic timekeeping subsystem.
 *
 * This is for the generic clocksource timekeeping.
 * xtime/wall_to_monotonic/jiffies/etc are
 * still managed by arch specific suspend/resume code.
 */
755
static void timekeeping_resume(void)
756
{
757
	struct timekeeper *tk = &timekeeper;
758
	unsigned long flags;
759 760 761
	struct timespec ts;

	read_persistent_clock(&ts);
762

763
	clockevents_resume();
764 765
	clocksource_resume();

766
	write_seqlock_irqsave(&tk->lock, flags);
767

768 769
	if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
		ts = timespec_sub(ts, timekeeping_suspend_time);
770
		__timekeeping_inject_sleeptime(tk, &ts);
771 772
	}
	/* re-base the last cycle value */
773 774
	tk->clock->cycle_last = tk->clock->read(tk->clock);
	tk->ntp_error = 0;
775
	timekeeping_suspended = 0;
776 777
	timekeeping_update(tk, false);
	write_sequnlock_irqrestore(&tk->lock, flags);
778 779 780 781 782 783

	touch_softlockup_watchdog();

	clockevents_notify(CLOCK_EVT_NOTIFY_RESUME, NULL);

	/* Resume hrtimers */
784
	hrtimers_resume();
785 786
}

787
static int timekeeping_suspend(void)
788
{
789
	struct timekeeper *tk = &timekeeper;
790
	unsigned long flags;
791 792
	struct timespec		delta, delta_delta;
	static struct timespec	old_delta;
793

794
	read_persistent_clock(&timekeeping_suspend_time);
795

796 797
	write_seqlock_irqsave(&tk->lock, flags);
	timekeeping_forward_now(tk);
798
	timekeeping_suspended = 1;
799 800 801 802 803 804 805

	/*
	 * 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.
	 */
806
	delta = timespec_sub(tk_xtime(tk), timekeeping_suspend_time);
807 808 809 810 811 812 813 814 815 816 817 818
	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);
	}
819
	write_sequnlock_irqrestore(&tk->lock, flags);
820 821

	clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL);
M
Magnus Damm 已提交
822
	clocksource_suspend();
823
	clockevents_suspend();
824 825 826 827 828

	return 0;
}

/* sysfs resume/suspend bits for timekeeping */
829
static struct syscore_ops timekeeping_syscore_ops = {
830 831 832 833
	.resume		= timekeeping_resume,
	.suspend	= timekeeping_suspend,
};

834
static int __init timekeeping_init_ops(void)
835
{
836 837
	register_syscore_ops(&timekeeping_syscore_ops);
	return 0;
838 839
}

840
device_initcall(timekeeping_init_ops);
841 842 843 844 845

/*
 * If the error is already larger, we look ahead even further
 * to compensate for late or lost adjustments.
 */
846 847
static __always_inline int timekeeping_bigadjust(struct timekeeper *tk,
						 s64 error, s64 *interval,
848 849 850 851 852 853 854 855 856 857 858 859
						 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
L
Li Zefan 已提交
860
	 * here.  This is tuned so that an error of about 1 msec is adjusted
861 862
	 * within about 1 sec (or 2^20 nsec in 2^SHIFT_HZ ticks).
	 */
863
	error2 = tk->ntp_error >> (NTP_SCALE_SHIFT + 22 - 2 * SHIFT_HZ);
864 865 866 867 868 869 870 871
	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.
	 */
872 873
	tick_error = ntp_tick_length() >> (tk->ntp_error_shift + 1);
	tick_error -= tk->xtime_interval >> 1;
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
	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.
 */
898
static void timekeeping_adjust(struct timekeeper *tk, s64 offset)
899
{
900
	s64 error, interval = tk->cycle_interval;
901 902
	int adj;

903
	/*
904
	 * The point of this is to check if the error is greater than half
905 906 907 908 909
	 * 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.
910 911
	 * This "saves" dividing(shifting) interval twice, but keeps the
	 * (error > interval) comparison as still measuring if error is
912
	 * larger than half an interval.
913
	 *
914
	 * Note: It does not "save" on aggravation when reading the code.
915
	 */
916
	error = tk->ntp_error >> (tk->ntp_error_shift - 1);
917
	if (error > interval) {
918 919
		/*
		 * We now divide error by 4(via shift), which checks if
920
		 * the error is greater than twice the interval.
921 922 923
		 * If it is greater, we need a bigadjust, if its smaller,
		 * we can adjust by 1.
		 */
924
		error >>= 2;
925 926 927 928 929
		/*
		 * 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.
		 *
930
		 * The proper fix is to avoid rounding up by using
931
		 * the high precision tk->xtime_nsec instead of
932 933 934
		 * xtime.tv_nsec everywhere. Fixing this will take some
		 * time.
		 */
935 936 937
		if (likely(error <= interval))
			adj = 1;
		else
938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
			adj = timekeeping_bigadjust(tk, error, &interval, &offset);
	} else {
		if (error < -interval) {
			/* See comment above, this is just switched for the negative */
			error >>= 2;
			if (likely(error >= -interval)) {
				adj = -1;
				interval = -interval;
				offset = -offset;
			} else {
				adj = timekeeping_bigadjust(tk, error, &interval, &offset);
			}
		} else {
			goto out_adjust;
		}
	}
954

955 956
	if (unlikely(tk->clock->maxadj &&
		(tk->mult + adj > tk->clock->mult + tk->clock->maxadj))) {
957 958
		printk_once(KERN_WARNING
			"Adjusting %s more than 11%% (%ld vs %ld)\n",
959 960
			tk->clock->name, (long)tk->mult + adj,
			(long)tk->clock->mult + tk->clock->maxadj);
961
	}
962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
	/*
	 * 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.
	 */
1011 1012 1013 1014
	tk->mult += adj;
	tk->xtime_interval += interval;
	tk->xtime_nsec -= offset;
	tk->ntp_error -= (interval - offset) << tk->ntp_error_shift;
1015

1016
out_adjust:
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
	/*
	 * It may be possible that when we entered this function, xtime_nsec
	 * was very small.  Further, if we're slightly speeding the clocksource
	 * in the code above, its possible the required corrective factor to
	 * xtime_nsec could cause it to underflow.
	 *
	 * Now, since we already accumulated the second, 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.
	 */
1031 1032 1033 1034
	if (unlikely((s64)tk->xtime_nsec < 0)) {
		s64 neg = -(s64)tk->xtime_nsec;
		tk->xtime_nsec = 0;
		tk->ntp_error += neg << tk->ntp_error_shift;
1035 1036
	}

1037 1038
}

1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
/**
 * 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);
1059 1060 1061 1062
		if (unlikely(leap)) {
			struct timespec ts;

			tk->xtime_sec += leap;
1063

1064 1065 1066 1067 1068 1069 1070
			ts.tv_sec = leap;
			ts.tv_nsec = 0;
			tk_set_wall_to_mono(tk,
				timespec_sub(tk->wall_to_monotonic, ts));

			clock_was_set_delayed();
		}
1071 1072 1073
	}
}

1074 1075 1076 1077 1078 1079 1080 1081 1082
/**
 * 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.
 */
1083 1084
static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset,
						u32 shift)
1085
{
1086
	u64 raw_nsecs;
1087

1088 1089
	/* If the offset is smaller then a shifted interval, do nothing */
	if (offset < tk->cycle_interval<<shift)
1090 1091 1092
		return offset;

	/* Accumulate one shifted interval */
1093 1094
	offset -= tk->cycle_interval << shift;
	tk->clock->cycle_last += tk->cycle_interval << shift;
1095

1096 1097
	tk->xtime_nsec += tk->xtime_interval << shift;
	accumulate_nsecs_to_secs(tk);
1098

1099
	/* Accumulate raw time */
1100
	raw_nsecs = (u64)tk->raw_interval << shift;
1101
	raw_nsecs += tk->raw_time.tv_nsec;
1102 1103 1104
	if (raw_nsecs >= NSEC_PER_SEC) {
		u64 raw_secs = raw_nsecs;
		raw_nsecs = do_div(raw_secs, NSEC_PER_SEC);
1105
		tk->raw_time.tv_sec += raw_secs;
1106
	}
1107
	tk->raw_time.tv_nsec = raw_nsecs;
1108 1109

	/* Accumulate error between NTP and clock interval */
1110 1111 1112
	tk->ntp_error += ntp_tick_length() << shift;
	tk->ntp_error -= (tk->xtime_interval + tk->xtime_remainder) <<
						(tk->ntp_error_shift + shift);
1113 1114 1115 1116

	return offset;
}

1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
#ifdef CONFIG_GENERIC_TIME_VSYSCALL_OLD
static inline void old_vsyscall_fixup(struct timekeeper *tk)
{
	s64 remainder;

	/*
	* Store only full nanoseconds into xtime_nsec after rounding
	* it up and add the remainder to the error difference.
	* XXX - This is necessary to avoid small 1ns inconsistnecies caused
	* by truncating the remainder in vsyscalls. However, it causes
	* additional work to be done in timekeeping_adjust(). Once
	* the vsyscall implementations are converted to use xtime_nsec
	* (shifted nanoseconds), and CONFIG_GENERIC_TIME_VSYSCALL_OLD
	* users are removed, this can be killed.
	*/
	remainder = tk->xtime_nsec & ((1ULL << tk->shift) - 1);
	tk->xtime_nsec -= remainder;
	tk->xtime_nsec += 1ULL << tk->shift;
	tk->ntp_error += remainder << tk->ntp_error_shift;

}
#else
#define old_vsyscall_fixup(tk)
#endif



1144 1145 1146 1147
/**
 * update_wall_time - Uses the current clocksource to increment the wall time
 *
 */
1148
static void update_wall_time(void)
1149
{
1150
	struct clocksource *clock;
1151
	struct timekeeper *tk = &timekeeper;
1152
	cycle_t offset;
1153
	int shift = 0, maxshift;
J
John Stultz 已提交
1154 1155
	unsigned long flags;

1156
	write_seqlock_irqsave(&tk->lock, flags);
1157 1158 1159

	/* Make sure we're fully resumed: */
	if (unlikely(timekeeping_suspended))
J
John Stultz 已提交
1160
		goto out;
1161

1162
	clock = tk->clock;
J
John Stultz 已提交
1163 1164

#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
1165
	offset = tk->cycle_interval;
J
John Stultz 已提交
1166 1167
#else
	offset = (clock->read(clock) - clock->cycle_last) & clock->mask;
1168 1169
#endif

1170 1171 1172 1173
	/* Check if there's really nothing to do */
	if (offset < tk->cycle_interval)
		goto out;

1174 1175 1176 1177
	/*
	 * 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
1178
	 * that is smaller than the offset.  We then accumulate that
1179 1180
	 * chunk in one go, and then try to consume the next smaller
	 * doubled multiple.
1181
	 */
1182
	shift = ilog2(offset) - ilog2(tk->cycle_interval);
1183
	shift = max(0, shift);
1184
	/* Bound shift to one less than what overflows tick_length */
1185
	maxshift = (64 - (ilog2(ntp_tick_length())+1)) - 1;
1186
	shift = min(shift, maxshift);
1187 1188 1189
	while (offset >= tk->cycle_interval) {
		offset = logarithmic_accumulation(tk, offset, shift);
		if (offset < tk->cycle_interval<<shift)
1190
			shift--;
1191 1192 1193
	}

	/* correct the clock when NTP error is too big */
1194
	timekeeping_adjust(tk, offset);
1195

J
John Stultz 已提交
1196
	/*
1197 1198 1199 1200
	 * XXX This can be killed once everyone converts
	 * to the new update_vsyscall.
	 */
	old_vsyscall_fixup(tk);
1201

J
John Stultz 已提交
1202 1203
	/*
	 * Finally, make sure that after the rounding
1204
	 * xtime_nsec isn't larger than NSEC_PER_SEC
J
John Stultz 已提交
1205
	 */
1206
	accumulate_nsecs_to_secs(tk);
L
Linus Torvalds 已提交
1207

1208
	timekeeping_update(tk, false);
J
John Stultz 已提交
1209 1210

out:
1211
	write_sequnlock_irqrestore(&tk->lock, flags);
J
John Stultz 已提交
1212

1213
}
T
Tomas Janousek 已提交
1214 1215 1216 1217 1218

/**
 * getboottime - Return the real time of system boot.
 * @ts:		pointer to the timespec to be set
 *
1219
 * Returns the wall-time of boot in a timespec.
T
Tomas Janousek 已提交
1220 1221 1222 1223 1224 1225 1226 1227
 *
 * 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)
{
1228
	struct timekeeper *tk = &timekeeper;
1229
	struct timespec boottime = {
1230 1231 1232 1233
		.tv_sec = tk->wall_to_monotonic.tv_sec +
				tk->total_sleep_time.tv_sec,
		.tv_nsec = tk->wall_to_monotonic.tv_nsec +
				tk->total_sleep_time.tv_nsec
1234
	};
1235 1236

	set_normalized_timespec(ts, -boottime.tv_sec, -boottime.tv_nsec);
T
Tomas Janousek 已提交
1237
}
1238
EXPORT_SYMBOL_GPL(getboottime);
T
Tomas Janousek 已提交
1239

1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
/**
 * 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)
{
1251
	struct timekeeper *tk = &timekeeper;
1252
	struct timespec tomono, sleep;
1253
	s64 nsec;
1254 1255 1256 1257 1258
	unsigned int seq;

	WARN_ON(timekeeping_suspended);

	do {
1259 1260
		seq = read_seqbegin(&tk->lock);
		ts->tv_sec = tk->xtime_sec;
1261
		nsec = timekeeping_get_ns(tk);
1262 1263
		tomono = tk->wall_to_monotonic;
		sleep = tk->total_sleep_time;
1264

1265
	} while (read_seqretry(&tk->lock, seq));
1266

1267 1268 1269
	ts->tv_sec += tomono.tv_sec + sleep.tv_sec;
	ts->tv_nsec = 0;
	timespec_add_ns(ts, nsec + tomono.tv_nsec + sleep.tv_nsec);
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
}
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);

T
Tomas Janousek 已提交
1290 1291 1292 1293 1294 1295
/**
 * 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)
{
1296 1297 1298
	struct timekeeper *tk = &timekeeper;

	*ts = timespec_add(*ts, tk->total_sleep_time);
T
Tomas Janousek 已提交
1299
}
1300
EXPORT_SYMBOL_GPL(monotonic_to_bootbased);
1301

1302 1303
unsigned long get_seconds(void)
{
1304 1305 1306
	struct timekeeper *tk = &timekeeper;

	return tk->xtime_sec;
1307 1308 1309
}
EXPORT_SYMBOL(get_seconds);

1310 1311
struct timespec __current_kernel_time(void)
{
1312 1313 1314
	struct timekeeper *tk = &timekeeper;

	return tk_xtime(tk);
1315
}
1316

1317 1318
struct timespec current_kernel_time(void)
{
1319
	struct timekeeper *tk = &timekeeper;
1320 1321 1322 1323
	struct timespec now;
	unsigned long seq;

	do {
1324
		seq = read_seqbegin(&tk->lock);
L
Linus Torvalds 已提交
1325

1326 1327
		now = tk_xtime(tk);
	} while (read_seqretry(&tk->lock, seq));
1328 1329 1330 1331

	return now;
}
EXPORT_SYMBOL(current_kernel_time);
1332 1333 1334

struct timespec get_monotonic_coarse(void)
{
1335
	struct timekeeper *tk = &timekeeper;
1336 1337 1338 1339
	struct timespec now, mono;
	unsigned long seq;

	do {
1340
		seq = read_seqbegin(&tk->lock);
L
Linus Torvalds 已提交
1341

1342 1343 1344
		now = tk_xtime(tk);
		mono = tk->wall_to_monotonic;
	} while (read_seqretry(&tk->lock, seq));
1345 1346 1347 1348 1349

	set_normalized_timespec(&now, now.tv_sec + mono.tv_sec,
				now.tv_nsec + mono.tv_nsec);
	return now;
}
1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361

/*
 * 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);
}
1362 1363

/**
1364 1365
 * get_xtime_and_monotonic_and_sleep_offset() - get xtime, wall_to_monotonic,
 *    and sleep offsets.
1366 1367
 * @xtim:	pointer to timespec to be set with xtime
 * @wtom:	pointer to timespec to be set with wall_to_monotonic
1368
 * @sleep:	pointer to timespec to be set with time in suspend
1369
 */
1370 1371
void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
				struct timespec *wtom, struct timespec *sleep)
1372
{
1373
	struct timekeeper *tk = &timekeeper;
1374 1375 1376
	unsigned long seq;

	do {
1377 1378 1379 1380 1381
		seq = read_seqbegin(&tk->lock);
		*xtim = tk_xtime(tk);
		*wtom = tk->wall_to_monotonic;
		*sleep = tk->total_sleep_time;
	} while (read_seqretry(&tk->lock, seq));
1382
}
T
Torben Hohn 已提交
1383

1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394
#ifdef CONFIG_HIGH_RES_TIMERS
/**
 * ktime_get_update_offsets - hrtimer helper
 * @offs_real:	pointer to storage for monotonic -> realtime offset
 * @offs_boot:	pointer to storage for monotonic -> boottime offset
 *
 * Returns current monotonic time and updates the offsets
 * Called from hrtimer_interupt() or retrigger_next_event()
 */
ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot)
{
1395
	struct timekeeper *tk = &timekeeper;
1396 1397 1398 1399 1400
	ktime_t now;
	unsigned int seq;
	u64 secs, nsecs;

	do {
1401
		seq = read_seqbegin(&tk->lock);
1402

1403 1404
		secs = tk->xtime_sec;
		nsecs = timekeeping_get_ns(tk);
1405

1406 1407 1408
		*offs_real = tk->offs_real;
		*offs_boot = tk->offs_boot;
	} while (read_seqretry(&tk->lock, seq));
1409 1410 1411 1412 1413 1414 1415

	now = ktime_add_ns(ktime_set(secs, 0), nsecs);
	now = ktime_sub(now, *offs_real);
	return now;
}
#endif

1416 1417 1418 1419 1420
/**
 * ktime_get_monotonic_offset() - get wall_to_monotonic in ktime_t format
 */
ktime_t ktime_get_monotonic_offset(void)
{
1421
	struct timekeeper *tk = &timekeeper;
1422 1423 1424 1425
	unsigned long seq;
	struct timespec wtom;

	do {
1426 1427 1428
		seq = read_seqbegin(&tk->lock);
		wtom = tk->wall_to_monotonic;
	} while (read_seqretry(&tk->lock, seq));
J
John Stultz 已提交
1429

1430 1431
	return timespec_to_ktime(wtom);
}
1432 1433
EXPORT_SYMBOL_GPL(ktime_get_monotonic_offset);

T
Torben Hohn 已提交
1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445
/**
 * 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);
}