linux-mips
[Top] [All Lists]

Re: [patch] Generic time trailing clean-ups

To: Jun Sun <jsun@mvista.com>
Subject: Re: [patch] Generic time trailing clean-ups
From: "Maciej W. Rozycki" <macro@ds2.pg.gda.pl>
Date: Tue, 12 Aug 2003 15:34:25 +0200 (MET DST)
Cc: Ralf Baechle <ralf@linux-mips.org>, linux-mips@linux-mips.org
In-reply-to: <20030811113428.F9020@mvista.com>
Organization: Technical University of Gdansk
Original-recipient: rfc822;linux-mips@linux-mips.org
Reply-to: "Maciej W. Rozycki" <macro@ds2.pg.gda.pl>
Sender: linux-mips-bounce@linux-mips.org
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        +


<Prev in Thread] Current Thread [Next in Thread>