public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH 0/6] xtime/wall_to_monotonic cleanups
@ 2010-06-05  2:53 John Stultz
  2010-06-05  2:53 ` [RFC][PATCH 1/6] powerpc: Simplify update_vsyscall John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel
  Cc: John Stultz, Martin Schwidefsky, Anton Blanchard, Paul Mackerras,
	Tony Luck, Thomas Gleixner, Jeff Dike

This patchset cleans up all the direct accesses to xtime
and wall_to_monotonic, allowing them to be made static
so we can do further cleanup and rework of the timekeeping
core.

This is 2.6.36 (or later) material. But I wanted to get 
the ball rolling.

Any feedback/testing would be greatly appreciated!

thanks
-john


John Stultz (6):
  powerpc: Simplify update_vsyscall
  powerpc: Cleanup xtime usage
  Fix update_vsyscall to provide wall_to_monotonic offset
  Convert um to use read_persistent_clock
  Cleanup hrtimer.c's direct access to wall_to_monotonic
  Make xtime and wall_to_monotonic static

CC: Martin Schwidefsky <schwidefsky@de.ibm.com>
CC: Anton Blanchard <anton@samba.org>
CC: Paul Mackerras <paulus@samba.org>
CC: Tony Luck <tony.luck@intel.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Jeff Dike <jdike@addtoit.com>

 Documentation/feature-removal-schedule.txt |   10 -----
 arch/ia64/kernel/time.c                    |    7 ++-
 arch/powerpc/kernel/time.c                 |   61 +++++++++++++---------------
 arch/s390/kernel/time.c                    |    8 ++--
 arch/um/kernel/time.c                      |   13 +++---
 arch/x86/kernel/vsyscall_64.c              |    6 +-
 include/linux/clocksource.h                |    6 ++-
 include/linux/time.h                       |    5 +-
 kernel/hrtimer.c                           |    9 ++--
 kernel/time/timekeeping.c                  |   18 ++++++--
 10 files changed, 69 insertions(+), 74 deletions(-)


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [RFC][PATCH 1/6] powerpc: Simplify update_vsyscall
  2010-06-05  2:53 [RFC][PATCH 0/6] xtime/wall_to_monotonic cleanups John Stultz
@ 2010-06-05  2:53 ` John Stultz
  2010-06-05  2:53   ` [RFC][PATCH 2/6] powerpc: Cleanup xtime usage John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel
  Cc: John Stultz, Anton Blanchard, Paul Mackerras, Thomas Gleixner

Currently powerpc's update_vsyscall calls an inline update_gtod.
However, both are straightforward, and there are no other users,
so this patch merges update_gtod into update_vsyscall.

Compiles, but otherwise untested.

Cc: Anton Blanchard <anton@samba.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 arch/powerpc/kernel/time.c |   55 ++++++++++++++++++++------------------------
 1 files changed, 25 insertions(+), 30 deletions(-)

diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 0441bbd..6fcd648 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -423,30 +423,6 @@ void udelay(unsigned long usecs)
 }
 EXPORT_SYMBOL(udelay);
 
-static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
-			       u64 new_tb_to_xs)
-{
-	/*
-	 * tb_update_count is used to allow the userspace gettimeofday code
-	 * to assure itself that it sees a consistent view of the tb_to_xs and
-	 * stamp_xsec variables.  It reads the tb_update_count, then reads
-	 * tb_to_xs and stamp_xsec and then reads tb_update_count again.  If
-	 * the two values of tb_update_count match and are even then the
-	 * tb_to_xs and stamp_xsec values are consistent.  If not, then it
-	 * loops back and reads them again until this criteria is met.
-	 * We expect the caller to have done the first increment of
-	 * vdso_data->tb_update_count already.
-	 */
-	vdso_data->tb_orig_stamp = new_tb_stamp;
-	vdso_data->stamp_xsec = new_stamp_xsec;
-	vdso_data->tb_to_xs = new_tb_to_xs;
-	vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
-	vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
-	vdso_data->stamp_xtime = xtime;
-	smp_wmb();
-	++(vdso_data->tb_update_count);
-}
-
 #ifdef CONFIG_SMP
 unsigned long profile_pc(struct pt_regs *regs)
 {
@@ -876,7 +852,7 @@ static cycle_t timebase_read(struct clocksource *cs)
 void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 		     u32 mult)
 {
-	u64 t2x, stamp_xsec;
+	u64 new_tb_to_xs, new_stamp_xsec;
 
 	if (clock != &clocksource_timebase)
 		return;
@@ -887,11 +863,30 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 
 	/* XXX this assumes clock->shift == 22 */
 	/* 4611686018 ~= 2^(20+64-22) / 1e9 */
-	t2x = (u64) mult * 4611686018ULL;
-	stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
-	do_div(stamp_xsec, 1000000000);
-	stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
-	update_gtod(clock->cycle_last, stamp_xsec, t2x);
+	new_tb_to_xs = (u64) mult * 4611686018ULL;
+	new_stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
+	do_div(new_stamp_xsec, 1000000000);
+	new_stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
+
+	/*
+	 * tb_update_count is used to allow the userspace gettimeofday code
+	 * to assure itself that it sees a consistent view of the tb_to_xs and
+	 * stamp_xsec variables.  It reads the tb_update_count, then reads
+	 * tb_to_xs and stamp_xsec and then reads tb_update_count again.  If
+	 * the two values of tb_update_count match and are even then the
+	 * tb_to_xs and stamp_xsec values are consistent.  If not, then it
+	 * loops back and reads them again until this criteria is met.
+	 * We expect the caller to have done the first increment of
+	 * vdso_data->tb_update_count already.
+	 */
+	vdso_data->tb_orig_stamp = clock->cycle_last;
+	vdso_data->stamp_xsec = new_stamp_xsec;
+	vdso_data->tb_to_xs = new_tb_to_xs;
+	vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
+	vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
+	vdso_data->stamp_xtime = xtime;
+	smp_wmb();
+	++(vdso_data->tb_update_count);
 }
 
 void update_vsyscall_tz(void)
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC][PATCH 2/6] powerpc: Cleanup xtime usage
  2010-06-05  2:53 ` [RFC][PATCH 1/6] powerpc: Simplify update_vsyscall John Stultz
