mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: john stultz <johnstul@us.ibm.com>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Darren Hart <dvhltc@us.ibm.com>,
	Nishanth Aravamudan <nacc@us.ibm.com>,
	Frank Sorenson <frank@tuxrocks.com>,
	George Anzinger <george@mvista.com>,
	Roman Zippel <zippel@linux-m68k.org>,
	Ulrich Windl <ulrich.windl@rz.uni-regensburg.de>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH 1/13] Time: Reduced NTP rework (part 1)
Date: Sat, 26 Nov 2005 15:52:43 +0100	[thread overview]
Message-ID: <20051126145243.GC12999@elte.hu> (raw)
In-Reply-To: <20051122013522.18537.97944.sendpatchset@cog.beaverton.ibm.com>


- clean up the impact of timeofday-ntp-part1.patch

Signed-off-by: Ingo Molnar <mingo@elte.hu>

 kernel/timer.c |  138 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 83 insertions(+), 55 deletions(-)

Index: linux/kernel/timer.c
===================================================================
--- linux.orig/kernel/timer.c
+++ linux/kernel/timer.c
@@ -623,9 +623,9 @@ static long time_adj;			/* tick adjust (
 long time_reftime;			/* time at last adjustment (s)	*/
 long time_adjust;
 long time_next_adjust;
-long time_adjust_step;	/* per tick time_adjust step */
+long time_adjust_step;			/* per tick time_adjust step */
 
-long total_sppm;	/* shifted ppm sum of all NTP adjustments */
+long total_sppm;			/* shifted ppm sum of all adjustments */
 long offset_adj_ppm;
 long tick_adj_ppm;
 long singleshot_adj_ppm;
