linux-mips
[Top] [All Lists]

Re: [patch] Generic time trailing clean-ups

To: "Maciej W. Rozycki" <macro@ds2.pg.gda.pl>
Subject: Re: [patch] Generic time trailing clean-ups
From: Jun Sun <jsun@mvista.com>
Date: Tue, 12 Aug 2003 10:05:37 -0700
Cc: Ralf Baechle <ralf@linux-mips.org>, linux-mips@linux-mips.org, jsun@mvista.com
In-reply-to: <Pine.GSO.3.96.1030812125503.5935B-100000@delta.ds2.pg.gda.pl>; from macro@ds2.pg.gda.pl on Tue, Aug 12, 2003 at 03:34:25PM +0200
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20030811113428.F9020@mvista.com> <Pine.GSO.3.96.1030812125503.5935B-100000@delta.ds2.pg.gda.pl>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.2.5i
On Tue, Aug 12, 2003 at 03:34:25PM +0200, Maciej W. Rozycki wrote:
> 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.

Perhaps we should always calibrate the counter frequency and forget about
all those calibrate_*() routines.  This will allow us to get rid of a few
funtions.  Plus knowing the frequency is generally a good thing (for some
performance measurement, for example).

I have a patch floating around just doing that, and in MontaVista tree
we have already done for a long time.

The patch is at 

http://linux.junsun.net/patches/oss.sgi.com/experimental/011128.calibrate_mips_counter.patch

(Wow!  I can't believe it was done almost two years ago.)

Jun

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