ntp.c 11.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * linux/kernel/time/ntp.c
 *
 * 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.
 */

#include <linux/mm.h>
#include <linux/time.h>
#include <linux/timex.h>
A
Alexey Dobriyan 已提交
14 15
#include <linux/jiffies.h>
#include <linux/hrtimer.h>
A
Alexey Dobriyan 已提交
16
#include <linux/capability.h>
R
Roman Zippel 已提交
17
#include <linux/math64.h>
R
Roman Zippel 已提交
18
#include <linux/clocksource.h>
19
#include <linux/workqueue.h>
20 21
#include <asm/timex.h>

22 23 24 25 26
/*
 * Timekeeping variables
 */
unsigned long tick_usec = TICK_USEC; 		/* USER_HZ period (usec) */
unsigned long tick_nsec;			/* ACTHZ period (nsec) */
R
Roman Zippel 已提交
27 28
u64 tick_length;
static u64 tick_length_base;
29

R
Roman Zippel 已提交
30 31
static struct hrtimer leap_timer;

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

/*
 * phase-lock loop variables
 */
/* TIME_ERROR prevents overwriting the CMOS clock */
40
static int time_state = TIME_OK;	/* clock synchronization status	*/
41
int time_status = STA_UNSYNC;		/* clock status bits		*/
R
Roman Zippel 已提交
42
static long time_tai;			/* TAI offset (s)		*/
R
Roman Zippel 已提交
43
static s64 time_offset;			/* time adjustment (ns)		*/
44
static long time_constant = 2;		/* pll time constant		*/
45 46
long time_maxerror = NTP_PHASE_LIMIT;	/* maximum error (us)		*/
long time_esterror = NTP_PHASE_LIMIT;	/* estimated error (us)		*/
47
static s64 time_freq;			/* frequency offset (scaled ns/s)*/
48
static long time_reftime;		/* time at last adjustment (s)	*/
49
long time_adjust;
50
static long ntp_tick_adj;
51

52 53
static void ntp_update_frequency(void)
{
54
	u64 old_tick_length_base = tick_length_base;
J
john stultz 已提交
55
	u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
56 57
				<< NTP_SCALE_SHIFT;
	second_length += (s64)ntp_tick_adj << NTP_SCALE_SHIFT;
58
	second_length += time_freq;
59

J
john stultz 已提交
60
	tick_length_base = second_length;
61

62
	tick_nsec = div_u64(second_length, HZ) >> NTP_SCALE_SHIFT;
R
Roman Zippel 已提交
63
	tick_length_base = div_u64(tick_length_base, NTP_INTERVAL_FREQ);
64 65 66 67 68 69

	/*
	 * 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;
70 71
}

R
Roman Zippel 已提交
72 73 74 75 76 77 78 79
static void ntp_update_offset(long offset)
{
	long mtemp;
	s64 freq_adj;

	if (!(time_status & STA_PLL))
		return;

R
Roman Zippel 已提交
80
	if (!(time_status & STA_NANO))
81
		offset *= NSEC_PER_USEC;
R
Roman Zippel 已提交
82 83 84 85 86

	/*
	 * Scale the phase adjustment and
	 * clamp to the operating range.
	 */
87 88
	offset = min(offset, MAXPHASE);
	offset = max(offset, -MAXPHASE);
R
Roman Zippel 已提交
89 90 91 92 93 94 95 96 97 98

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

99
	freq_adj = (s64)offset * mtemp;
100
	freq_adj <<= NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant);
R
Roman Zippel 已提交
101 102
	time_status &= ~STA_MODE;
	if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) {
103
		freq_adj += div_s64((s64)offset << (NTP_SCALE_SHIFT - SHIFT_FLL),
104
				    mtemp);
R
Roman Zippel 已提交
105 106
		time_status |= STA_MODE;
	}
R
Roman Zippel 已提交
107
	freq_adj += time_freq;
108 109
	freq_adj = min(freq_adj, MAXFREQ_SCALED);
	time_freq = max(freq_adj, -MAXFREQ_SCALED);
110

111
	time_offset = div_s64((s64)offset << NTP_SCALE_SHIFT, NTP_INTERVAL_FREQ);
