Re: [PATCH 5/8] support for TAI

From: john stultz
Date: Fri Mar 14 2008 - 16:55:22 EST



On Fri, 2008-03-14 at 19:40 +0100, zippel@xxxxxxxxxxxxxx wrote:
> plain text document attachment (time_tai)
> This adds support for setting the TAI value (International Atomic Time).
> The value is reported back to userspace via timex (as we don't have a
> ntp_gettime() syscall).
>
> Signed-off-by: Roman Zippel <zippel@xxxxxxxxxxxxxx>
>

Very cool. I just was talking with someone who was looking for a TAI
interface.

Minor nit below.

-john


> Index: linux-2.6-mm/kernel/time/ntp.c
> ===================================================================
> --- linux-2.6-mm.orig/kernel/time/ntp.c
> +++ linux-2.6-mm/kernel/time/ntp.c
> @@ -35,6 +35,7 @@ static u64 tick_length, tick_length_base
> /* TIME_ERROR prevents overwriting the CMOS clock */
> static int time_state = TIME_OK; /* clock synchronization status */
> int time_status = STA_UNSYNC; /* clock status bits */
> +static long time_tai; /* TAI offset (s) */

I think timekeeping.c would be the better place for time_tai, keeping it
closer to xtime and wall_to_monotonic's definitions.


> static s64 time_offset; /* time adjustment (ns) */
> static long time_constant = 2; /* pll time constant */
> long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */
> @@ -162,6 +163,7 @@ void second_overflow(void)
> case TIME_DEL:
> if ((xtime.tv_sec + 1) % 86400 == 0) {
> xtime.tv_sec++;
> + time_tai--;
> wall_to_monotonic.tv_sec--;
> time_state = TIME_WAIT;
> printk(KERN_NOTICE "Clock: deleting leap second "
> @@ -169,6 +171,7 @@ void second_overflow(void)
> }
> break;
> case TIME_OOP:
> + time_tai++;
> time_state = TIME_WAIT;
> break;
> case TIME_WAIT:


These manipulations could also be done in the
timekeeping_insert/remove_second interface I suggested earlier.


> @@ -340,6 +343,9 @@ int do_adjtimex(struct timex *txc)
> time_constant = max(time_constant, 0l);
> }
>
> + if (txc->modes & ADJ_TAI && txc->constant > 0)
> + time_tai = txc->constant;
> +
> if (txc->modes & ADJ_OFFSET) {
> if (txc->modes == ADJ_OFFSET_SINGLESHOT)
> /* adjtime() is independent from ntp_adjtime() */
> @@ -375,6 +381,7 @@ int do_adjtimex(struct timex *txc)
> txc->precision = 1;
> txc->tolerance = MAXFREQ_SCALED / PPM_SCALE;
> txc->tick = tick_usec;
> + txc->tai = time_tai;
>
> /* PPS is not implemented, so these are zero */
> txc->ppsfreq = 0;
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/