Skip to contentSkip to conversation

Move NTP related code to ntp.c

RFC In review john stultz 3 participants 5 messages Jul 13, 2006 Timekeeping, clocksource core, NTP, alarmtimer

lore
Share & tools
lore
#0 lore raw

RFC 1/1 Move NTP related code to ntp.c

Hey all,
I know I've been moving a bit slowly, but I wanted to get my current
tree out there so folks could see where I'm heading w/ the timekeeping code now that the largest chunk of logical changes has landed.

You can find the current version (C3 against 2.6.18-rc1) of the timekeeping tree here: http://sr71.net/~jstultz/tod/

Basically it consists of a few cleanup patches, a paranoid debug patch, and the x86-64 and ppc conversion patches as well.

On the TODO list:
o Breakup the x86-64 patch and get it -mm bound.
o ia64 patch from Peter Keilty in the works
o I need to dig up the ARM patches that hit the list awhile back.
o Rewrite the ktime_t interfaces patch.

Anyway, here is the first of those cleanups I'd like to push soon-ish. It just simply moves all of the NTP related code and interfaces from kernel/timer.c and kernel/time.c into kernel/time/ntp.c. There is still a bunch of NTP cleanups to be done to the code (Now that we have decent interfaces we can static the global variables, make do_adjtimex readable, etc), but this is the first step.

Roman: I know you had some larger NTP changes (getting rid of update_ntp_one_tick() for second-interval adjustments, etc). Are they still around?

Anyway, comments or feedback would be appreciated.

thanks
-john

 include/linux/timex.h |    2 
 kernel/time.c         |  173 ---------------------
 kernel/time/Makefile  |    2 
 kernel/time/ntp.c     |  396 ++++++++++++++++++++++++++++++++++++++++++++++++++
 kernel/timer.c        |  203 -------------------------
 5 files changed, 399 insertions(+), 377 deletions(-)

linux-2.6.18-rc1_timeofday-ntp-cleanup_C3.patch
============================================

include/linux/timex.h +2 -0
index 19bb653..73b9cd2 100644
@@ -308,6 +308,8 @@ time_interpolator_reset(void)
 /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */
 extern u64 current_tick_length(void);
 
+extern void second_overflow(void);
+extern void update_ntp_one_tick(void);
 extern int do_adjtimex(struct timex *);
 
 #endif /* KERNEL */
kernel/time.c +0 -173

179 lines not on this page · raw message

kernel/time/Makefile +1 -1
index e1dfd8e..61a3907 100644
@@ -1 +1 @@
-obj-y += clocksource.o jiffies.o
+obj-y += ntp.o clocksource.o jiffies.o
kernel/time/ntp.c new file +396 -0

396 lines not on this page · raw message

kernel/timer.c +0 -203

209 lines not on this page · raw message

#1 lore raw

RFC PATCH 1/1 Kill i386 references to xtime

