On Mon, 11 Aug 2003, Jun Sun wrote:
> > Here is hopefully the final part (for now) of the generic time changes.
> > It addresses the following problems:
> >
> > - */
> > - if (!jiffies) {
> > - timerhi = timerlo = 0;
> > - mips_hpt_init(count);
> > + *
> > + * The first timer interrupt comes late as interrupts are
> > + * enabled long after timers are initialized. Therefore the
> > + * high precision timer is fast, leading to wrong gettimeoffset()
> > + * calculations. We deal with it by setting it based on the
> > + * number of its ticks between the second and the third interrupt.
> > + * That is still somewhat imprecise, but it's a good estimate.
> > + * --macro
> > + */
> > + j = jiffies;
> > + if (j < 4) {
> > + static unsigned int prev_count;
> > + static int hpt_initialized;
> > +
> > + switch (j) {
> > + case 0:
> > + timerhi = timerlo = 0;
> > + mips_hpt_init(count);
> > + break;
> > + case 2:
> > + prev_count = count;
> > + break;
> > + case 3:
> > + if (!hpt_initialized) {
> > + unsigned int c3 = 3 * (count - prev_count);
> > +
> > + timerhi = 0;
> > + timerlo = c3;
> > + mips_hpt_init(count - c3);
> > + hpt_initialized = 1;
> > + }
> > + break;
> > + default:
> > + break;
> > + }
> > }
> >
>
> The first gettimeoffset() call is way after many jiffies (~50 normally?).
> Such
> an estimate is not necessary.
As a number of interrupts is lost (at least half a second worth of; it
depends on how long console_init() executes), it takes a few minutes for
gettimeoffset() to recover from the error -- r0 (which is the number of
HPT ticks in a jiffy) is too high. As a result, offsets within jiffies as
calculated by gettimeoffset() are distributed unevenly. You may not care,
but I use NTP on my systems and I do care. With the above initialization,
r0 is almost correct from the beginning and after a few minutes of uptime
the error is no higher than one tick.
The fixed_rate_gettimeoffset() backend doesn't care but the calibrate_*()
ones do.
> Also note jiffies can wrap around.
Yep, it's already handled and the change above preserves it.
--
+ Maciej W. Rozycki, Technical University of Gdansk, Poland +
+--------------------------------------------------------------+
+ e-mail: macro@ds2.pg.gda.pl, PGP key available +
|