ntp.c 11.9 KB
Newer Older
1 2 3 4 5 6 7
/*
 * NTP state machine interfaces and logic.
 *
 * This code was mainly moved from kernel/timer.c and kernel/time.c
 * Please see those files for relevant copyright info and historical
 * changelogs.
 */
A
Alexey Dobriyan 已提交
8
#include <linux/capability.h>
R
Roman Zippel 已提交
9
#include <linux/clocksource.h>
10
#include <linux/workqueue.h>
11 12 13 14 15 16
#include <linux/hrtimer.h>
#include <linux/jiffies.h>
#include <linux/math64.h>
#include <linux/timex.h>
#include <linux/time.h>
#include <linux/mm.h>
17

18
/*
19
 * NTP timekeeping variables:
20 21
 */

22 23 24 25 26
/* USER_HZ period (usecs): */
unsigned long			tick_usec = TICK_USEC;

/* ACTHZ period (nsecs): */
unsigned long			tick_nsec;
R
Roman Zippel 已提交
27

28 29 30 31 32
u64				tick_length;
static u64			tick_length_base;

static struct hrtimer		leap_timer;

33
#define MAX_TICKADJ		500LL		/* usecs */
34
#define MAX_TICKADJ_SCALED \
35
	(((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ)
36 37 38 39

/*
 * phase-lock loop variables
 */
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

/*
 * clock synchronization status
 *
 * (TIME_ERROR prevents overwriting the CMOS clock)
 */
static int			time_state = TIME_OK;

/* clock status bits:							*/
int				time_status = STA_UNSYNC;

/* TAI offset (secs):							*/
static long			time_tai;

/* time adjustment (nsecs):						*/
static s64			time_offset;

/* pll time constant:							*/
static long			time_constant = 2;

/* maximum error (usecs):						*/
long				time_maxerror = NTP_PHASE_LIMIT;

/* estimated error (usecs):						*/
long				time_esterror = NTP_PHASE_LIMIT;

/* frequency offset (scaled nsecs/secs):				*/
static s64			time_freq;

/* time at last adjustment (secs):					*/
static long			time_reftime;

long				time_adjust;

static long			ntp_tick_adj;

/*
 * NTP methods:
 */
79

80 81 82 83
/*
 * Update (tick_length, tick_length_base, tick_nsec), based
 * on (tick_usec, ntp_tick_adj, time_freq):
 */
84 85
static void ntp_update_frequency(void)
{
86 87 88 89 90 91 92 93 94 95
	u64 prev_base;
	u64 second_length;

	prev_base = tick_length_base;

	second_length		 = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
						<< NTP_SCALE_SHIFT;

	second_length		+= (s64)ntp_tick_adj << NTP_SCALE_SHIFT;
	second_length		+= time_freq;
96

97
	tick_length_base	 = second_length;
98

99 100
	tick_nsec		 = div_u64(second_length, HZ) >> NTP_SCALE_SHIFT;
	tick_length_base	 = div_u64(tick_length_base, NTP_INTERVAL_FREQ);
101 102 103 104 105

	/*
	 * Don't wait for the next second_overflow, apply
	 * the change to the tick length immediately
	 */
106
	tick_length		+= tick_length_base - prev_base;
107 108
}

R
Roman Zippel 已提交
109 110 111 112 113 114 115 116
static void ntp_update_offset(long offset)
{
	long mtemp;
	s64 freq_adj;

	if (!(time_status & STA_PLL))
		return;

R
Roman Zippel 已提交
117
	if (!(time_status & STA_NANO))
118
		offset *= NSEC_PER_USEC;
R
Roman Zippel 已提交
119 120 121 122 123

	/*
	 * Scale the phase adjustment and
	 * clamp to the operating range.
	 */
124 125
	offset = min(offset, MAXPHASE);
	offset = max(offset, -MAXPHASE);
R
Roman Zippel 已提交
126 127 128 129 130 131 132 133 134 135

	/*
	 * Select how the frequency is to be controlled
	 * and in which mode (PLL or FLL).
	 */
	if (time_status & STA_FREQHOLD || time_reftime == 0)
		time_reftime = xtime.tv_sec;
	mtemp = xtime.tv_sec - time_reftime;
	time_reftime = xtime.tv_sec;

136
	freq_adj = (s64)offset * mtemp;
137
	freq_adj <<= NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant);
R
Roman Zippel 已提交
138 139
	time_status &= ~STA_MODE;
	if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) {
140
		freq_adj += div_s64((s64)offset << (NTP_SCALE_SHIFT - SHIFT_FLL),
141
				    mtemp);
R
Roman Zippel 已提交
142 143
		time_status |= STA_MODE;
	}
R
Roman Zippel 已提交
144
	freq_adj += time_freq;
145 146
	freq_adj = min(freq_adj, MAXFREQ_SCALED);
	time_freq = max(freq_adj, -MAXFREQ_SCALED);
147

148
	time_offset = div_s64((s64)offset << NTP_SCALE_SHIFT, NTP_INTERVAL_FREQ);
R
Roman Zippel 已提交
149 150
}

