From: Thomas Gleixner <tglx@linutronix.de>
To: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>,
Miroslav Lichvar <mlichvar@redhat.com>,
linux-kernel@vger.kernel.org,
John Stultz <john.stultz@linaro.org>,
Prarit Bhargava <prarit@redhat.com>,
Alessandro Zummo <a.zummo@towertech.it>,
linux-rtc@vger.kernel.org, Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH] rtc: adapt allowed RTC update error
Date: Thu, 03 Dec 2020 22:05:09 +0100 [thread overview]
Message-ID: <87zh2ubny2.fsf@nanos.tec.linutronix.de> (raw)
In-Reply-To: <20201203161622.GA1317829@ziepe.ca>
On Thu, Dec 03 2020 at 12:16, Jason Gunthorpe wrote:
> On Thu, Dec 03, 2020 at 04:39:21PM +0100, Thomas Gleixner wrote:
>
>> The logic in sync_cmos_clock() and rtc_set_ntp_time() is different as I
>> pointed out: sync_cmos_clock() hands -500ms to rtc_tv_nsec_ok() and
>> rtc_set_ntp_time() uses +500ms, IOW exactly ONE second difference in
>> behaviour.
>
> I understood this is because the two APIs work differently, rmk
> explained this as:
>
>> 1. kernel/time/ntp.c assumes that all RTCs want to be told to set the
>> time at around 500ms into the second.
>>
>> 2. drivers/rtc/systohc.c assumes that if the time being set is >= 500ms,
>> then we want to set the _next_ second.
>
> ie one path is supposed to round down and one path is supposed to
> round up, so you get to that 1s difference..
>
> IIRC this is also connected to why the offset is signed..
The problem is that it is device specific and therefore having the
offset parameter is a good starting point.
Lets look at the two scenarios:
1) Direct accessible RTC:
tsched t1 t2
write(newsec) RTC increments seconds
For rtc_cmos/MC1... tinc = t2 - t1 = 500ms
There are RTCs which reset the thing on write so tinc = t2 - t1 = 1000ms
No idea what other variants are out there, but the principle is the
same for all of them.
Lets assume that the event is accurate for now and ignore the fuzz
logic, i.e. tsched == t1
tsched must be scheduled to happen tinc before wallclock increments
seconds so that the RTC increments seconds at the same time.
That means newsec = t1.tv_sec.
So now the fuzz logic for the legacy cmos path does:
newtime = t1 - tinc;
if (newtime.tv_nsec < FUZZ)
newsec = newtime.tv_sec;
else if (newtime.tv_nsec > NSEC_PER_SEC - FUZZ)
newsec = newtime.tv_sec + 1;
else
goto fail;
The first condition handles the case where t1 >= tsched and the second
one where t1 < tsched.
We need the same logic for rtc_cmos() when the update goes through
the RTC path, which is broken today. See below.
2) I2C/SPI ...
tsched t0 t1 t2
transfer(newsec) RTC update (newsec) RTC increments seconds
Lets assume that ttransfer = t1 - t0 is known.
tinc is the same as above = t2 - t1
Again, lets assume that the event is accurate for now and ignore the fuzz
logic, i.e. tsched == t0
So tsched has to be ttot = t2 - t0 _before_ wallclock reaches t2 and
increments seconds.
In this case newsec = t1.tv_sec = (t0 + ttransfer).tv_sec
So now the fuzz logic for this is:
newtime = t0 + ttransfer;
if (newtime.tv_nsec < FUZZ)
newsec = newtime.tv_sec;
else if (newtime.tv_nsec > NSEC_PER_SEC - FUZZ)
newsec = newtime.tv_sec + 1;
else
goto fail;
Again the first condition handles the case where t1 >= tsched and the
second one where t1 < tsched.
So now we have two options to fix this:
1) Use a negative sync_offset for devices which need #1 above
(rtc_cmos & similar)
That requires setting tsched to t2 - abs(sync_offset)
2) Use always a positive sync_offset and a flag which tells
rtc_tv_nsec_ok() whether it needs to add or subtract.
#1 is good enough. All it takes is a comment at the timer start code why
abs() is required.
Let me hack that up along with the hrtimer muck.
Thanks,
tglx
next prev parent reply other threads:[~2020-12-03 21:06 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-01 14:38 [PATCH] rtc: adapt allowed RTC update error Miroslav Lichvar
2020-12-01 16:12 ` Jason Gunthorpe
2020-12-01 17:14 ` Miroslav Lichvar
2020-12-01 17:35 ` Jason Gunthorpe
2020-12-02 10:01 ` [PATCHv2] " Miroslav Lichvar
2020-12-02 13:44 ` [PATCH] " Thomas Gleixner
2020-12-02 15:07 ` Miroslav Lichvar
2020-12-02 15:36 ` Miroslav Lichvar
2020-12-02 18:36 ` Thomas Gleixner
2020-12-02 16:27 ` Jason Gunthorpe
2020-12-02 19:21 ` Thomas Gleixner
2020-12-02 20:54 ` Jason Gunthorpe
2020-12-02 22:08 ` Thomas Gleixner
2020-12-02 23:03 ` Jason Gunthorpe
2020-12-03 1:14 ` Thomas Gleixner
2020-12-03 2:04 ` Jason Gunthorpe
2020-12-03 2:10 ` Alexandre Belloni
2020-12-03 15:39 ` Thomas Gleixner
2020-12-03 16:16 ` Jason Gunthorpe
2020-12-03 21:05 ` Thomas Gleixner [this message]
2020-12-03 21:31 ` Thomas Gleixner
2020-12-03 22:36 ` Jason Gunthorpe
2020-12-04 13:02 ` Thomas Gleixner
2020-12-04 14:08 ` Jason Gunthorpe
2020-12-04 14:37 ` Alexandre Belloni
2020-12-04 14:46 ` Jason Gunthorpe
2020-12-04 15:08 ` Alexandre Belloni
2020-12-04 15:57 ` Jason Gunthorpe
2020-12-04 16:35 ` Alexandre Belloni
2020-12-03 22:00 ` Alexandre Belloni
2020-12-04 9:34 ` Thomas Gleixner
2020-12-04 9:51 ` Alexandre Belloni
2020-12-04 10:44 ` Thomas Gleixner
2020-12-03 17:29 ` Alexandre Belloni
2020-12-03 19:52 ` Thomas Gleixner
2020-12-03 15:52 ` Jason Gunthorpe
2020-12-03 16:07 ` Alexandre Belloni
2020-12-03 20:10 ` Jason Gunthorpe
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=87zh2ubny2.fsf@nanos.tec.linutronix.de \
--to=tglx@linutronix.de \
--cc=a.zummo@towertech.it \
--cc=alexandre.belloni@bootlin.com \
--cc=jgg@ziepe.ca \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=mlichvar@redhat.com \
--cc=peterz@infradead.org \
--cc=prarit@redhat.com \
/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;
as well as URLs for NNTP newsgroup(s).