@@ -848,8 +848,7 @@ static void second_overflow(void)
 
 
 /**
- * ntp_get_ppm_adjustment - Returns Shifted PPM adjustment
- *
+ * ntp_get_ppm_adjustment - return shifted PPM adjustment
  */
 long ntp_get_ppm_adjustment(void)
 {
@@ -857,41 +856,45 @@ long ntp_get_ppm_adjustment(void)
 }
 
 /**
- * ntp_advance() - increments the NTP state machine
- *
+ * ntp_advance - increments the NTP state machine
+ * @interval_ns: interval, in nanoseconds
  */
 void ntp_advance(unsigned long interval_ns)
 {
 	static unsigned long interval_sum;
+
 	unsigned long flags;
+
 	write_seqlock_irqsave(&ntp_lock, flags);
 
-	/* increment the interval sum */
+	/* increment the interval sum: */
 	interval_sum += interval_ns;
 
-	/* calculate the per tick singleshot adjtime adjustment step */
+	/* calculate the per tick singleshot adjtime adjustment step: */
 	while (interval_ns >= tick_nsec) {
 		time_adjust_step = time_adjust;
 		if (time_adjust_step) {
-	    		/* We are doing an adjtime thing.
-	     		 *
+			/*
+			 * We are doing an adjtime thing.
+			 *
 			 * Prepare time_adjust_step to be within bounds.
 			 * Note that a positive time_adjust means we want
 			 * the clock to run faster.
 			 *
-		    	 * Limit the amount of the step to be in the range
-			 * -tickadj .. +tickadj
+			 * Limit the amount of the step to be in the range
+			 * -tickadj .. +tickadj:
 			 */
-	    		time_adjust_step = min(time_adjust_step, (long)tickadj);
+			time_adjust_step = min(time_adjust_step, (long)tickadj);
 			time_adjust_step = max(time_adjust_step,
 							 (long)-tickadj);
 
-			/* Reduce by this step the amount of time left  */
-		    	time_adjust -= time_adjust_step;
+			/* Reduce by this step the amount of time left: */
+			time_adjust -= time_adjust_step;
 		}
 		interval_ns -= tick_nsec;
 	}
-	singleshot_adj_ppm = time_adjust_step*(1000000/HZ); /* usec/tick => ppm */
+	/* usec/tick => ppm: */
+	singleshot_adj_ppm = time_adjust_step*(1000000/HZ);
 
 	/* Changes by adjtime() do not take effect till next tick. */
 	if (time_next_adjust != 0) {
@@ -904,71 +907,96 @@ void ntp_advance(unsigned long interval_
 		second_overflow();
 	}
 
-	/* calculate the total continuous ppm adjustment */
+	/* calculate the total continuous ppm adjustment: */
 	total_sppm = time_freq; /* already shifted by SHIFT_USEC */
 	total_sppm += offset_adj_ppm << SHIFT_USEC;
 	total_sppm += tick_adj_ppm << SHIFT_USEC;
 	total_sppm += singleshot_adj_ppm << SHIFT_USEC;
 
 	write_sequnlock_irqrestore(&ntp_lock, flags);
+}
+
+#ifdef CONFIG_GENERIC_TIME
+# define update_wall_time(x) do { } while (0)
+#else
+
+/**
+ * phase_advance - advance the phase
+ * @time_adj: adjustment in nsecs
+ *
+ * advance the phase, once it gets to one microsecond advance the tick more.
+ */
+static inline long phase_advance(long time_adj)
+{
+	long delta = 0;
+
+	time_phase += time_adj;
+
+	if ((time_phase >= FINENSEC) || (time_phase <= -FINENSEC)) {
+		delta = shift_right(time_phase, (SHIFT_SCALE - 10));
+		time_phase -= delta << (SHIFT_SCALE - 10);
+	}
+
+	return delta;
+}
+
+/**
+ * xtime_advance - advance xtime
+ * @delta_nsec: adjustment in nsecs
+ */
+static inline void xtime_advance(long delta_nsec)
+{
+	int leapsecond;
+
+	xtime.tv_nsec += delta_nsec;
+	if (likely(xtime.tv_nsec < NSEC_PER_SEC))
+		return;
 
+	xtime.tv_nsec -= NSEC_PER_SEC;
+	xtime.tv_sec++;
+
+	/* process leapsecond: */
+	leapsecond = ntp_leapsecond(xtime);
+	if (likely(!leapsecond))
+		return;
+
+	xtime.tv_sec += leapsecond;
+	wall_to_monotonic.tv_sec -= leapsecond;
+	/*
+	 * Use of time interpolator for a gradual
+	 * change of time:
+	 */
+	time_interpolator_update(leapsecond*NSEC_PER_SEC);
+	clock_was_set();
 }
 
-#ifndef CONFIG_GENERIC_TIME
 /*
  * Using a loop looks inefficient, but "ticks" is
  * usually just one (we shouldn't be losing ticks,
  * we're doing this this way mainly for interrupt
  * latency reasons, not because we think we'll
- * have lots of lost timer ticks
+ * have lots of lost timer ticks)
  */
 static void update_wall_time(unsigned long ticks)
 {
-	long delta_nsec;
-	static long time_phase; /* phase offset (scaled us)	*/
+	static long time_phase; /* phase offset (scaled us) */
 
 	do {
-		ticks--;
-
-		/* Calculate the nsec delta using the
-		 * precomputed NTP adjustments:
-		 *     tick_nsec, time_adjust_step, time_adj
-		 */
-		delta_nsec = tick_nsec + time_adjust_step * 1000;
 		/*
-		 * Advance the phase, once it gets to one microsecond, then
-		 * advance the tick more.
+		 * Calculate the nsec delta using the precomputed NTP
+		 * adjustments:
+		 *     tick_nsec, time_adjust_step, time_adj
 		 */
-		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);
-			delta_nsec += ltemp;
-		}
+		long delta_nsec = tick_nsec + time_adjust_step * 1000;
 
-		xtime.tv_nsec += delta_nsec;
-		if (xtime.tv_nsec >= NSEC_PER_SEC) {
-			int leapsecond;
-			xtime.tv_nsec -= NSEC_PER_SEC;
-			xtime.tv_sec++;
-			/* process leapsecond */
-			leapsecond = ntp_leapsecond(xtime);
-			if (leapsecond) {
-				xtime.tv_sec += leapsecond;
-				wall_to_monotonic.tv_sec -= leapsecond;
-				/* Use of time interpolator for a gradual change of time */
-				time_interpolator_update(leapsecond*NSEC_PER_SEC);
-				clock_was_set();
-			}
-		}
+		delta_nsec += phase_advance();
+
+		xtime_advance(delta_nsec);
 		ntp_advance(tick_nsec);
 		time_interpolator_update(delta_nsec);
 
-	} while (ticks);
+	} while (--ticks);
 }
