aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/time/ntp.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-02-20 01:58:42 -0500
committerIngo Molnar <mingo@elte.hu>2009-02-25 12:38:06 -0500
commit53bbfa9e9437e70b322368e82c723112d690e304 (patch)
tree050817a4748d7cb7c5102273356136bbcfc2ea7e /kernel/time/ntp.c
parentfdcedf7b75808dd72c3cc0b931be11b04d75c60a (diff)
time: ntp: clean up kernel/time/ntp.c
Impact: cleanup, no functionality changed Make this file a bit more readable by applying a consistent coding style. No code changed: kernel/time/ntp.o: text data bss dec hex filename 2552 170 168 2890 b4a ntp.o.before 2552 170 168 2890 b4a ntp.o.after md5: eae1275df0b7d6290c13f6f6f8f05c8c ntp.o.before.asm eae1275df0b7d6290c13f6f6f8f05c8c ntp.o.after.asm Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/time/ntp.c')
-rw-r--r--kernel/time/ntp.c129
1 files changed, 81 insertions, 48 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index e1fa3689a903..3479ec48e604 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -1,53 +1,81 @@
1/* 1/*
2 * linux/kernel/time/ntp.c
3 *
4 * NTP state machine interfaces and logic. 2 * NTP state machine interfaces and logic.
5 * 3 *
6 * This code was mainly moved from kernel/timer.c and kernel/time.c 4 * This code was mainly moved from kernel/timer.c and kernel/time.c
7 * Please see those files for relevant copyright info and historical 5 * Please see those files for relevant copyright info and historical
8 * changelogs. 6 * changelogs.
9 */ 7 */
10
11#include <linux/mm.h>
12#include <linux/time.h>
13#include <linux/timex.h>
14#include <linux/jiffies.h>
15#include <linux/hrtimer.h>
16#include <linux/capability.h> 8#include <linux/capability.h>
17#include <linux/math64.h>
18#include <linux/clocksource.h> 9#include <linux/clocksource.h>
19#include <linux/workqueue.h> 10#include <linux/workqueue.h>
20#include <asm/timex.h> 11#include <linux/hrtimer.h>
12#include <linux/jiffies.h>
13#include <linux/math64.h>
14#include <linux/timex.h>
15#include <linux/time.h>
16#include <linux/mm.h>
21 17
22/* 18/*
23 * Timekeeping variables 19 * NTP timekeeping variables:
24 */ 20 */
25unsigned long tick_usec = TICK_USEC; /* USER_HZ period (usec) */
26unsigned long tick_nsec; /* ACTHZ period (nsec) */
27u64 tick_length;
28static u64 tick_length_base;
29 21
30static struct hrtimer leap_timer; 22/* USER_HZ period (usecs): */
23unsigned long tick_usec = TICK_USEC;
24
25/* ACTHZ period (nsecs): */
26unsigned long tick_nsec;
31 27
32#define MAX_TICKADJ 500 /* microsecs */ 28u64 tick_length;
33#define MAX_TICKADJ_SCALED (((u64)(MAX_TICKADJ * NSEC_PER_USEC) << \ 29static u64 tick_length_base;
34 NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ) 30
31static struct hrtimer leap_timer;
32
33#define MAX_TICKADJ 500 /* usecs */
34#define MAX_TICKADJ_SCALED \
35 (((u64)(MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ)
35 36
36/* 37/*
37 * phase-lock loop variables 38 * phase-lock loop variables
38 */ 39 */
39/* TIME_ERROR prevents overwriting the CMOS clock */ 40
40static int time_state = TIME_OK; /* clock synchronization status */ 41/*
41int time_status = STA_UNSYNC; /* clock status bits */ 42 * clock synchronization status
42static long time_tai; /* TAI offset (s) */ 43 *
43static s64 time_offset; /* time adjustment (ns) */ 44 * (TIME_ERROR prevents overwriting the CMOS clock)
44static long time_constant = 2; /* pll time constant */ 45 */
45long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ 46static int time_state = TIME_OK;
46long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ 47
47static s64 time_freq; /* frequency offset (scaled ns/s)*/ 48/* clock status bits: */
48static long time_reftime; /* time at last adjustment (s) */ 49int time_status = STA_UNSYNC;
49long time_adjust; 50
50static long ntp_tick_adj; 51/* TAI offset (secs): */
52static long time_tai;
53
54/* time adjustment (nsecs): */
55static s64 time_offset;
56
57/* pll time constant: */
58static long time_constant = 2;
59
60/* maximum error (usecs): */
61long time_maxerror = NTP_PHASE_LIMIT;
62
63/* estimated error (usecs): */
64long time_esterror = NTP_PHASE_LIMIT;
65
66/* frequency offset (scaled nsecs/secs): */
67static s64 time_freq;
68
69/* time at last adjustment (secs): */
70static long time_reftime;
71
72long time_adjust;
73
74static long ntp_tick_adj;
75
76/*
77 * NTP methods:
78 */
51 79
52static void ntp_update_frequency(void) 80static void ntp_update_frequency(void)
53{ 81{
@@ -118,15 +146,15 @@ static void ntp_update_offset(long offset)
118 */ 146 */
119void ntp_clear(void) 147void ntp_clear(void)
120{ 148{
121 time_adjust = 0; /* stop active adjtime() */ 149 time_adjust = 0; /* stop active adjtime() */
122 time_status |= STA_UNSYNC; 150 time_status |= STA_UNSYNC;
123 time_maxerror = NTP_PHASE_LIMIT; 151 time_maxerror = NTP_PHASE_LIMIT;
124 time_esterror = NTP_PHASE_LIMIT; 152 time_esterror = NTP_PHASE_LIMIT;
125 153
126 ntp_update_frequency(); 154 ntp_update_frequency();
127 155
128 tick_length = tick_length_base; 156 tick_length = tick_length_base;
129 time_offset = 0; 157 time_offset = 0;
130} 158}
131 159
132/* 160/*
@@ -147,8 +175,8 @@ static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
147 xtime.tv_sec--; 175 xtime.tv_sec--;
148 wall_to_monotonic.tv_sec++; 176 wall_to_monotonic.tv_sec++;
149 time_state = TIME_OOP; 177 time_state = TIME_OOP;
150 printk(KERN_NOTICE "Clock: " 178 printk(KERN_NOTICE
151 "inserting leap second 23:59:60 UTC\n"); 179 "Clock: inserting leap second 23:59:60 UTC\n");
152 hrtimer_add_expires_ns(&leap_timer, NSEC_PER_SEC); 180 hrtimer_add_expires_ns(&leap_timer, NSEC_PER_SEC);
153 res = HRTIMER_RESTART; 181 res = HRTIMER_RESTART;
154 break; 182 break;
@@ -157,8 +185,8 @@ static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
157 time_tai--; 185 time_tai--;
158 wall_to_monotonic.tv_sec--; 186 wall_to_monotonic.tv_sec--;
159 time_state = TIME_WAIT; 187 time_state = TIME_WAIT;
160 printk(KERN_NOTICE "Clock: " 188 printk(KERN_NOTICE
161 "deleting leap second 23:59:59 UTC\n"); 189 "Clock: deleting leap second 23:59:59 UTC\n");
162 break; 190 break;
163 case TIME_OOP: 191 case TIME_OOP:
164 time_tai++; 192 time_tai++;
@@ -199,10 +227,10 @@ void second_overflow(void)
199 * Compute the phase adjustment for the next second. The offset is 227 * Compute the phase adjustment for the next second. The offset is
200 * reduced by a fixed factor times the time constant. 228 * reduced by a fixed factor times the time constant.
201 */ 229 */
202 tick_length = tick_length_base; 230 tick_length = tick_length_base;
203 time_adj = shift_right(time_offset, SHIFT_PLL + time_constant); 231 time_adj = shift_right(time_offset, SHIFT_PLL + time_constant);
204 time_offset -= time_adj; 232 time_offset -= time_adj;
205 tick_length += time_adj; 233 tick_length += time_adj;
206 234
207 if (unlikely(time_adjust)) { 235 if (unlikely(time_adjust)) {
208 if (time_adjust > MAX_TICKADJ) { 236 if (time_adjust > MAX_TICKADJ) {
@@ -240,12 +268,13 @@ static void sync_cmos_clock(struct work_struct *work)
240 * This code is run on a timer. If the clock is set, that timer 268 * This code is run on a timer. If the clock is set, that timer
241 * may not expire at the correct time. Thus, we adjust... 269 * may not expire at the correct time. Thus, we adjust...
242 */ 270 */
243 if (!ntp_synced()) 271 if (!ntp_synced()) {
244 /* 272 /*
245 * Not synced, exit, do not restart a timer (if one is 273 * Not synced, exit, do not restart a timer (if one is
246 * running, let it run out). 274 * running, let it run out).
247 */ 275 */
248 return; 276 return;
277 }
249 278
250 getnstimeofday(&now); 279 getnstimeofday(&now);
251 if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) 280 if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2)
@@ -277,7 +306,8 @@ static void notify_cmos_timer(void)
277static inline void notify_cmos_timer(void) { } 306static inline void notify_cmos_timer(void) { }
278#endif 307#endif
279 308
280/* adjtimex mainly allows reading (and writing, if superuser) of 309/*
310 * adjtimex mainly allows reading (and writing, if superuser) of
281 * kernel time-keeping variables. used by xntpd. 311 * kernel time-keeping variables. used by xntpd.
282 */ 312 */
283int do_adjtimex(struct timex *txc) 313int do_adjtimex(struct timex *txc)
@@ -298,7 +328,10 @@ int do_adjtimex(struct timex *txc)
298 if (txc->modes && !capable(CAP_SYS_TIME)) 328 if (txc->modes && !capable(CAP_SYS_TIME))
299 return -EPERM; 329 return -EPERM;
300 330
301 /* if the quartz is off by more than 10% something is VERY wrong! */ 331 /*
332 * if the quartz is off by more than 10% then
333 * something is VERY wrong!
334 */
302 if (txc->modes & ADJ_TICK && 335 if (txc->modes & ADJ_TICK &&
303 (txc->tick < 900000/USER_HZ || 336 (txc->tick < 900000/USER_HZ ||
304 txc->tick > 1100000/USER_HZ)) 337 txc->tick > 1100000/USER_HZ))