ktime: Kill non-scalar ktime_t implementation for 2038
The non-scalar ktime_t implementation is basically a timespec which has to be changed to support dates past 2038 on 32bit systems. This patch removes the non-scalar ktime_t implementation, forcing the scalar s64 nanosecond version on all architectures. This may have additional performance overhead on some 32bit systems when converting between ktime_t and timespec structures, however the majority of 32bit systems (arm and i386) were already using scalar ktime_t, so no performance regressions will be seen on those platforms. On affected platforms, I'm open to finding optimizations, including avoiding converting to timespecs where possible. [ tglx: We can now cleanup the ktime_t.tv64 mess, but thats a different issue and we can throw a coccinelle script at it ] Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: John Stultz <john.stultz@linaro.org>
This commit is contained in:
@@ -20,10 +20,6 @@ config GENERIC_TIME_VSYSCALL
|
||||
config GENERIC_TIME_VSYSCALL_OLD
|
||||
bool
|
||||
|
||||
# ktime_t scalar 64bit nsec representation
|
||||
config KTIME_SCALAR
|
||||
bool
|
||||
|
||||
# Old style timekeeping
|
||||
config ARCH_USES_GETTIMEOFFSET
|
||||
bool
|
||||
|
@@ -261,60 +261,6 @@ lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
|
||||
* too large for inlining:
|
||||
*/
|
||||
#if BITS_PER_LONG < 64
|
||||
# ifndef CONFIG_KTIME_SCALAR
|
||||
/**
|
||||
* ktime_add_ns - Add a scalar nanoseconds value to a ktime_t variable
|
||||
* @kt: addend
|
||||
* @nsec: the scalar nsec value to add
|
||||
*
|
||||
* Returns the sum of kt and nsec in ktime_t format
|
||||
*/
|
||||
ktime_t ktime_add_ns(const ktime_t kt, u64 nsec)
|
||||
{
|
||||
ktime_t tmp;
|
||||
|
||||
if (likely(nsec < NSEC_PER_SEC)) {
|
||||
tmp.tv64 = nsec;
|
||||
} else {
|
||||
unsigned long rem = do_div(nsec, NSEC_PER_SEC);
|
||||
|
||||
/* Make sure nsec fits into long */
|
||||
if (unlikely(nsec > KTIME_SEC_MAX))
|
||||
return (ktime_t){ .tv64 = KTIME_MAX };
|
||||
|
||||
tmp = ktime_set((long)nsec, rem);
|
||||
}
|
||||
|
||||
return ktime_add(kt, tmp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ktime_add_ns);
|
||||
|
||||
/**
|
||||
* ktime_sub_ns - Subtract a scalar nanoseconds value from a ktime_t variable
|
||||
* @kt: minuend
|
||||
* @nsec: the scalar nsec value to subtract
|
||||
*
|
||||
* Returns the subtraction of @nsec from @kt in ktime_t format
|
||||
*/
|
||||
ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec)
|
||||
{
|
||||
ktime_t tmp;
|
||||
|
||||
if (likely(nsec < NSEC_PER_SEC)) {
|
||||
tmp.tv64 = nsec;
|
||||
} else {
|
||||
unsigned long rem = do_div(nsec, NSEC_PER_SEC);
|
||||
|
||||
tmp = ktime_set((long)nsec, rem);
|
||||
}
|
||||
|
||||
return ktime_sub(kt, tmp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ktime_sub_ns);
|
||||
# endif /* !CONFIG_KTIME_SCALAR */
|
||||
|
||||
/*
|
||||
* Divide a ktime value by a nanosecond value
|
||||
*/
|
||||
|
@@ -344,11 +344,8 @@ ktime_t ktime_get(void)
|
||||
nsecs = timekeeping_get_ns(tk) + tk->wall_to_monotonic.tv_nsec;
|
||||
|
||||
} while (read_seqcount_retry(&timekeeper_seq, seq));
|
||||
/*
|
||||
* Use ktime_set/ktime_add_ns to create a proper ktime on
|
||||
* 32-bit architectures without CONFIG_KTIME_SCALAR.
|
||||
*/
|
||||
return ktime_add_ns(ktime_set(secs, 0), nsecs);
|
||||
|
||||
return ktime_set(secs, nsecs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ktime_get);
|
||||
|
||||
|
Reference in New Issue
Block a user