linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6
@ 2012-09-18  2:32 John Stultz
  2012-09-18  2:32 ` [PATCH 1/3] 2.6.32.y: time: Improve sanity checking of timekeeping inputs John Stultz
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: John Stultz @ 2012-09-18  2:32 UTC (permalink / raw)
  To: stable; +Cc: John Stultz, Prarit Bhargava, Thomas Gleixner, Linux Kernel

Just wanted to send out a few timekeeping fixes that were merged
in 3.6 which are appropriate for -stable.

This queue backports the following fixes:
-----------------------------------------
cee58483cf56e0ba355fdd97ff5e8925329aa936    time: Move ktime_t overflow checking into timespec_valid_strict
bf2ac312195155511a0f79325515cbb61929898a    time: Avoid making adjustments if we haven't accumulated anything
4e8b14526ca7fb046a81c94002c1c43b6fdf0e9b    time: Improve sanity checking of timekeeping inputs

I've run these through my timetest suite w/ kvm on both i386
& x86_64. But more testing would be of course appreciated.
	https://github.com/johnstultz-work/timetests

This is the last of what I've backported.

Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>

John Stultz (3):
  2.6.32.y: time: Improve sanity checking of timekeeping inputs
  2.6.32.y: time: Avoid making adjustments if we haven't accumulated
    anything
  2.6.32.y: time: Move ktime_t overflow checking into
    timespec_valid_strict

 include/linux/ktime.h     |    7 -------
 include/linux/time.h      |   29 +++++++++++++++++++++++++++--
 kernel/time/timekeeping.c |   19 ++++++++++++++++++-
 3 files changed, 45 insertions(+), 10 deletions(-)

-- 
1.7.9.5


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

* [PATCH 1/3] 2.6.32.y: time: Improve sanity checking of timekeeping inputs
  2012-09-18  2:32 [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
@ 2012-09-18  2:32 ` John Stultz
  2012-09-18  2:32 ` [PATCH 2/3] 2.6.32.y: time: Avoid making adjustments if we haven't accumulated anything John Stultz
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: John Stultz @ 2012-09-18  2:32 UTC (permalink / raw)
  To: stable
  Cc: John Stultz, Peter Zijlstra, Prarit Bhargava, Zhouping Liu,
	Ingo Molnar, Thomas Gleixner, Linux Kernel

This is a -stable backport of 4e8b14526ca7fb046a81c94002c1c43b6fdf0e9b

Unexpected behavior could occur if the time is set to a value large
enough to overflow a 64bit ktime_t (which is something larger then the
year 2262).

Also unexpected behavior could occur if large negative offsets are
injected via adjtimex.

So this patch improves the sanity check timekeeping inputs by
improving the timespec_valid() check, and then makes better use of
timespec_valid() to make sure we don't set the time to an invalid
negative value or one that overflows ktime_t.

Note: This does not protect from setting the time close to overflowing
ktime_t and then letting natural accumulation cause the overflow.

Reported-by: CAI Qian <caiqian@redhat.com>
Reported-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Zhouping Liu <zliu@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/1344454580-17031-1-git-send-email-john.stultz@linaro.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
 include/linux/ktime.h     |    7 -------
 include/linux/time.h      |   22 ++++++++++++++++++++--
 kernel/time/timekeeping.c |   15 ++++++++++++++-
 3 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/include/linux/ktime.h b/include/linux/ktime.h
index ce59832..ecdf64e 100644
--- a/include/linux/ktime.h
+++ b/include/linux/ktime.h
@@ -58,13 +58,6 @@ union ktime {
 
 typedef union ktime ktime_t;		/* Kill this */
 
-#define KTIME_MAX			((s64)~((u64)1 << 63))
-#if (BITS_PER_LONG == 64)
-# define KTIME_SEC_MAX			(KTIME_MAX / NSEC_PER_SEC)
-#else
-# define KTIME_SEC_MAX			LONG_MAX
-#endif
-
 /*
  * ktime_t definitions when using the 64-bit scalar representation:
  */
diff --git a/include/linux/time.h b/include/linux/time.h
index 6e026e4..146b6f3 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -91,11 +91,29 @@ static inline struct timespec timespec_sub(struct timespec lhs,
 	return ts_delta;
 }
 
+#define KTIME_MAX			((s64)~((u64)1 << 63))
+#if (BITS_PER_LONG == 64)
+# define KTIME_SEC_MAX			(KTIME_MAX / NSEC_PER_SEC)
+#else
+# define KTIME_SEC_MAX			LONG_MAX
+#endif
+
 /*
  * Returns true if the timespec is norm, false if denorm:
  */
-#define timespec_valid(ts) \
-	(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
+static inline bool timespec_valid(const struct timespec *ts)
+{
+	/* Dates before 1970 are bogus */
+	if (ts->tv_sec < 0)
+		return false;
+	/* Can't have more nanoseconds then a second */
+	if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
+		return false;
+	/* Disallow values that could overflow ktime_t */
+	if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
+		return false;
+	return true;
+}
 
 extern struct timespec xtime;
 extern struct timespec wall_to_monotonic;
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 3f7e53f..85d51c4 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -354,7 +354,7 @@ int do_settimeofday(struct timespec *tv)
 	struct timespec ts_delta;
 	unsigned long flags;
 
-	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+	if (!timespec_valid(tv))
 		return -EINVAL;
 
 	write_seqlock_irqsave(&xtime_lock, flags);
@@ -570,7 +570,20 @@ void __init timekeeping_init(void)
 	struct timespec now, boot;
 
 	read_persistent_clock(&now);
+	if (!timespec_valid(&now)) {
+		printk("WARNING: Persistent clock returned invalid value!\n"
+			"         Check your CMOS/BIOS settings.\n");
+		now.tv_sec = 0;
+		now.tv_nsec = 0;
+	}
+
 	read_boot_clock(&boot);
+	if (!timespec_valid(&boot)) {
+		printk("WARNING: Boot clock returned invalid value!\n"
+			"         Check your CMOS/BIOS settings.\n");
+		boot.tv_sec = 0;
+		boot.tv_nsec = 0;
+	}
 
 	write_seqlock_irqsave(&xtime_lock, flags);
 
-- 
1.7.9.5


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

* [PATCH 2/3] 2.6.32.y: time: Avoid making adjustments if we haven't accumulated anything
  2012-09-18  2:32 [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
  2012-09-18  2:32 ` [PATCH 1/3] 2.6.32.y: time: Improve sanity checking of timekeeping inputs John Stultz
