A number of cleanup patches where switching var * HZ / 1000 constructs to msecs_to_jiffies(var) to ensure that all corener cases are handled properly. The downside of this though is that it now uses a function call and also was not performing constant folding where it was originally possible.
msecs_to_jiffies() will calculate jiffies even if constants are passed in that could be handled by constant folding at compile time using __builtin_constant_p() gcc can optimize the constant case again. Signed-off-by: Nicholas Mc Guire <hof...@osadl.org> --- reported by Aaron Sierra <asie...@xes-inc.com> solution suggested by Joe Perches <j...@perches.com> Patch is against 4.0-rc6 (localversion-next is -next-20150401) Boot tested on x86 64 only kernel/time/time.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/kernel/time/time.c b/kernel/time/time.c index 2c85b77..8cb550a 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c @@ -496,15 +496,14 @@ EXPORT_SYMBOL(ns_to_timespec64); * the input value by a factor or dividing it with a factor * * We must also be careful about 32-bit overflows. + * + * msecs_to_jiffies() will check for the passed in value being constant + * via __builtin_constant_p() allowing gcc to eliminate most of the code + * __msecs_to_jiffies() will be called if the value passed does not allow + * gcc to do constant folding. */ -unsigned long msecs_to_jiffies(const unsigned int m) +static unsigned long __msecs_to_jiffies(const unsigned int m) { - /* - * Negative value, means infinite timeout: - */ - if ((int)m < 0) - return MAX_JIFFY_OFFSET; - #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) /* * HZ is equal to or smaller than 1000, and 1000 is a nice @@ -537,6 +536,32 @@ unsigned long msecs_to_jiffies(const unsigned int m) >> MSEC_TO_HZ_SHR32; #endif } + +unsigned long msecs_to_jiffies(const unsigned int m) +{ + /* + * Negative value, means infinite timeout: + */ + if ((int)m < 0) + return MAX_JIFFY_OFFSET; + + if (__builtin_constant_p(m)) { +#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) + return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); +#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) + if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) + return MAX_JIFFY_OFFSET; + return m * (HZ / MSEC_PER_SEC); +#else + if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) + return MAX_JIFFY_OFFSET; + + return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32) + >> MSEC_TO_HZ_SHR32; +#endif + } else + return __msecs_to_jiffies(m); +} EXPORT_SYMBOL(msecs_to_jiffies); unsigned long usecs_to_jiffies(const unsigned int u) -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/