151 152 153 154 155 156 157
/**
 * ntp_clear - Clears the NTP state variables
 *
 * Must be called while holding a write on the xtime_lock
 */
void ntp_clear(void)
{
158 159 160 161
	time_adjust	= 0;		/* stop active adjtime() */
	time_status	|= STA_UNSYNC;
	time_maxerror	= NTP_PHASE_LIMIT;
	time_esterror	= NTP_PHASE_LIMIT;
162 163 164

	ntp_update_frequency();

165 166
	tick_length	= tick_length_base;
	time_offset	= 0;
167 168
}

169
/*
R
Roman Zippel 已提交
170 171 172
 * Leap second processing. If in leap-insert state at the end of the
 * day, the system clock is set back one second; if in leap-delete
 * state, the system clock is set ahead one second.
173
 */
R
Roman Zippel 已提交
174
static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
175
{
R
Roman Zippel 已提交
176
	enum hrtimer_restart res = HRTIMER_NORESTART;
177

178
	write_seqlock(&xtime_lock);
179 180 181 182 183

	switch (time_state) {
	case TIME_OK:
		break;
	case TIME_INS:
R
Roman Zippel 已提交
184 185 186
		xtime.tv_sec--;
		wall_to_monotonic.tv_sec++;
		time_state = TIME_OOP;
187 188
		printk(KERN_NOTICE
			"Clock: inserting leap second 23:59:60 UTC\n");
189
		hrtimer_add_expires_ns(&leap_timer, NSEC_PER_SEC);
R
Roman Zippel 已提交
190
		res = HRTIMER_RESTART;
191 192
		break;
	case TIME_DEL:
R
Roman Zippel 已提交
193 194 195 196
		xtime.tv_sec++;
		time_tai--;
		wall_to_monotonic.tv_sec--;
		time_state = TIME_WAIT;
197 198
		printk(KERN_NOTICE
			"Clock: deleting leap second 23:59:59 UTC\n");
199 200
		break;
	case TIME_OOP:
R
Roman Zippel 已提交
201
		time_tai++;
202
		time_state = TIME_WAIT;
R
Roman Zippel 已提交
203
		/* fall through */
204 205
	case TIME_WAIT:
		if (!(time_status & (STA_INS | STA_DEL)))
R
Roman Zippel 已提交
206
			time_state = TIME_OK;
R
Roman Zippel 已提交
207 208 209 210
		break;
	}
	update_vsyscall(&xtime, clock);

211
	write_sequnlock(&xtime_lock);
R
Roman Zippel 已提交
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232

	return res;
}

