You need to sign in or sign up before continuing.
ntp.c 11.8 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 33 34 35
u64				tick_length;
static u64			tick_length_base;

static struct hrtimer		leap_timer;

#define MAX_TICKADJ		500		/* usecs */
#define MAX_TICKADJ_SCALED \
  (((u64)(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
static void ntp_update_frequency(void)
{
82
	u64 old_tick_length_base = tick_length_base;
J
john stultz 已提交
83
	u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
84 85
				<< NTP_SCALE_SHIFT;
	second_length += (s64)ntp_tick_adj << NTP_SCALE_SHIFT;
86
	second_length += time_freq;
87

J
john stultz 已提交
88
	tick_length_base = second_length;
89

90
	tick_nsec = div_u64(second_length, HZ) >> NTP_SCALE_SHIFT;
R
Roman Zippel 已提交
91
	tick_length_base = div_u64(tick_length_base, NTP_INTERVAL_FREQ);
92 93 94 95 96 97

	/*
	 * Don't wait for the next second_overflow, apply
	 * the change to the tick length immediately
	 */
	tick_length += tick_length_base - old_tick_length_base;
98 99
}

R
Roman Zippel 已提交
100 101 102 103 104 105 106 107
static void ntp_update_offset(long offset)
{
	long mtemp;
	s64 freq_adj;

	if (!(time_status & STA_PLL))
		return;

R
Roman Zippel 已提交
108
	if (!(time_status & STA_NANO))
109
		offset *= NSEC_PER_USEC;
R
Roman Zippel 已提交
110 111 112 113 114

	/*
	 * Scale the phase adjustment and
	 * clamp to the operating range.
	 */
115 116
	offset = min(offset, MAXPHASE);
	offset = max(offset, -MAXPHASE);
R
Roman Zippel 已提交
117 118 119 120 121 122 123 124 125 126

	/*
	 * 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;

127
	freq_adj = (s64)offset * mtemp;
128
	freq_adj <<= NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant);
R
Roman Zippel 已提交
129 130
	time_status &= ~STA_MODE;
	if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) {
131
		freq_adj += div_s64((s64)offset << (NTP_SCALE_SHIFT - SHIFT_FLL),
132
				    mtemp);
R
Roman Zippel 已提交
133 134
		time_status |= STA_MODE;
	}
R
Roman Zippel 已提交
135
	freq_adj += time_freq;
136 137
	freq_adj = min(freq_adj, MAXFREQ_SCALED);
	time_freq = max(freq_adj, -MAXFREQ_SCALED);
138

139
	time_offset = div_s64((s64)offset << NTP_SCALE_SHIFT, NTP_INTERVAL_FREQ);
R
Roman Zippel 已提交
140 141
}

142 143 144 145 146 147 148
/**
 * ntp_clear - Clears the NTP state variables
 *
 * Must be called while holding a write on the xtime_lock
 */
void ntp_clear(void)
{
149 150 151 152
	time_adjust	= 0;		/* stop active adjtime() */
	time_status	|= STA_UNSYNC;
	time_maxerror	= NTP_PHASE_LIMIT;
	time_esterror	= NTP_PHASE_LIMIT;
153 154 155

	ntp_update_frequency();

156 157
	tick_length	= tick_length_base;
	time_offset	= 0;
158 159
}

160
/*
R
Roman Zippel 已提交
161 162 163
 * 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.
164
 */
R
Roman Zippel 已提交
165
static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
166
{
R
Roman Zippel 已提交
167
	enum hrtimer_restart res = HRTIMER_NORESTART;
168

169
	write_seqlock(&xtime_lock);
170 171 172 173 174

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

202
	write_sequnlock(&xtime_lock);
R
Roman Zippel 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223

	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;
224 225 226
	}

	/*
227 228
	 * Compute the phase adjustment for the next second. The offset is
	 * reduced by a fixed factor times the time constant.
229
	 */
230 231 232 233
	tick_length	= tick_length_base;
	time_adj	= shift_right(time_offset, SHIFT_PLL + time_constant);
	time_offset	-= time_adj;
	tick_length	+= time_adj;
234

235 236 237 238 239 240 241
	if (!time_adjust)
		return;

	if (time_adjust > MAX_TICKADJ) {
		time_adjust -= MAX_TICKADJ;
		tick_length += MAX_TICKADJ_SCALED;
		return;
242
	}
243 244 245 246 247 248 249 250 251 252

	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;
253 254
}

255
#ifdef CONFIG_GENERIC_CMOS_UPDATE
256

257 258 259
/* Disable the cmos update - used by virtualization and embedded */
int no_sync_cmos_clock  __read_mostly;

260
static void sync_cmos_clock(struct work_struct *work);
261

262
static DECLARE_DELAYED_WORK(sync_cmos_work, sync_cmos_clock);
263

264
static void sync_cmos_clock(struct work_struct *work)
265 266 267 268 269 270 271 272 273 274 275
{
	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...
	 */
276
	if (!ntp_synced()) {
277 278 279 280 281
		/*
		 * Not synced, exit, do not restart a timer (if one is
		 * running, let it run out).
		 */
		return;
282
	}
283 284

	getnstimeofday(&now);
285
	if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
286 287
		fail = update_persistent_clock(now);

288
	next.tv_nsec = (NSEC_PER_SEC / 2) - now.tv_nsec - (TICK_NSEC / 2);
289 290 291 292 293 294 295 296 297 298 299 300
	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;
	}
301
	schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next));
302 303 304
}

static void notify_cmos_timer(void)
305
{
306
	if (!no_sync_cmos_clock)
307
		schedule_delayed_work(&sync_cmos_work, 0);
308 309
}

310 311 312 313
#else
static inline void notify_cmos_timer(void) { }
#endif

314 315
/*
 * adjtimex mainly allows reading (and writing, if superuser) of
316 317 318 319
 * kernel time-keeping variables. used by xntpd.
 */
int do_adjtimex(struct timex *txc)
{
R
Roman Zippel 已提交
320
	struct timespec ts;
321 322
	int result;

323 324
	/* Validate the data before disabling interrupts */
	if (txc->modes & ADJ_ADJTIME) {
R
Roman Zippel 已提交
325
		/* singleshot must not be used with any other mode bits */
326
		if (!(txc->modes & ADJ_OFFSET_SINGLESHOT))
327
			return -EINVAL;
328 329 330 331 332 333 334 335
		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;

336 337 338 339
		/*
		 * if the quartz is off by more than 10% then
		 * something is VERY wrong!
		 */
340 341 342 343 344 345 346
		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 已提交
347
	}
348

R
Roman Zippel 已提交
349 350
	getnstimeofday(&ts);

351 352 353
	write_seqlock_irq(&xtime_lock);

	/* If there are input parameters, then process them */
354 355 356 357 358 359 360 361 362 363 364
	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 已提交
365
	if (txc->modes) {
366 367
		long sec;

R
Roman Zippel 已提交
368 369 370 371 372 373 374 375 376
		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 已提交
377 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

			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 已提交
405 406 407 408 409 410
		}

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

		if (txc->modes & ADJ_FREQUENCY) {
413 414 415
			time_freq = (s64)txc->freq * PPM_SCALE;
			time_freq = min(time_freq, MAXFREQ_SCALED);
			time_freq = max(time_freq, -MAXFREQ_SCALED);
416
		}
R
Roman Zippel 已提交
417

R
Roman Zippel 已提交
418
		if (txc->modes & ADJ_MAXERROR)
R
Roman Zippel 已提交
419
			time_maxerror = txc->maxerror;
R
Roman Zippel 已提交
420
		if (txc->modes & ADJ_ESTERROR)
R
Roman Zippel 已提交
421
			time_esterror = txc->esterror;
422

R
Roman Zippel 已提交
423
		if (txc->modes & ADJ_TIMECONST) {
R
Roman Zippel 已提交
424 425 426 427 428
			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);
429 430
		}

R
Roman Zippel 已提交
431 432 433
		if (txc->modes & ADJ_TAI && txc->constant > 0)
			time_tai = txc->constant;

434 435
		if (txc->modes & ADJ_OFFSET)
			ntp_update_offset(txc->offset);
R
Roman Zippel 已提交
436 437 438 439 440 441
		if (txc->modes & ADJ_TICK)
			tick_usec = txc->tick;

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

443 444 445 446 447 448
	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 已提交
449
	result = time_state;	/* mostly `TIME_OK' */
R
Roman Zippel 已提交
450
	if (time_status & (STA_UNSYNC|STA_CLOCKERR))
451 452
		result = TIME_ERROR;

453 454
	txc->freq	   = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) *
					 (s64)PPM_SCALE_INV, NTP_SCALE_SHIFT);
455 456 457 458
	txc->maxerror	   = time_maxerror;
	txc->esterror	   = time_esterror;
	txc->status	   = time_status;
	txc->constant	   = time_constant;
459
	txc->precision	   = 1;
460
	txc->tolerance	   = MAXFREQ_SCALED / PPM_SCALE;
461
	txc->tick	   = tick_usec;
R
Roman Zippel 已提交
462
	txc->tai	   = time_tai;
463 464 465 466 467 468 469 470 471 472 473

	/* 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 已提交
474

R
Roman Zippel 已提交
475 476 477 478
	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 已提交
479

480
	notify_cmos_timer();
R
Roman Zippel 已提交
481 482

	return result;
483
}
484 485 486 487 488 489 490 491

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 已提交
492 493 494 495 496 497 498

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