RE: [chrony-dev] [PATCH] More reliable method of reading rtc for initial trim |
[ Thread Index |
Date Index
| More chrony.tuxfamily.org/chrony-dev Archives
]
- To: <chrony-dev@xxxxxxxxxxxxxxxxxxxx>
- Subject: RE: [chrony-dev] [PATCH] More reliable method of reading rtc for initial trim
- From: "Hattink, Tjalling [FINT]" <T.Hattink@xxxxxxxx>
- Date: Wed, 28 May 2014 13:41:53 +0200
- Thread-index: Ac96Z0mF488KibIqQkKidhw66/xONQAAk+dw
- Thread-topic: [chrony-dev] [PATCH] More reliable method of reading rtc for initial trim
Hi,
Looks like my patch was still malformed, you have to remove some
line-ending breaks to make it work. I hoped that the max length was 80,
but everything after 70 is moved to the next line.
Tjalling Hattink
> -----Original Message-----
> From: Hattink, Tjalling [FINT] [mailto:T.Hattink@xxxxxxxx]
> Sent: Wednesday, May 28, 2014 13:24
> To: chrony-dev@xxxxxxxxxxxxxxxxxxxx
> Subject: [chrony-dev] [PATCH] More reliable method of reading rtc for
> initial trim
>
> When chrony reads in the linux rtc for the first time to trim the
> system
> clock, it only reads it once. As it is possible that the rtc updates
> itself
> during the read operation, the reported rtc time could be false. To
> prevent
> this I've added a loop that reads the rtc clock twice, if the seconds
> do
> not
> match retry the two read operations. If they match you can assume the
> read
> operation was successful.
>
> This is based on the hwclock implementation of reading the rtc clock
> from the
> util-linux package.
> ---
> rtc_linux.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/rtc_linux.c b/rtc_linux.c
> index 91b0cac..add828f 100644
> --- a/rtc_linux.c
> +++ b/rtc_linux.c
> @@ -971,7 +971,7 @@ void
> RTC_Linux_TimePreInit(void)
> {
> int fd, status;
> - struct rtc_time rtc_raw;
> + struct rtc_time rtc_raw, rtc_raw_retry;
> struct tm rtc_tm;
> time_t rtc_t, estimated_correct_rtc_t;
> long interval;
> @@ -989,7 +989,15 @@ RTC_Linux_TimePreInit(void)
> return; /* Can't open it, and won't be able to later */
> }
>
> - status = ioctl(fd, RTC_RD_TIME, &rtc_raw);
> + /* Retry reading the rtc until both read attempts give the same sec
> value.
> + This way the race condition is prevented that the RTC has
updated
> itself
> + during the first read operation. */
> + do {
> + status = ioctl(fd, RTC_RD_TIME, &rtc_raw);
> + if (status >= 0) {
> + status = ioctl(fd, RTC_RD_TIME, &rtc_raw_retry);
> + }
> + } while (status >= 0 && rtc_raw.tm_sec != rtc_raw_retry.tm_sec);
>
> if (status >= 0) {
> /* Convert to seconds since 1970 */
> --
> 1.9.1
--
To unsubscribe email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "unsubscribe" in the subject.
For help email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "help" in the subject.
Trouble? Email listmaster@xxxxxxxxxxxxxxxxxxxx.