R
Roman Zippel 已提交
112 113
}

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
/**
 * ntp_clear - Clears the NTP state variables
 *
 * Must be called while holding a write on the xtime_lock
 */
void ntp_clear(void)
{
	time_adjust = 0;		/* stop active adjtime() */
	time_status |= STA_UNSYNC;
	time_maxerror = NTP_PHASE_LIMIT;
	time_esterror = NTP_PHASE_LIMIT;

	ntp_update_frequency();

	tick_length = tick_length_base;
R
Roman Zippel 已提交
129
	time_offset = 0;
130 131
}

132
/*
R
Roman Zippel 已提交
133 134 135
 * 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.
136
 */
R
Roman Zippel 已提交
137
static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
138
{
R
Roman Zippel 已提交
139
	enum hrtimer_restart res = HRTIMER_NORESTART;
140

141
	write_seqlock(&xtime_lock);
142 143 144 145 146

	switch (time_state) {
	case TIME_OK:
		break;
	case TIME_INS:
R
Roman Zippel 已提交
147 148 149 150 151
		xtime.tv_sec--;
		wall_to_monotonic.tv_sec++;
		time_state = TIME_OOP;
		printk(KERN_NOTICE "Clock: "
		       "inserting leap second 23:59:60 UTC\n");
152
		hrtimer_add_expires_ns(&leap_timer, NSEC_PER_SEC);
R
Roman Zippel 已提交
153
		res = HRTIMER_RESTART;
154 155
		break;
	case TIME_DEL:
R
Roman Zippel 已提交
156 157 158 159 160 161
		xtime.tv_sec++;
		time_tai--;
		wall_to_monotonic.tv_sec--;
		time_state = TIME_WAIT;
		printk(KERN_NOTICE "Clock: "
		       "deleting leap second 23:59:59 UTC\n");
162 163
		break;
	case TIME_OOP:
R
Roman Zippel 已提交
164
		time_tai++;
165
		time_state = TIME_WAIT;
R
Roman Zippel 已提交
166
		/* fall through */
167 168
	case TIME_WAIT:
		if (!(time_status & (STA_INS | STA_DEL)))
R
Roman Zippel 已提交
169
			time_state = TIME_OK;
R
Roman Zippel 已提交
170 171 172 173
		break;
	}
	update_vsyscall(&xtime, clock);

174
	write_sequnlock(&xtime_lock);
R
Roman Zippel 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195

	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;
196 197 198
	}

	/*
199 200
	 * Compute the phase adjustment for the next second. The offset is
	 * reduced by a fixed factor times the time constant.
201
	 */
202
	tick_length = tick_length_base;
203
	time_adj = shift_right(time_offset, SHIFT_PLL + time_constant);
R
Roman Zippel 已提交
204
	time_offset -= time_adj;
205
	tick_length += time_adj;
206

207 208 209 210 211 212 213 214 215
	if (unlikely(time_adjust)) {
		if (time_adjust > MAX_TICKADJ) {
			time_adjust -= MAX_TICKADJ;
			tick_length += MAX_TICKADJ_SCALED;
		} else if (time_adjust < -MAX_TICKADJ) {
			time_adjust += MAX_TICKADJ;
			tick_length -= MAX_TICKADJ_SCALED;
		} else {
			tick_length += (s64)(time_adjust * NSEC_PER_USEC /
216
					NTP_INTERVAL_FREQ) << NTP_SCALE_SHIFT;
217
			time_adjust = 0;
218
		}
219 220 221
	}
}

222
#ifdef CONFIG_GENERIC_CMOS_UPDATE
223

224 225 226
/* Disable the cmos update - used by virtualization and embedded */
int no_sync_cmos_clock  __read_mostly;

227
static void sync_cmos_clock(struct work_struct *work);
228

229
static DECLARE_DELAYED_WORK(sync_cmos_work, sync_cmos_clock);
230

231
static void sync_cmos_clock(struct work_struct *work)
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
{
	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...
	 */
	if (!ntp_synced())
		/*
		 * Not synced, exit, do not restart a timer (if one is
		 * running, let it run out).
		 */
		return;

	getnstimeofday(&now);
251
	if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
252 253
		fail = update_persistent_clock(now);

254
	next.tv_nsec = (NSEC_PER_SEC / 2) - now.tv_nsec - (TICK_NSEC / 2);
255 256 257 258 259 260 261 262 263 264 265 266
	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;
	}