@ 2010-06-05  2:53   ` John Stultz
  2010-06-05  2:53     ` [RFC][PATCH 3/6] Fix update_vsyscall to provide wall_to_monotonic offset John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel
  Cc: John Stultz, Paul Mackerras, Anton Blanchard, Thomas Gleixner

This removes powerpc's direct xtime usage, allowing for further
generic timeekeping cleanups

Compiled but otherwise untested.

Cc: Paul Mackerras <paulus@samba.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: Thomas Gleixner <tglx@linutronix.de>

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 arch/powerpc/kernel/time.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 6fcd648..0711d60 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -864,9 +864,9 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 	/* XXX this assumes clock->shift == 22 */
 	/* 4611686018 ~= 2^(20+64-22) / 1e9 */
 	new_tb_to_xs = (u64) mult * 4611686018ULL;
-	new_stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
+	new_stamp_xsec = (u64) wall_time->tv_nsec * XSEC_PER_SEC;
 	do_div(new_stamp_xsec, 1000000000);
-	new_stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
+	new_stamp_xsec += (u64) wall_time->tv_sec * XSEC_PER_SEC;
 
 	/*
 	 * tb_update_count is used to allow the userspace gettimeofday code
@@ -884,7 +884,7 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 	vdso_data->tb_to_xs = new_tb_to_xs;
 	vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
 	vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
-	vdso_data->stamp_xtime = xtime;
+	vdso_data->stamp_xtime = *wall_time;
 	smp_wmb();
 	++(vdso_data->tb_update_count);
 }
@@ -1093,7 +1093,7 @@ void __init time_init(void)
 	vdso_data->tb_orig_stamp = tb_last_jiffy;
 	vdso_data->tb_update_count = 0;
 	vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
-	vdso_data->stamp_xsec = (u64) xtime.tv_sec * XSEC_PER_SEC;
+	vdso_data->stamp_xsec = (u64) get_seconds() * XSEC_PER_SEC;
 	vdso_data->tb_to_xs = tb_to_xs;
 
 	write_sequnlock_irqrestore(&xtime_lock, flags);
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC][PATCH 3/6] Fix update_vsyscall to provide wall_to_monotonic offset
  2010-06-05  2:53   ` [RFC][PATCH 2/6] powerpc: Cleanup xtime usage John Stultz
@ 2010-06-05  2:53     ` John Stultz
  2010-06-05  2:53       ` [RFC][PATCH 4/6] Convert um to use read_persistent_clock John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel
  Cc: John Stultz, Martin Schwidefsky, Anton Blanchard, Paul Mackerras,
	Tony Luck, Thomas Gleixner

update_vsyscall() did not provide the wall_to_monotoinc offset,
so arch specific implementations tend to reference wall_to_monotonic
directly. This limits future cleanups in the timekeeping core, so
this patch fixes the update_vsyscall interface to provide
wall_to_monotonic, allowing wall_to_monotonic to be made static
as planned in Documentation/feature-removal-schedule.txt

Signed-off-by: John Stultz <johnstul@us.ibm.com>
CC: Martin Schwidefsky <schwidefsky@de.ibm.com>
CC: Anton Blanchard <anton@samba.org>
CC: Paul Mackerras <paulus@samba.org>
CC: Tony Luck <tony.luck@intel.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 arch/ia64/kernel/time.c       |    7 ++++---
 arch/powerpc/kernel/time.c    |    8 ++++----
 arch/s390/kernel/time.c       |    8 ++++----
 arch/x86/kernel/vsyscall_64.c |    6 +++---
 include/linux/clocksource.h   |    6 ++++--
 kernel/time/timekeeping.c     |    9 ++++++---
 6 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
index 653b3c4..ed6f22e 100644
--- a/arch/ia64/kernel/time.c
+++ b/arch/ia64/kernel/time.c
@@ -471,7 +471,8 @@ void update_vsyscall_tz(void)
 {
 }
 
-void update_vsyscall(struct timespec *wall, struct clocksource *c, u32 mult)
+void update_vsyscall(struct timespec *wall, struct timespec *wtm,
+			struct clocksource *c, u32 mult)
 {
         unsigned long flags;
 
@@ -487,9 +488,9 @@ void update_vsyscall(struct timespec *wall, struct clocksource *c, u32 mult)
 	/* copy kernel time structures */
         fsyscall_gtod_data.wall_time.tv_sec = wall->tv_sec;
         fsyscall_gtod_data.wall_time.tv_nsec = wall->tv_nsec;
-        fsyscall_gtod_data.monotonic_time.tv_sec = wall_to_monotonic.tv_sec
+	fsyscall_gtod_data.monotonic_time.tv_sec = wtm->tv_sec
 							+ wall->tv_sec;
-        fsyscall_gtod_data.monotonic_time.tv_nsec = wall_to_monotonic.tv_nsec
+	fsyscall_gtod_data.monotonic_time.tv_nsec = wtm->tv_nsec
 							+ wall->tv_nsec;
 
 	/* normalize */
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 0711d60..e215f76 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -849,8 +849,8 @@ static cycle_t timebase_read(struct clocksource *cs)
 	return (cycle_t)get_tb();
 }
 
-void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
-		     u32 mult)
+void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
+			struct clocksource *clock, u32 mult)
 {
 	u64 new_tb_to_xs, new_stamp_xsec;
 
@@ -882,8 +882,8 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 	vdso_data->tb_orig_stamp = clock->cycle_last;
 	vdso_data->stamp_xsec = new_stamp_xsec;
 	vdso_data->tb_to_xs = new_tb_to_xs;
-	vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
-	vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
+	vdso_data->wtom_clock_sec = wtm->tv_sec;
+	vdso_data->wtom_clock_nsec = wtm->tv_nsec;
 	vdso_data->stamp_xtime = *wall_time;
 	smp_wmb();
 	++(vdso_data->tb_update_count);
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
index a2163c9..aeb30c6 100644
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@ -207,8 +207,8 @@ struct clocksource * __init clocksource_default_clock(void)
 	return &clocksource_tod;
 }
 
-void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
-		     u32 mult)
+void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
+			struct clocksource *clock, u32 mult)
 {
 	if (clock != &clocksource_tod)
 		return;
@@ -219,8 +219,8 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 	vdso_data->xtime_tod_stamp = clock->cycle_last;
 	vdso_data->xtime_clock_sec = wall_time->tv_sec;
 	vdso_data->xtime_clock_nsec = wall_time->tv_nsec;
-	vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
-	vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
+	vdso_data->wtom_clock_sec = wtm->tv_sec;
+	vdso_data->wtom_clock_nsec = wtm->tv_nsec;
 	vdso_data->ntp_mult = mult;
 	smp_wmb();
 	++vdso_data->tb_update_count;
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 1c0c6ab..3499be3 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -73,8 +73,8 @@ void update_vsyscall_tz(void)
 	write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
 }
 
