diff mbox

[1/3] time: Add missing implementation for timespec64_add_safe()

Message ID 1461947989-21926-2-git-send-email-deepa.kernel@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Deepa Dinamani April 29, 2016, 4:39 p.m. UTC
timespec64_add_safe() has been defined in time64.h for
64 bit systems.
But, 32 bit systems only have an extern function prototype defined.
Provide a definition for the above function.

The function will be necessary as part of y2038 changes.
struct timespec is not y2038 safe. All references to timespec will
be replaced by struct timespec64. The function is meant to be a
replacement for timespec_add_safe().

The implementation is similar to timespec_add_safe().

Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
---
 include/linux/time64.h |  4 +---
 kernel/time/time.c     | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 3 deletions(-)

Comments

Deepa Dinamani May 4, 2016, 3:54 p.m. UTC | #1
Wanted to add a note here:

> + * Add two timespec64 values and do a safety check for overflow.
> + * It's assumed that both values are valid (>= 0).
> + * And, each timespec64 is in normalized form.
> + */
> +struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
> +                               const struct timespec64 rhs)
> +{
> +       struct timespec64 res;
> +
> +       set_normalized_timespec64(&res, lhs.tv_sec + rhs.tv_sec,
> +                       lhs.tv_nsec + rhs.tv_nsec);
> +
> +       if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) {

This check can be reduced to only the first condition if we assume the
timespecs passed in to be normalized.
The current patch maintains the way timespec_add_safe() does it for consistency.

-Deepa
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
John Stultz May 4, 2016, 6:31 p.m. UTC | #2
On Fri, Apr 29, 2016 at 9:39 AM, Deepa Dinamani <deepa.kernel@gmail.com> wrote:
> timespec64_add_safe() has been defined in time64.h for
> 64 bit systems.
> But, 32 bit systems only have an extern function prototype defined.
> Provide a definition for the above function.
>
> The function will be necessary as part of y2038 changes.
> struct timespec is not y2038 safe. All references to timespec will
> be replaced by struct timespec64. The function is meant to be a
> replacement for timespec_add_safe().
>
> The implementation is similar to timespec_add_safe().
>
> Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> ---
>  include/linux/time64.h |  4 +---
>  kernel/time/time.c     | 25 +++++++++++++++++++++++++
>  2 files changed, 26 insertions(+), 3 deletions(-)

Looks ok at the first glance. I've queued these up for testing,
however I only got #1 and #3 of the set. Are you hoping these two
patches will go through tip/timers/core or are you looking for acks so
they can go via another tree?

thanks
-john
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/linux/time64.h b/include/linux/time64.h
index 367d5af..1778937 100644
--- a/include/linux/time64.h
+++ b/include/linux/time64.h
@@ -136,13 +136,11 @@  extern void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 n
 
 /*
  * timespec64_add_safe assumes both values are positive and checks for
- * overflow. It will return TIME_T_MAX if the returned value would be
- * smaller then either of the arguments.
+ * overflow. It will return TIME64_MAX in case of overflow.
  */
 extern struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
 					 const struct timespec64 rhs);
 
-
 static inline struct timespec64 timespec64_add(struct timespec64 lhs,
 						struct timespec64 rhs)
 {
diff --git a/kernel/time/time.c b/kernel/time/time.c
index be115b0..558f5fe 100644
--- a/kernel/time/time.c
+++ b/kernel/time/time.c
@@ -769,3 +769,28 @@  struct timespec timespec_add_safe(const struct timespec lhs,
 
 	return res;
 }
+
+#if __BITS_PER_LONG != 64
+
+/*
+ * Add two timespec64 values and do a safety check for overflow.
+ * It's assumed that both values are valid (>= 0).
+ * And, each timespec64 is in normalized form.
+ */
+struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
+				const struct timespec64 rhs)
+{
+	struct timespec64 res;
+
+	set_normalized_timespec64(&res, lhs.tv_sec + rhs.tv_sec,
+			lhs.tv_nsec + rhs.tv_nsec);
+
+	if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) {
+		res.tv_sec = TIME64_MAX;
+		res.tv_nsec = 0;
+	}
+
+	return res;
+}
+
+#endif