/*
 * this routine handles the overflow of the microsecond field
 *
 * The tricky bits of code to handle the accurate clock support
 * were provided by Dave Mills (Mills@UDEL.EDU) of NTP fame.
 * They were originally developed for SUN and DEC kernels.
 * All the kudos should go to Dave for this stuff.
 */
void second_overflow(void)
{
	s64 time_adj;

	/* Bump the maxerror field */
	time_maxerror += MAXFREQ / NSEC_PER_USEC;
	if (time_maxerror > NTP_PHASE_LIMIT) {
		time_maxerror = NTP_PHASE_LIMIT;
		time_status |= STA_UNSYNC;
233 234 235
	}

	/*
236 237
	 * Compute the phase adjustment for the next second. The offset is
	 * reduced by a fixed factor times the time constant.
238
	 */
239 240 241 242
	tick_length	= tick_length_base;
	time_adj	= shift_right(time_offset, SHIFT_PLL + time_constant);
	time_offset	-= time_adj;
	tick_length	+= time_adj;
243

244 245 246 247 248 249 250
	if (!time_adjust)
		return;

	if (time_adjust > MAX_TICKADJ) {
		time_adjust -= MAX_TICKADJ;
		tick_length += MAX_TICKADJ_SCALED;
		return;
251
	}
252 253 254 255 256 257 258 259 260 261

	if (time_adjust < -MAX_TICKADJ) {
		time_adjust += MAX_TICKADJ;
		tick_length -= MAX_TICKADJ_SCALED;
		return;
	}

	tick_length += (s64)(time_adjust * NSEC_PER_USEC / NTP_INTERVAL_FREQ)
							 << NTP_SCALE_SHIFT;
	time_adjust = 0;
262 263
}

264
#ifdef CONFIG_GENERIC_CMOS_UPDATE
265

266 267 268
/* Disable the cmos update - used by virtualization and embedded */
int no_sync_cmos_clock  __read_mostly;

269
static void sync_cmos_clock(struct work_struct *work);
270

271
static DECLARE_DELAYED_WORK(sync_cmos_work, sync_cmos_clock);
272

273
static void sync_cmos_clock(struct work_struct *work)
274 275 276 277 278 279 280 281 282 283 284
{
	struct timespec now, next;
	int fail = 1;

	/*
	 * If we have an externally synchronized Linux clock, then update
	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
	 * called as close as possible to 500 ms before the new second starts.
	 * This code is run on a timer.  If the clock is set, that timer
	 * may not expire at the correct time.  Thus, we adjust...
	 */
285
	if (!ntp_synced()) {
286 287 288 289 290
		/*
		 * Not synced, exit, do not restart a timer (if one is
		 * running, let it run out).
		 */
		return;
291
	}
292 293

	getnstimeofday(&now);
294
	if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
295 296
		fail = update_persistent_clock(now);

297
	next.tv_nsec = (NSEC_PER_SEC / 2) - now.tv_nsec - (TICK_NSEC / 2);
298 299 300 301 302 303 304 305 306 307 308 309
	if (next.tv_nsec <= 0)
		next.tv_nsec += NSEC_PER_SEC;

	if (!fail)
		next.tv_sec = 659;
	else
		next.tv_sec = 0;

	if (next.tv_nsec >= NSEC_PER_SEC) {
		next.tv_sec++;
		next.tv_nsec -= NSEC_PER_SEC;
	}
310
	schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next));
311 312 313
}

static void notify_cmos_timer(void)
314
{
315
	if (!no_sync_cmos_clock)
316
		schedule_delayed_work(&sync_cmos_work, 0);
317 318
}

319 320 321 322
#else
static inline void notify_cmos_timer(void) { }
#endif

323 324
/*
 * adjtimex mainly allows reading (and writing, if superuser) of
325 326 327 328
 * kernel time-keeping variables. used by xntpd.
 */
