All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/3] timekeeping: Add persistent_clock_exist flag
@ 2013-01-15 16:09 Feng Tang
  2013-01-15 16:09 ` [PATCH v2 2/3] rtc: Skip the suspend/resume handling if persistent clock exist Feng Tang
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Feng Tang @ 2013-01-15 16:09 UTC (permalink / raw)
  To: John Stultz, Thomas Gleixner, Alessandro Zummo, linux-kernel
  Cc: Jason Gunthorpe, Feng Tang

In current kernel, there are several places which need to check
whether there is a persistent clock for the platform. Current check
is done by calling the read_persistent_clock() and validating its
return value.

So one optimization is to do the check only once in timekeeping_init(),
and use a flag persistent_clock_exist to record it.

v2: Add a has_persistent_clock() helper function, as suggested by John.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: John Stultz <john.stultz@linaro.org>
Signed-off-by: Feng Tang <feng.tang@intel.com>
---
 include/linux/time.h      |    6 ++++++
 kernel/time/timekeeping.c |   16 +++++++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/include/linux/time.h b/include/linux/time.h
index 4d358e9..2f58603 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -115,6 +115,12 @@ static inline bool timespec_valid_strict(const struct timespec *ts)
 	return true;
 }
 
+extern bool persistent_clock_exist;
+static inline bool has_persistent_clock(void)
+{
+	return persistent_clock_exist;
+}
+
 extern void read_persistent_clock(struct timespec *ts);
 extern void read_boot_clock(struct timespec *ts);
 extern int update_persistent_clock(struct timespec now);
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index cbc6acb..2fd3aed 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -29,6 +29,9 @@ static struct timekeeper timekeeper;
 /* flag for if timekeeping is suspended */
 int __read_mostly timekeeping_suspended;
 
+/* Flag for if there is a persistent clock on this platform */
+bool __read_mostly persistent_clock_exist = false;
+
 static inline void tk_normalize_xtime(struct timekeeper *tk)
 {
 	while (tk->xtime_nsec >= ((u64)NSEC_PER_SEC << tk->shift)) {
@@ -640,12 +643,14 @@ void __init timekeeping_init(void)
 	struct timespec now, boot, tmp;
 
 	read_persistent_clock(&now);
+
 	if (!timespec_valid_strict(&now)) {
 		pr_warn("WARNING: Persistent clock returned invalid value!\n"
 			"         Check your CMOS/BIOS settings.\n");
 		now.tv_sec = 0;
 		now.tv_nsec = 0;
-	}
+	} else if (now.tv_sec || now.tv_nsec)
+		persistent_clock_exist = true;
 
 	read_boot_clock(&boot);
 	if (!timespec_valid_strict(&boot)) {
@@ -718,11 +723,12 @@ void timekeeping_inject_sleeptime(struct timespec *delta)
 {
 	struct timekeeper *tk = &timekeeper;
 	unsigned long flags;
-	struct timespec ts;
 
-	/* Make sure we don't set the clock twice */
-	read_persistent_clock(&ts);
-	if (!(ts.tv_sec == 0 && ts.tv_nsec == 0))
+	/*
+	 * Make sure we don't set the clock twice, as timekeeping_resume()
+	 * already did it
+	 */
+	if (has_persistent_clock())
 		return;
 
 	write_seqlock_irqsave(&tk->lock, flags);
-- 
1.7.9.5


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

end of thread, other threads:[~2013-01-26  1:08 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-15 16:09 [PATCH v2 1/3] timekeeping: Add persistent_clock_exist flag Feng Tang
2013-01-15 16:09 ` [PATCH v2 2/3] rtc: Skip the suspend/resume handling if persistent clock exist Feng Tang
2013-01-15 19:49   ` John Stultz
2013-01-15 16:09 ` [PATCH v2 3/3] timekeeping: Add CONFIG_HAS_PERSISTENT_CLOCK option Feng Tang
2013-01-15 19:50   ` John Stultz
2013-01-22 19:44     ` Jason Gunthorpe
2013-01-22 19:49       ` John Stultz
2013-01-26  1:07         ` John Stultz
2013-01-15 19:48 ` [PATCH v2 1/3] timekeeping: Add persistent_clock_exist flag John Stultz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.