-void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
-		     u32 mult)
+void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
+			struct clocksource *clock, u32 mult)
 {
 	unsigned long flags;
 
@@ -87,7 +87,7 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
 	vsyscall_gtod_data.clock.shift = clock->shift;
 	vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec;
 	vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec;
-	vsyscall_gtod_data.wall_to_monotonic = wall_to_monotonic;
+	vsyscall_gtod_data.wall_to_monotonic = *wtm;
 	vsyscall_gtod_data.wall_time_coarse = __current_kernel_time();
 	write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
 }
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index 5ea3c60..21677d9 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -313,11 +313,13 @@ clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec)
 
 #ifdef CONFIG_GENERIC_TIME_VSYSCALL
 extern void
-update_vsyscall(struct timespec *ts, struct clocksource *c, u32 mult);
+update_vsyscall(struct timespec *ts, struct timespec *wtm,
+			struct clocksource *c, u32 mult);
 extern void update_vsyscall_tz(void);
 #else
 static inline void
-update_vsyscall(struct timespec *ts, struct clocksource *c, u32 mult)
+update_vsyscall(struct timespec *ts, struct timespec *wtm,
+			struct clocksource *c, u32 mult)
 {
 }
 
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index caf8d4d..fdfdeb6 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -170,7 +170,8 @@ void timekeeping_leap_insert(int leapsecond)
 {
 	xtime.tv_sec += leapsecond;
 	wall_to_monotonic.tv_sec -= leapsecond;
-	update_vsyscall(&xtime, timekeeper.clock, timekeeper.mult);
+	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
+			timekeeper.mult);
 }
 
 #ifdef CONFIG_GENERIC_TIME
@@ -328,7 +329,8 @@ int do_settimeofday(struct timespec *tv)
 	timekeeper.ntp_error = 0;
 	ntp_clear();
 
-	update_vsyscall(&xtime, timekeeper.clock, timekeeper.mult);
+	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
+				timekeeper.mult);
 
 	write_sequnlock_irqrestore(&xtime_lock, flags);
 
@@ -856,7 +858,8 @@ void update_wall_time(void)
 	}
 
 	/* check to see if there is a new clocksource to use */
-	update_vsyscall(&xtime, timekeeper.clock, timekeeper.mult);
+	update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
+				timekeeper.mult);
 }
 
 /**
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC][PATCH 4/6] Convert um to use read_persistent_clock
  2010-06-05  2:53     ` [RFC][PATCH 3/6] Fix update_vsyscall to provide wall_to_monotonic offset John Stultz
@ 2010-06-05  2:53       ` John Stultz
  2010-06-05  2:53         ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel; +Cc: John Stultz, Jeff Dike, Thomas Gleixner

This patch converts the um arch to use read_persistent_clock().
This allows it to avoid accessing xtime and wall_to_monotonic
directly.

This patch is un-tested, so any help by testers or maintainers would
be greatly appreciated!

Signed-off-by: John Stultz <johnstul@us.ibm.com>
CC: Jeff Dike <jdike@addtoit.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 arch/um/kernel/time.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index c8b9c46..2b8b262 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -102,16 +102,17 @@ static void __init setup_itimer(void)
 	clockevents_register_device(&itimer_clockevent);
 }
 
+void read_persistent_clock(struct timespec *ts)
+{
+	nsecs = os_nsecs();
+	set_normalized_timespec(ts, nsecs / NSEC_PER_SEC,
+				nsecs % NSEC_PER_SEC);
+}
+
 void __init time_init(void)
 {
 	long long nsecs;
 
 	timer_init();
-
-	nsecs = os_nsecs();
-	set_normalized_timespec(&wall_to_monotonic, -nsecs / NSEC_PER_SEC,
-				-nsecs % NSEC_PER_SEC);
-	set_normalized_timespec(&xtime, nsecs / NSEC_PER_SEC,
-				nsecs % NSEC_PER_SEC);
 	late_time_init = setup_itimer;
 }
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic
  2010-06-05  2:53       ` [RFC][PATCH 4/6] Convert um to use read_persistent_clock John Stultz
@ 2010-06-05  2:53         ` John Stultz
  2010-06-05  2:53           ` [RFC][PATCH 6/6] Make xtime and wall_to_monotonic static John Stultz
  2010-06-05 10:23           ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic Arnd Bergmann
  0 siblings, 2 replies; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel; +Cc: John Stultz, Thomas Gleixner

Provides an accessor function to replace hrtimer.c's
direct access of wall_to_monotonic.

This will allow wall_to_monotonic to be made static as
planned in Documentation/feature-removal-schedule.txt

Signed-off-by: John Stultz <johnstul@us.ibm.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 include/linux/time.h      |    3 ++-
 kernel/hrtimer.c          |    9 ++++-----
 kernel/time/timekeeping.c |    5 +++++
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/include/linux/time.h b/include/linux/time.h
index ea3559f..d18edd8 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -110,7 +110,8 @@ extern int timekeeping_suspended;
 
 unsigned long get_seconds(void);
 struct timespec current_kernel_time(void);
-struct timespec __current_kernel_time(void); /* does not hold xtime_lock */
+struct timespec __current_kernel_time(void); /* does not take xtime_lock */
+struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */
 struct timespec get_monotonic_coarse(void);
 
 #define CURRENT_TIME		(current_kernel_time())
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 5c69e99..809f48c 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -90,7 +90,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)
 	do {
 		seq = read_seqbegin(&xtime_lock);
 		xts = __current_kernel_time();
-		tom = wall_to_monotonic;
+		tom = __get_wall_to_monotonic();
 	} while (read_seqretry(&xtime_lock, seq));
 
 	xtim = timespec_to_ktime(xts);
@@ -612,7 +612,7 @@ static int hrtimer_reprogram(struct hrtimer *timer,
 static void retrigger_next_event(void *arg)
 {
 	struct hrtimer_cpu_base *base;
-	struct timespec realtime_offset;
+	struct timespec realtime_offset, wtm;
 	unsigned long seq;
 
 	if (!hrtimer_hres_active())
@@ -620,10 +620,9 @@ static void retrigger_next_event(void *arg)
 
 	do {
 		seq = read_seqbegin(&xtime_lock);
-		set_normalized_timespec(&realtime_offset,
-					-wall_to_monotonic.tv_sec,
-					-wall_to_monotonic.tv_nsec);
+		wtm = __get_wall_to_monotonic();
 	} while (read_seqretry(&xtime_lock, seq));
+	set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec);
 
 	base = &__get_cpu_var(hrtimer_bases);
 
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index fdfdeb6..8600218 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -905,6 +905,11 @@ struct timespec __current_kernel_time(void)
 	return xtime;
 }
 
+struct timespec __get_wall_to_monotonic(void)
+{
+	return wall_to_monotonic;
+}
+
 struct timespec current_kernel_time(void)
 {
 	struct timespec now;
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [RFC][PATCH 6/6] Make xtime and wall_to_monotonic static
  2010-06-05  2:53         ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic John Stultz
@ 2010-06-05  2:53           ` John Stultz
  2010-06-05 10:23           ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic Arnd Bergmann
  1 sibling, 0 replies; 9+ messages in thread
From: John Stultz @ 2010-06-05  2:53 UTC (permalink / raw)
  To: linux-kernel; +Cc: John Stultz, Thomas Gleixner

This patch makes xtime and wall_to_monotonic static, as planned in
Documentation/feature-removal-schedule.txt. This will allow for
further cleanups to the timekeeping core.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 Documentation/feature-removal-schedule.txt |   10 ----------
 include/linux/time.h                       |    2 --
 kernel/time/timekeeping.c                  |    4 ++--
 3 files changed, 2 insertions(+), 14 deletions(-)

diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
index c268783..0d91c6b 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -549,16 +549,6 @@ Who:	Avi Kivity <avi@redhat.com>
 
 ----------------------------
 
-What:	xtime, wall_to_monotonic
-When:	2.6.36+
-Files:	kernel/time/timekeeping.c include/linux/time.h
-Why:	Cleaning up timekeeping internal values. Please use
-	existing timekeeping accessor functions to access
-	the equivalent functionality.
-Who:	John Stultz <johnstul@us.ibm.com>
-
-----------------------------
-
 What:	KVM kernel-allocated memory slots
 When:	July 2010
 Why:	Since 2.6.25, kvm supports user-allocated memory slots, which are
diff --git a/include/linux/time.h b/include/linux/time.h
index d18edd8..3d03d79 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -97,8 +97,6 @@ static inline struct timespec timespec_sub(struct timespec lhs,
 #define timespec_valid(ts) \
 	(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
 
-extern struct timespec xtime;
-extern struct timespec wall_to_monotonic;
 extern seqlock_t xtime_lock;
 
 extern void read_persistent_clock(struct timespec *ts);
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 8600218..a68297a 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -153,8 +153,8 @@ __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
  * - wall_to_monotonic is no longer the boot time, getboottime must be
  * used instead.
  */
-struct timespec xtime __attribute__ ((aligned (16)));
-struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
+static struct timespec xtime __attribute__ ((aligned (16)));
+static struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
 static struct timespec total_sleep_time;
 
 /*
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic
  2010-06-05  2:53         ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic John Stultz
  2010-06-05  2:53           ` [RFC][PATCH 6/6] Make xtime and wall_to_monotonic static John Stultz
@ 2010-06-05 10:23           ` Arnd Bergmann
  2010-06-05 18:01             ` john stultz
  1 sibling, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2010-06-05 10:23 UTC (permalink / raw)
  To: John Stultz; +Cc: linux-kernel, Thomas Gleixner

On Saturday 05 June 2010, John Stultz wrote:
>         do {
>                 seq = read_seqbegin(&xtime_lock);
>                 xts = __current_kernel_time();
> -               tom = wall_to_monotonic;
> +               tom = __get_wall_to_monotonic();
>         } while (read_seqretry(&xtime_lock, seq));
>  

Would it make sense to also limit the use of xtime_lock to the
timekeeping code? I suppose you could merge the various accessors
(current_kernel_time, get_monotonic_coarse, __current_kernel_time,
__get_wall_to_monotonic) with a single function doing

struct timespec current_kernel_time(struct timespec *tomono)
{
        struct timespec now;
        unsigned long seq;

        do {
                seq = read_seqbegin(&xtime_lock);
		if (tomono)
			wall_to_monotonic;
                now = xtime;
        } while (read_seqretry(&xtime_lock, seq));

        return now;
}

	Arnd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic
  2010-06-05 10:23           ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic Arnd Bergmann
@ 2010-06-05 18:01             ` john stultz
  0 siblings, 0 replies; 9+ messages in thread
From: john stultz @ 2010-06-05 18:01 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linux-kernel, Thomas Gleixner

On Sat, 2010-06-05 at 12:23 +0200, Arnd Bergmann wrote:
> On Saturday 05 June 2010, John Stultz wrote:
> >         do {
> >                 seq = read_seqbegin(&xtime_lock);
> >                 xts = __current_kernel_time();
> > -               tom = wall_to_monotonic;
> > +               tom = __get_wall_to_monotonic();
> >         } while (read_seqretry(&xtime_lock, seq));
> >  
> 
> Would it make sense to also limit the use of xtime_lock to the
> timekeeping code? I suppose you could merge the various accessors
> (current_kernel_time, get_monotonic_coarse, __current_kernel_time,
> __get_wall_to_monotonic) with a single function doing

Yep. I hope to keep chipping at it to get there. 

However xtime_lock protects a bit more then just the timekeeping
internals, and its currently not limiting the rework I'm hoping to do
with the timekeeping internal structures. So little bits at a time. :)

thanks
-john





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2010-06-05 18:01 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-05  2:53 [RFC][PATCH 0/6] xtime/wall_to_monotonic cleanups John Stultz
2010-06-05  2:53 ` [RFC][PATCH 1/6] powerpc: Simplify update_vsyscall John Stultz
2010-06-05  2:53   ` [RFC][PATCH 2/6] powerpc: Cleanup xtime usage John Stultz
2010-06-05  2:53     ` [RFC][PATCH 3/6] Fix update_vsyscall to provide wall_to_monotonic offset John Stultz
2010-06-05  2:53       ` [RFC][PATCH 4/6] Convert um to use read_persistent_clock John Stultz
2010-06-05  2:53         ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic John Stultz
2010-06-05  2:53           ` [RFC][PATCH 6/6] Make xtime and wall_to_monotonic static John Stultz
2010-06-05 10:23           ` [RFC][PATCH 5/6] Cleanup hrtimer.c's direct access to wall_to_monotonic Arnd Bergmann
2010-06-05 18:01             ` john stultz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox