Re: [PATCH 2/10] NTP: normalize time_adj

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Tue, 10 Jan 2006, john stultz wrote:

> > Index: linux-2.6-mm/include/linux/timex.h
> > ===================================================================
> > --- linux-2.6-mm.orig/include/linux/timex.h	2005-12-21 12:11:48.000000000 +0100
> > +++ linux-2.6-mm/include/linux/timex.h	2005-12-21 12:11:56.000000000 +0100
> > @@ -93,7 +93,7 @@
> >  #define SHIFT_SCALE 22		/* phase scale (shift) */
> >  #define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */
> >  #define SHIFT_USEC 16		/* frequency offset scale (shift) */
> > -#define FINENSEC (1L << (SHIFT_SCALE - 10)) /* ~1 ns in phase units */
> > +#define FINENSEC (1L << SHIFT_SCALE) /* ~1 ns in phase units */
> 
> So this effectively increases the granularity of the phase units, right?

Basically yes, but it's part of a small cleanup I forgot to comment. (See 
below)

> > @@ -675,36 +677,38 @@ static void second_overflow(void)
> >  	ltemp = min(ltemp, (MAXPHASE / MINSEC) << SHIFT_UPDATE);
> >  	ltemp = max(ltemp, -(MAXPHASE / MINSEC) << SHIFT_UPDATE);
> >  	time_offset -= ltemp;
> > -	time_adj = ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE);
> > +	adj = ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE);
> 
> 	That could maybe use a better comment. The larger comment makes it
> clear we're converting the usec offset to phase adjustment units, but
> maybe something further to explain how usecs -> phase is connected to
> multiplying by 2^(SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE) would help?

I agree that this could use better comments, although some changes are 
only temporary, so some things I'll probably only comment better in the 
changelog.

> >  	 * 0.78125% to get 1023.4375; => only 0.05% error (p. 14)
> >  	 */
> > -	time_adj += shift_right(time_adj, 6) + shift_right(time_adj, 7);
> > +	adj += shift_right(adj, 6) + shift_right(adj, 7);
> >  #endif
> > +	tick_nsec_curr += adj >> (SHIFT_SCALE - 10);
> > +	time_adj = (adj << 10) & (FINENSEC - 1);
> 
> Again, a comment here would help. 
> 
> We use time_adj to increment the phase which will adjust the per-tick
> nsec interval in update_wall_time_one_tick, so why are we adjusting
> tick_nsec_curr which is used there as well?

This is the part which normalizes time_adj, so it's always positive and 
saves two checks in update_wall_time_one_tick().
(BTW in the long term I want to merge these two into a single 64 bit 
variable, but it requires a few more changes.)

> Also why SHIFT_SCALE - 10?  And (adj<<10)&(FINSEC -1) looks like magic
> to me. :)

It's connected to the removed "- 10" above and below, it moves the crude 
usec to nsec conversion (it divides by 1024 instead of 1000) to a single 
spot, so it's easier to remove in a later patch.
I initially wanted to mention this in the changelog, but forgot about it, 
I'll update it.

> >  	time_phase += time_adj;
> > -	if ((time_phase >= FINENSEC) || (time_phase <= -FINENSEC)) {
> > -		long ltemp = shift_right(time_phase, (SHIFT_SCALE - 10));
> > -		time_phase -= ltemp << (SHIFT_SCALE - 10);
> > +	if (time_phase >= FINENSEC) {
> > +		long ltemp = time_phase >> SHIFT_SCALE;
> > +		time_phase -= ltemp << SHIFT_SCALE;
> >  		delta_nsec += ltemp;
> >  	}
> >  	xtime.tv_nsec += delta_nsec;
> 
> Again, same point as the last comment.

See above.

> I'll try to provide similar comments for the other patches tomorrow.

Thanks. :)

bye, Roman
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux