public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: John Stultz <john.stultz@linaro.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Andy Lutomirski <luto@amacapital.net>,
	Arun Sharma <asharma@fb.com>, LKML <linux-kernel@vger.kernel.org>,
	Kumar Sundararajan <kumar@fb.com>
Subject: Re: clock_gettime_ns
Date: Wed, 04 Sep 2013 15:59:28 -0700	[thread overview]
Message-ID: <5227BB50.7000301@linaro.org> (raw)
In-Reply-To: <5227B432.8070205@zytor.com>

On 09/04/2013 03:29 PM, H. Peter Anvin wrote:
> On 09/04/2013 01:54 PM, John Stultz wrote:
>>> I'd advocate for going whole hog and returning, atomically:
>>>
>>>  - TAI (nanoseconds from epoch)
>>>  - UTC - TAI (seconds or nanoseconds) *
>>>  - TAI - CLOCK_MONOTONIC (nanoseconds)
>>>  - a leap second flag.
>>>
>>> * There are various ways to define this.  My fancy UTC - TAI wouldn't
>>> actually need the leap-second flag, since the UTC time would indicate
>>> leap seconds directly.
> Not so (see below).
>
>>  With the conventional approach, someone would
>>> have to decide whether the leap second count increments at the
>>> beginning or the end of the leap second.
>> Well, adjtimex() gives you UTC & tai offset & leapsecond flag in one go.
>>
> But not fractional-second information,right?  I believe it would be
> desirable if we can create a small structure (<= 16 bytes) for this.

Well, depending on if STA_NANO is set, adjtimex returns either nsec or
usec precision via the timex.time field.

> UTC - TAI is always an integral number of seconds, possibly negative
> (unlikely, but...)
>
> Something like:
>
> 	struct time_ns {
> 		u64 tai_s;
> 		u32 tai_ns;
> 		s16 utcdelta;	/* TAI - UTC */
> 		u8 leap;	/* Positive leap second in progress */
> 		u8 pad;		/* Something useful here maybe? */
> 	};
>
> Why the leap second flag?  It is necessary to represent the 61st second
> in a minute during a positive leap second.  Consider the below
> (artificial) cases:
>
> (leap second)
> TAI	31536000	31536001	31536002	31536003
> Delta	2		2		?		3
> UTC	23:59:58	23:59:59	23:59:60	00:00:00
>
> (no leap second)
> TAI	31536000	31536001	31536002	31536003
> Delta	2		2		2		2
> UTC	23:59:58	23:59:59	00:00:00	00:00:01
>
> (no leap second)
> TAI	31536000	31536001	31536002	31536003
> Delta	3		3		3		3
> UTC	23:59:57	23:59:58	23:59:59	00:00:00
>
> There simply is no sufficiently meaningful value that can be put on the
> delta during a positive leap second.  Both 2 and 3 would be wrong in the
> above example, giving UTC of either 00:00:00 or 23:59:59.
>
> There is a way to do without the leap second flag by making UTC the main
> time; this does have the advantage of higher compatibility with time_t,
> struct timespec, etc:
>
> 	struct timespecx {
> 		time_t tx_sec;		/* POSIX UTC seconds */
> 		u32 tx_ns;		/* Nanoseconds */
> 		s32 tx_taidelta;	/* TAI - UTC */
> 	};


And again, most of the detail above is already there w/ adjtimex (though
admittedly not in a very tight format).

My concern with adding these details to the timespec-like structure this
is with most clockids I'm not sure taidelta would make sense.

Also, there's been talk of a slewed-leap-second clockid, basically UTC
but around the leapsecond it slows down to absorb the extra second. This
means that clockid would have a subsecond offset from TAI.

thanks
-john

  reply	other threads:[~2013-09-04 22:59 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-04  9:18 clock_gettime_ns Arun Sharma
2013-09-04 18:51 ` clock_gettime_ns Andy Lutomirski
2013-09-04 19:20   ` clock_gettime_ns John Stultz
2013-09-04 20:33     ` clock_gettime_ns Andy Lutomirski
2013-09-04 20:54       ` clock_gettime_ns John Stultz
2013-09-04 22:29         ` clock_gettime_ns H. Peter Anvin
2013-09-04 22:59           ` John Stultz [this message]
2013-09-04 23:04             ` clock_gettime_ns H. Peter Anvin
2013-09-04 23:20               ` clock_gettime_ns John Stultz
2013-09-04 23:38           ` clock_gettime_ns Andy Lutomirski
2013-09-05  1:22             ` clock_gettime_ns H. Peter Anvin
2013-09-09 17:47               ` clock_gettime_ns Andy Lutomirski
2013-09-11 18:50                 ` clock_gettime_ns Richard Cochran
2013-09-04 19:17 ` clock_gettime_ns John Stultz
2013-09-04 20:23   ` clock_gettime_ns Andy Lutomirski
2013-09-04 20:50     ` clock_gettime_ns John Stultz
2013-09-05  4:45   ` clock_gettime_ns Arun Sharma

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5227BB50.7000301@linaro.org \
    --to=john.stultz@linaro.org \
    --cc=asharma@fb.com \
    --cc=hpa@zytor.com \
    --cc=kumar@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox