diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-02-20 01:58:42 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-02-25 12:38:06 -0500 |
| commit | 53bbfa9e9437e70b322368e82c723112d690e304 (patch) | |
| tree | 050817a4748d7cb7c5102273356136bbcfc2ea7e /kernel/time | |
| parent | fdcedf7b75808dd72c3cc0b931be11b04d75c60a (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')
| -rw-r--r-- | kernel/time/ntp.c | 129 |
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 | */ |
| 25 | unsigned long tick_usec = TICK_USEC; /* USER_HZ period (usec) */ | ||
| 26 | unsigned long tick_nsec; /* ACTHZ period (nsec) */ | ||
| 27 | u64 tick_length; | ||
| 28 | static u64 tick_length_base; | ||
| 29 | 21 | ||
| 30 | static struct hrtimer leap_timer; | 22 | /* USER_HZ period (usecs): */ |
| 23 | unsigned long tick_usec = TICK_USEC; | ||
| 24 | |||
| 25 | /* ACTHZ period (nsecs): */ | ||
| 26 | unsigned long tick_nsec; | ||
| 31 | 27 | ||
| 32 | #define MAX_TICKADJ 500 /* microsecs */ | 28 | u64 tick_length; |
| 33 | #define MAX_TICKADJ_SCALED (((u64)(MAX_TICKADJ * NSEC_PER_USEC) << \ | 29 | static u64 tick_length_base; |
| 34 | NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ) | 30 | |
| 31 | static 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 | |
| 40 | static int time_state = TIME_OK; /* clock synchronization status */ | 41 | /* |
| 41 | int time_status = STA_UNSYNC; /* clock status bits */ | 42 | * clock synchronization status |
| 42 | static long time_tai; /* TAI offset (s) */ | 43 | * |
| 43 | static s64 time_offset; /* time adjustment (ns) */ | 44 | * (TIME_ERROR prevents overwriting the CMOS clock) |
| 44 | static long time_constant = 2; /* pll time constant */ | 45 | */ |
| 45 | long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ | 46 | static int time_state = TIME_OK; |
| 46 | long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ | 47 | |
| 47 | static s64 time_freq; /* frequency offset (scaled ns/s)*/ | 48 | /* clock status bits: */ |
| 48 | static long time_reftime; /* time at last adjustment (s) */ | 49 | int time_status = STA_UNSYNC; |
| 49 | long time_adjust; | 50 | |
| 50 | static long ntp_tick_adj; | 51 | /* TAI offset (secs): */ |
| 52 | static long time_tai; | ||
| 53 | |||
| 54 | /* time adjustment (nsecs): */ | ||
| 55 | static s64 time_offset; | ||
| 56 | |||
| 57 | /* pll time constant: */ | ||
| 58 | static long time_constant = 2; | ||
| 59 | |||
| 60 | /* maximum error (usecs): */ | ||
| 61 | long time_maxerror = NTP_PHASE_LIMIT; | ||
| 62 | |||
| 63 | /* estimated error (usecs): */ | ||
| 64 | long time_esterror = NTP_PHASE_LIMIT; | ||
| 65 | |||
| 66 | /* frequency offset (scaled nsecs/secs): */ | ||
| 67 | static s64 time_freq; | ||
| 68 | |||
| 69 | /* time at last adjustment (secs): */ | ||
| 70 | static long time_reftime; | ||
| 71 | |||
| 72 | long time_adjust; | ||
| 73 | |||
| 74 | static long ntp_tick_adj; | ||
| 75 | |||
| 76 | /* | ||
| 77 | * NTP methods: | ||
| 78 | */ | ||
| 51 | 79 | ||
| 52 | static void ntp_update_frequency(void) | 80 | static void ntp_update_frequency(void) |
| 53 | { | 81 | { |
| @@ -118,15 +146,15 @@ static void ntp_update_offset(long offset) | |||
| 118 | */ | 146 | */ |
| 119 | void ntp_clear(void) | 147 | void 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) | |||
| 277 | static inline void notify_cmos_timer(void) { } | 306 | static 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 | */ |
| 283 | int do_adjtimex(struct timex *txc) | 313 | int 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)) |