-#else /* !CONFIG_GENERIC_TIME */
-#define update_wall_time(x)
 #endif /* !CONFIG_GENERIC_TIME */
 
 /*

  parent reply	other threads:[~2005-11-26 14:52 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-22  1:35 [PATCH 0/13] Time: Generic Timeofday Subsystem (v B11) john stultz
2005-11-22  1:35 ` [PATCH 1/13] Time: Reduced NTP rework (part 1) john stultz
2005-11-26 14:52   ` [patch] warn-on-once.patch Ingo Molnar
2005-11-26 15:03     ` Tim Schmielau
2005-11-26 15:03     ` Michal Schmidt
2005-11-26 15:17     ` Ingo Molnar
2005-11-26 15:21       ` Ingo Molnar
2005-11-26 14:52   ` Ingo Molnar [this message]
2005-11-22  1:35 ` [PATCH 2/13] Time: Reduced NTP Rework (part 2) john stultz
2005-11-26 14:53   ` Ingo Molnar
2005-11-22  1:35 ` [PATCH 3/13] Time: Clocksource Infrastructure john stultz
2005-11-26 14:53   ` Ingo Molnar
2005-11-22  1:35 ` [PATCH 4/13] Time: Generic Timekeeping Infrastructure john stultz
2005-11-26 14:54   ` Ingo Molnar
2005-11-22  1:35 ` [PATCH 5/13] Time: i386 Conversion - part 1: Move timer_pit.c to i8253.c john stultz
2005-11-26 14:54   ` Ingo Molnar
2005-11-22  1:35 ` [PATCH 6/13] Time: i386 Conversion - part 2: Move timer_tsc.c to tsc.c john stultz
2005-11-26 14:54   ` Ingo Molnar
2005-11-22  1:36 ` [PATCH 7/13] Time: i386 Conversion - part 3: Rework TSC Support john stultz
2005-11-22  1:36 ` [PATCH 8/13] Time: i386 Conversion - part 4: ACPI PM variable renaming john stultz
2005-11-22  1:36 ` [PATCH 9/13] Time: i386 Conversion - part 5: Enable Generic Timekeeping john stultz
2005-11-26 14:55   ` Ingo Molnar
2005-11-22  1:36 ` [PATCH 10/13] Time: i386 Conversion - part 6: Remove Old Code john stultz
2005-11-22  1:36 ` [PATCH 11/13] Time: x86-64 Conversion to Generic Timekeeping john stultz
2005-11-26 14:55   ` Ingo Molnar
2005-11-26 15:11     ` Ingo Molnar
2005-11-22  1:36 ` [PATCH 12/13] Time: i386/x86-64 Clocksource Drivers john stultz
2005-11-26 14:55   ` Ingo Molnar
2005-11-22  1:36 ` [PATCH 13/13] Time: Generic Timekeeping Paraniod Debug Patch john stultz
2005-11-22  2:03 ` [PATCH 0/13] Time: Generic Timeofday Subsystem (v B11) john stultz
2005-11-26 14:50 ` Ingo Molnar
2005-11-26 14:58   ` Ingo Molnar
  -- strict thread matches above, loose matches on Subject: below --
2005-12-15  2:00 [PATCH 0/13] Time: Generic Timeofday Subsystem (v B14) john stultz
2005-12-15  2:00 ` [PATCH 1/13] Time: Reduced NTP rework (part 1) john stultz
2005-12-06  4:13 [PATCH 0/13] Time: Generic Timeofday Subsystem (v B13) john stultz
2005-12-06  4:13 ` [PATCH 1/13] Time: Reduced NTP rework (part 1) john stultz
2005-12-02  3:25 [PATCH 0/13] Time: Generic Timeofday Subsystem (v B12) john stultz
2005-12-02  3:25 ` [PATCH 1/13] Time: Reduced NTP rework (part 1) john stultz
2005-11-12  4:48 [PATCH 0/13] Time: Generic Timeofday Subsystem (v B10) john stultz
2005-11-12  4:48 ` [PATCH 1/13] Time: Reduced NTP rework (part 1) john stultz

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=20051126145243.GC12999@elte.hu \
    --to=mingo@elte.hu \
    --cc=dvhltc@us.ibm.com \
    --cc=frank@tuxrocks.com \
    --cc=george@mvista.com \
    --cc=johnstul@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nacc@us.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=ulrich.windl@rz.uni-regensburg.de \
    --cc=zippel@linux-m68k.org \
    /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

Powered by JetHome