int do_adjtimex(struct timex *txc)
{
R
Roman Zippel 已提交
329
	struct timespec ts;
330 331
	int result;

332 333
	/* Validate the data before disabling interrupts */
	if (txc->modes & ADJ_ADJTIME) {
R
Roman Zippel 已提交
334
		/* singleshot must not be used with any other mode bits */
335
		if (!(txc->modes & ADJ_OFFSET_SINGLESHOT))
336
			return -EINVAL;
337 338 339 340 341 342 343 344
		if (!(txc->modes & ADJ_OFFSET_READONLY) &&
		    !capable(CAP_SYS_TIME))
			return -EPERM;
	} else {
		/* In order to modify anything, you gotta be super-user! */
		 if (txc->modes && !capable(CAP_SYS_TIME))
			return -EPERM;

345 346 347 348
		/*
		 * if the quartz is off by more than 10% then
		 * something is VERY wrong!
		 */
349 350 351 352 353 354 355
		if (txc->modes & ADJ_TICK &&
		    (txc->tick <  900000/USER_HZ ||
		     txc->tick > 1100000/USER_HZ))
				return -EINVAL;

		if (txc->modes & ADJ_STATUS && time_state != TIME_OK)
			hrtimer_cancel(&leap_timer);
J
John Stultz 已提交
356
	}
357

R
Roman Zippel 已提交
358 359
	getnstimeofday(&ts);

360 361 362
	write_seqlock_irq(&xtime_lock);

	/* If there are input parameters, then process them */
363 364 365 366 367 368 369 370 371 372 373
	if (txc->modes & ADJ_ADJTIME) {
		long save_adjust = time_adjust;

		if (!(txc->modes & ADJ_OFFSET_READONLY)) {
			/* adjtime() is independent from ntp_adjtime() */
			time_adjust = txc->offset;
			ntp_update_frequency();
		}
		txc->offset = save_adjust;
		goto adj_done;
	}
R
Roman Zippel 已提交
374
	if (txc->modes) {
375 376
		long sec;

R
Roman Zippel 已提交
377 378 379 380 381 382 383 384 385
		if (txc->modes & ADJ_STATUS) {
			if ((time_status & STA_PLL) &&
			    !(txc->status & STA_PLL)) {
				time_state = TIME_OK;
				time_status = STA_UNSYNC;
			}
			/* only set allowed bits */
			time_status &= STA_RONLY;
			time_status |= txc->status & ~STA_RONLY;
R
Roman Zippel 已提交
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 413

			switch (time_state) {
			case TIME_OK:
			start_timer:
				sec = ts.tv_sec;
				if (time_status & STA_INS) {
					time_state = TIME_INS;
					sec += 86400 - sec % 86400;
					hrtimer_start(&leap_timer, ktime_set(sec, 0), HRTIMER_MODE_ABS);
				} else if (time_status & STA_DEL) {
					time_state = TIME_DEL;
					sec += 86400 - (sec + 1) % 86400;
					hrtimer_start(&leap_timer, ktime_set(sec, 0), HRTIMER_MODE_ABS);
				}
				break;
			case TIME_INS:
			case TIME_DEL:
				time_state = TIME_OK;
				goto start_timer;
				break;
			case TIME_WAIT:
				if (!(time_status & (STA_INS | STA_DEL)))
					time_state = TIME_OK;
				break;
			case TIME_OOP:
				hrtimer_restart(&leap_timer);
				break;
			}
R
Roman Zippel 已提交
414 415 416 417 418 419
		}

		if (txc->modes & ADJ_NANO)
			time_status |= STA_NANO;
		if (txc->modes & ADJ_MICRO)
			time_status &= ~STA_NANO;
R
Roman Zippel 已提交
420 421

		if (txc->modes & ADJ_FREQUENCY) {
422 423 424
			time_freq = (s64)txc->freq * PPM_SCALE;
			time_freq = min(time_freq, MAXFREQ_SCALED);
			time_freq = max(time_freq, -MAXFREQ_SCALED);
425
		}
R
Roman Zippel 已提交
426

R
Roman Zippel 已提交
427
		if (txc->modes & ADJ_MAXERROR)
R
Roman Zippel 已提交
428
			time_maxerror = txc->maxerror;
R
Roman Zippel 已提交
429
		if (txc->modes & ADJ_ESTERROR)
R
Roman Zippel 已提交
430
			time_esterror = txc->esterror;
431

R
Roman Zippel 已提交
432
		if (txc->modes & ADJ_TIMECONST) {
R
Roman Zippel 已提交
433 434 435 436 437
			time_constant = txc->constant;
			if (!(time_status & STA_NANO))
				time_constant += 4;
			time_constant = min(time_constant, (long)MAXTC);
			time_constant = max(time_constant, 0l);
438 439
		}

R
Roman Zippel 已提交
440 441 442
		if (txc->modes & ADJ_TAI && txc->constant > 0)
			time_tai = txc->constant;

443 444
		if (txc->modes & ADJ_OFFSET)
			ntp_update_offset(txc->offset);
R
Roman Zippel 已提交
445 446 447 448 449 450
		if (txc->modes & ADJ_TICK)
			tick_usec = txc->tick;

		if (txc->modes & (ADJ_TICK|ADJ_FREQUENCY|ADJ_OFFSET))
			ntp_update_frequency();
	}
R
Roman Zippel 已提交
451

452 453 454 455 456 457
	txc->offset = shift_right(time_offset * NTP_INTERVAL_FREQ,
				  NTP_SCALE_SHIFT);
	if (!(time_status & STA_NANO))
		txc->offset /= NSEC_PER_USEC;

adj_done:
R
Roman Zippel 已提交
458
	result = time_state;	/* mostly `TIME_OK' */
R
Roman Zippel 已提交
459
	if (time_status & (STA_UNSYNC|STA_CLOCKERR))
460 461
		result = TIME_ERROR;

462 463
	txc->freq	   = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) *
					 (s64)PPM_SCALE_INV, NTP_SCALE_SHIFT);
464 465 466 467
	txc->maxerror	   = time_maxerror;
	txc->esterror	   = time_esterror;
	txc->status	   = time_status;
	txc->constant	   = time_constant;
468
	txc->precision	   = 1;
469
	txc->tolerance	   = MAXFREQ_SCALED / PPM_SCALE;
470
	txc->tick	   = tick_usec;
R
Roman Zippel 已提交
471
	txc->tai	   = time_tai;
472 473 474 475 476 477 478 479 480 481 482

	/* PPS is not implemented, so these are zero */
	txc->ppsfreq	   = 0;
	txc->jitter	   = 0;
	txc->shift	   = 0;
	txc->stabil	   = 0;
	txc->jitcnt	   = 0;
	txc->calcnt	   = 0;
	txc->errcnt	   = 0;
	txc->stbcnt	   = 0;
	write_sequnlock_irq(&xtime_lock);
R
Roman Zippel 已提交
483

R
Roman Zippel 已提交
484 485 486 487
	txc->time.tv_sec = ts.tv_sec;
	txc->time.tv_usec = ts.tv_nsec;
	if (!(time_status & STA_NANO))
		txc->time.tv_usec /= NSEC_PER_USEC;
R
Roman Zippel 已提交
488

489
	notify_cmos_timer();
R
Roman Zippel 已提交
490 491

	return result;
492
}
493 494 495 496 497 498 499 500

static int __init ntp_tick_adj_setup(char *str)
{
	ntp_tick_adj = simple_strtol(str, NULL, 0);
	return 1;
}

__setup("ntp_tick_adj=", ntp_tick_adj_setup);
R
Roman Zippel 已提交
501 502 503 504 505 506 507

void __init ntp_init(void)
{
	ntp_clear();
	hrtimer_init(&leap_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
	leap_timer.function = ntp_leap_second;
}