@ 2012-09-18  2:32 ` John Stultz
  2012-09-18  2:32 ` [PATCH 3/3] 2.6.32.y: time: Move ktime_t overflow checking into timespec_valid_strict John Stultz
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: John Stultz @ 2012-09-18  2:32 UTC (permalink / raw)
  To: stable
  Cc: John Stultz, Prarit Bhargava, Ingo Molnar, Thomas Gleixner, Linux Kernel

This is a -stable backport of bf2ac312195155511a0f79325515cbb61929898a

If update_wall_time() is called and the current offset isn't large
enough to accumulate, avoid re-calling timekeeping_adjust which may
change the clock freq and can cause 1ns inconsistencies with
CLOCK_REALTIME_COARSE/CLOCK_MONOTONIC_COARSE.

Signed-off-by: John Stultz <john.stultz@linaro.org>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/1345595449-34965-5-git-send-email-john.stultz@linaro.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
 kernel/time/timekeeping.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 85d51c4..b451c93 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -807,6 +807,10 @@ void update_wall_time(void)
 #else
 	offset = timekeeper.cycle_interval;
 #endif
+	/* Check if there's really nothing to do */
+	if (offset < timekeeper.cycle_interval)
+		return;
+
 	timekeeper.xtime_nsec = (s64)xtime.tv_nsec << timekeeper.shift;
 
 	/* normally this loop will run just once, however in the
-- 
1.7.9.5


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

* [PATCH 3/3] 2.6.32.y: time: Move ktime_t overflow checking into timespec_valid_strict
  2012-09-18  2:32 [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
  2012-09-18  2:32 ` [PATCH 1/3] 2.6.32.y: time: Improve sanity checking of timekeeping inputs John Stultz
  2012-09-18  2:32 ` [PATCH 2/3] 2.6.32.y: time: Avoid making adjustments if we haven't accumulated anything John Stultz
@ 2012-09-18  2:32 ` John Stultz
  2012-09-18  2:49 ` [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
  2012-09-18  5:39 ` Willy Tarreau
  4 siblings, 0 replies; 6+ messages in thread
From: John Stultz @ 2012-09-18  2:32 UTC (permalink / raw)
  To: stable
  Cc: John Stultz, Zhouping Liu, Ingo Molnar, Prarit Bhargava,
	Thomas Gleixner, Linus Torvalds, Linux Kernel

This is a -stable backport of cee58483cf56e0ba355fdd97ff5e8925329aa936

Andreas Bombe reported that the added ktime_t overflow checking added to
timespec_valid in commit 4e8b14526ca7 ("time: Improve sanity checking of
timekeeping inputs") was causing problems with X.org because it caused
timeouts larger then KTIME_T to be invalid.

Previously, these large timeouts would be clamped to KTIME_MAX and would
never expire, which is valid.

This patch splits the ktime_t overflow checking into a new
timespec_valid_strict function, and converts the timekeeping codes
internal checking to use this more strict function.

Reported-and-tested-by: Andreas Bombe <aeb@debian.org>
Cc: Zhouping Liu <zliu@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
 include/linux/time.h      |    7 +++++++
 kernel/time/timekeeping.c |    6 +++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/include/linux/time.h b/include/linux/time.h
index 146b6f3..bc93987 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -109,6 +109,13 @@ static inline bool timespec_valid(const struct timespec *ts)
 	/* Can't have more nanoseconds then a second */
 	if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
 		return false;