All,
Just another cleanup patch from the C3 timekeeping tree (which you can
find here: http://sr71.net/~jstultz/tod/ ) I wanted to RFC.

This patch kills all xtime references in i386 and replaces them with proper settimeofday()/gettimeofday() calls.

I'm not sure the APM changes are 100% right, as that code is very muddled (take the i8253_lock before calling reinit_timer, which would take the i8253_lock again and hang if it weren't ifdef'ed out!).

Anyway, testing, feedback or comments would be appreciated!

thanks
-john

 apm.c  |   17 +++++------------
 time.c |   26 +++++++++++++++-----------
 2 files changed, 20 insertions(+), 23 deletions(-)

linux-2.6.18-rc1_timeofday-i386-xtime-removal_C3.patch
============================================

arch/i386/kernel/apm.c +5 -12
index 8591f2f..95dfa7c 100644
@@ -1154,9 +1154,11 @@ out:
 
 static void set_time(void)
 {
+	struct timespec ts;
 	if (got_clock_diff) {	/* Must know time zone in order to set clock */
-		xtime.tv_sec = get_cmos_time() + clock_cmos_diff;
-		xtime.tv_nsec = 0; 
+		ts.tv_sec = get_cmos_time() + clock_cmos_diff;
+		ts.tv_nsec = 0;
+		do_settimeofday(&ts);
 	} 
 }
 
@@ -1232,13 +1234,8 @@ static int suspend(int vetoable)
 	restore_processor_state();
 
 	local_irq_disable();
-	write_seqlock(&xtime_lock);
-	spin_lock(&i8253_lock);
-	reinit_timer();
 	set_time();
-
-	spin_unlock(&i8253_lock);
-	write_sequnlock(&xtime_lock);
+	reinit_timer();
 
 	if (err == APM_NO_ERROR)
 		err = APM_SUCCESS;
@@ -1365,9 +1362,7 @@ static void check_events(void)
 			ignore_bounce = 1;
 			if ((event != APM_NORMAL_RESUME)
 			    || (ignore_normal_resume == 0)) {
-				write_seqlock_irq(&xtime_lock);
 				set_time();
-				write_sequnlock_irq(&xtime_lock);
 				device_resume();
 				pm_send_all(PM_RESUME, (void *)0);
 				queue_event(event, NULL);
@@ -1383,9 +1378,7 @@ static void check_events(void)
 			break;
 
 		case APM_UPDATE_TIME:
-			write_seqlock_irq(&xtime_lock);
 			set_time();
-			write_sequnlock_irq(&xtime_lock);
 			break;
 
 		case APM_CRITICAL_SUSPEND:
arch/i386/kernel/time.c +15 -11
index 8705c0f..1e14ba6 100644
@@ -288,7 +288,7 @@ static int timer_resume(struct sys_devic
 	unsigned long flags;
 	unsigned long sec;
 	unsigned long sleep_length;
-
+	struct timespec ts;
 #ifdef CONFIG_HPET_TIMER
 	if (is_hpet_enabled())
 		hpet_reenable();
@@ -296,9 +296,11 @@ static int timer_resume(struct sys_devic
 	setup_pit_timer();
 	sec = get_cmos_time() + clock_cmos_diff;
 	sleep_length = (get_cmos_time() - sleep_start) * HZ;
+
+	ts.tv_sec = sec;
+	ts.tv_nsec = 0;
+	do_settimeofday(&ts);
 	write_seqlock_irqsave(&xtime_lock, flags);
-	xtime.tv_sec = sec;
-	xtime.tv_nsec = 0;
 	jiffies_64 += sleep_length;
 	wall_jiffies += sleep_length;
 	write_sequnlock_irqrestore(&xtime_lock, flags);
@@ -334,10 +336,11 @@ extern void (*late_time_init)(void);
 /* Duplicate of time_init() below, with hpet_enable part added */
 static void __init hpet_time_init(void)
 {
-	xtime.tv_sec = get_cmos_time();
-	xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-	set_normalized_timespec(&wall_to_monotonic,
-		-xtime.tv_sec, -xtime.tv_nsec);
+	struct timespec ts;
+	ts.tv_sec = get_cmos_time();
+	ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
+
+	do_settimeofday(&ts);
 
 	if ((hpet_enable() >= 0) && hpet_use_timer) {
 		printk("Using HPET for base-timer\n");
@@ -349,6 +352,7 @@ static void __init hpet_time_init(void)
 
 void __init time_init(void)
 {
+	struct timespec ts;
 #ifdef CONFIG_HPET_TIMER
 	if (is_hpet_capable()) {
 		/*
@@ -359,10 +363,10 @@ void __init time_init(void)
 		return;
 	}
 #endif
-	xtime.tv_sec = get_cmos_time();
-	xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-	set_normalized_timespec(&wall_to_monotonic,
-		-xtime.tv_sec, -xtime.tv_nsec);
+	ts.tv_sec = get_cmos_time();
+	ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
+
+	do_settimeofday(&ts);
 
 	time_init_hook();
 }
Acked-by on v1 1/1
#2 lore raw

Re: [RFC][PATCH] Kill i386 references to xtime

Quoted 10 lines · john stultz

All,
Just another cleanup patch from the C3 timekeeping tree (which you can
find here: http://sr71.net/~jstultz/tod/ ) I wanted to RFC.

This patch kills all xtime references in i386 and replaces them with proper settimeofday()/gettimeofday() calls.

I'm not sure the APM changes are 100% right, as that code is very muddled (take the i8253_lock before calling reinit_timer, which would take the i8253_lock again and hang if it weren't ifdef'ed out!).

yeah, that code looks very suspect.

Quoted 1 line

Anyway, testing, feedback or comments would be appreciated!

These cleanups look good to me. I gave your patch a testrun on a lockdep-enabled allyesconfig bzImage kernel on i686, and there are no apprent problems - it booted up just fine.

Ingo

#3 lore raw
In reply to john stultz
Quoted 4 lines · john stultz

Hey all,
I know I've been moving a bit slowly, but I wanted to get my current
tree out there so folks could see where I'm heading w/ the timekeeping code now that the largest chunk of logical changes has landed.

looks good to me! A few minor nits:

Quoted 1 line

+ * This code was mainly moved from kernel/timer.c and kerenl/time.c

s/kerenl/kernel

Quoted 1 line

+ * Please see those files for relavent copyright info and historical

s/relavent/relevant

Quoted 9 lines

+/*
+ * this routine handles the overflow of the microsecond field
+ *
+ * The tricky bits of code to handle the accurate clock support
+ * were provided by Dave Mills ([email protected]) of NTP fame.
+ * They were originally developed for SUN and DEC kernels.
+ * All the kudos should go to Dave for this stuff.
+ *
+ */

remove the extra empty ' *' line above.

kernel/time/ntp.c line 238

Quoted 6 lines
kernel/time/ntp.c new file +6 -0
+/* adjtimex mainly allows reading (and writing, if superuser) of
+ * kernel time-keeping variables. used by xntpd.
+ */
+int do_adjtimex(struct timex *txc)
+{
+        long ltemp, mtemp, save_adjust;

whitespace damage.

suggestion for future cleanups: this function (do_adjtimex()) should be cleaned up further to conform to the kernel coding style standard. (currently it has 4-space tabs, etc.) I did that before - maybe some of those cleanups still apply?

[obviously that cleanup shouldnt be part of this move-the-code patch.]

Ingo

#4 lore raw
In reply to john stultz

Hi,

Quoted 3 lines · john stultz

Roman: I know you had some larger NTP changes (getting rid of update_ntp_one_tick() for second-interval adjustments, etc). Are they still around?

I updated them and currently test them, so please hold back with larger reformating changes, otherwise the patch looks fine.

bye, Roman