267
	schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next));
268 269 270
}

static void notify_cmos_timer(void)
271
{
272
	if (!no_sync_cmos_clock)
273
		schedule_delayed_work(&sync_cmos_work, 0);
274 275
}

276 277 278 279
#else
static inline void notify_cmos_timer(void) { }
#endif

280 281 282 283 284
/* adjtimex mainly allows reading (and writing, if superuser) of
 * kernel time-keeping variables. used by xntpd.
 */
int do_adjtimex(struct timex *txc)
{
R
Roman Zippel 已提交
285
	struct timespec ts;
286 287
	int result;

288 289
	/* Validate the data before disabling interrupts */
	if (txc->modes & ADJ_ADJTIME) {
R
Roman Zippel 已提交
290
		/* singleshot must not be used with any other mode bits */
291
		if (!(txc->modes & ADJ_OFFSET_SINGLESHOT))
292
			return -EINVAL;
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
		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;

		/* if the quartz is off by more than 10% something is VERY wrong! */
		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 已提交
309
	}
310

R
Roman Zippel 已提交
311 312
	getnstimeofday(&ts);

313 314 315
	write_seqlock_irq(&xtime_lock);

	/* If there are input parameters, then process them */
316 317 318 319 320 321 322 323 324 325 326
	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 已提交
327
	if (txc->modes) {
328 329
		long sec;

R
Roman Zippel 已提交
330 331 332 333 334 335 336 337 338
		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 已提交
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366

			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 已提交
367 368 369 370 371 372
		}

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

		if (txc->modes & ADJ_FREQUENCY) {
375 376 377
			time_freq = (s64)txc->freq * PPM_SCALE;
			time_freq = min(time_freq, MAXFREQ_SCALED);
			time_freq = max(time_freq, -MAXFREQ_SCALED);
378
		}
R
Roman Zippel 已提交
379

R
Roman Zippel 已提交
380
		if (txc->modes & ADJ_MAXERROR)
R
Roman Zippel 已提交
381
			time_maxerror = txc->maxerror;
R
Roman Zippel 已提交
382
		if (txc->modes & ADJ_ESTERROR)
R
Roman Zippel 已提交
383
			time_esterror = txc->esterror;
384

R
Roman Zippel 已提交
385
		if (txc->modes & ADJ_TIMECONST) {
R
Roman Zippel 已提交
386 387 388 389 390
			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);
391 392
		}

R
Roman Zippel 已提交
393 394 395
		if (txc->modes & ADJ_TAI && txc->constant > 0)
			time_tai = txc->constant;

396 397
		if (txc->modes & ADJ_OFFSET)
			ntp_update_offset(txc->offset);
R
Roman Zippel 已提交
398 399 400 401 402 403
		if (txc->modes & ADJ_TICK)
			tick_usec = txc->tick;

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

405 406 407 408 409 410
	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 已提交
411
	result = time_state;	/* mostly `TIME_OK' */
R
Roman Zippel 已提交
412
	if (time_status & (STA_UNSYNC|STA_CLOCKERR))
413 414
		result = TIME_ERROR;

415 416
	txc->freq	   = shift_right((time_freq >> PPM_SCALE_INV_SHIFT) *
					 (s64)PPM_SCALE_INV, NTP_SCALE_SHIFT);
417 418 419 420
	txc->maxerror	   = time_maxerror;
	txc->esterror	   = time_esterror;
	txc->status	   = time_status;
	txc->constant	   = time_constant;
421
	txc->precision	   = 1;
422
	txc->tolerance	   = MAXFREQ_SCALED / PPM_SCALE;
423
	txc->tick	   = tick_usec;
R
Roman Zippel 已提交
424
	txc->tai	   = time_tai;
425 426 427 428 429 430 431 432 433 434 435

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

R
Roman Zippel 已提交
437 438 439 440
	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 已提交
441

442
	notify_cmos_timer();
R
Roman Zippel 已提交
443 444

	return result;
445
}
446 447 448 449 450 451 452 453

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 已提交
454 455 456 457 458 459 460

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