+	return true;
+}
+
+static inline bool timespec_valid_strict(const struct timespec *ts)
+{
+	if (!timespec_valid(ts))
+		return false;
 	/* Disallow values that could overflow ktime_t */
 	if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
 		return false;
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index b451c93..3d35af3 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -354,7 +354,7 @@ int do_settimeofday(struct timespec *tv)
 	struct timespec ts_delta;
 	unsigned long flags;
 
-	if (!timespec_valid(tv))
+	if (!timespec_valid_strict(tv))
 		return -EINVAL;
 
 	write_seqlock_irqsave(&xtime_lock, flags);
@@ -570,7 +570,7 @@ void __init timekeeping_init(void)
 	struct timespec now, boot;
 
 	read_persistent_clock(&now);
-	if (!timespec_valid(&now)) {
+	if (!timespec_valid_strict(&now)) {
 		printk("WARNING: Persistent clock returned invalid value!\n"
 			"         Check your CMOS/BIOS settings.\n");
 		now.tv_sec = 0;
@@ -578,7 +578,7 @@ void __init timekeeping_init(void)
 	}
 
 	read_boot_clock(&boot);
-	if (!timespec_valid(&boot)) {
+	if (!timespec_valid_strict(&boot)) {
 		printk("WARNING: Boot clock returned invalid value!\n"
 			"         Check your CMOS/BIOS settings.\n");
 		boot.tv_sec = 0;
-- 
1.7.9.5


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

* Re: [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6
  2012-09-18  2:32 [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
                   ` (2 preceding siblings ...)
  2012-09-18  2:32 ` [PATCH 3/3] 2.6.32.y: time: Move ktime_t overflow checking into timespec_valid_strict John Stultz
@ 2012-09-18  2:49 ` John Stultz
  2012-09-18  5:39 ` Willy Tarreau
  4 siblings, 0 replies; 6+ messages in thread
From: John Stultz @ 2012-09-18  2:49 UTC (permalink / raw)
  To: John Stultz; +Cc: stable, Prarit Bhargava, Thomas Gleixner, Linux Kernel

On 09/17/2012 07:32 PM, John Stultz wrote:
> Just wanted to send out a few timekeeping fixes that were merged
> in 3.6 which are appropriate for -stable.
>
And I did it again.
The subject of this should have been:
     "2.6.32-stable timekeeping fixes merged in 3.6"

Apologies for any confusion.

thanks
-john


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

* Re: [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6
  2012-09-18  2:32 [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
                   ` (3 preceding siblings ...)
  2012-09-18  2:49 ` [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
@ 2012-09-18  5:39 ` Willy Tarreau
  4 siblings, 0 replies; 6+ messages in thread
From: Willy Tarreau @ 2012-09-18  5:39 UTC (permalink / raw)
  To: John Stultz; +Cc: stable, Prarit Bhargava, Thomas Gleixner, Linux Kernel

Hi John,

On Mon, Sep 17, 2012 at 10:32:07PM -0400, John Stultz wrote:
> Just wanted to send out a few timekeeping fixes that were merged
> in 3.6 which are appropriate for -stable.

Thank you very much, I'm adding them to your last ones. I have not released
the version yet but they're not lost. I will then release all of them at once.

Best regards,
Willy


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

end of thread, other threads:[~2012-09-18  5:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-18  2:32 [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
2012-09-18  2:32 ` [PATCH 1/3] 2.6.32.y: time: Improve sanity checking of timekeeping inputs John Stultz
2012-09-18  2:32 ` [PATCH 2/3] 2.6.32.y: time: Avoid making adjustments if we haven't accumulated anything John Stultz
2012-09-18  2:32 ` [PATCH 3/3] 2.6.32.y: time: Move ktime_t overflow checking into timespec_valid_strict John Stultz
2012-09-18  2:49 ` [PATCH 0/3] 3.2-stable timekeeping fixes merged in 3.6 John Stultz
2012-09-18  5:39 ` Willy Tarreau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).