Commit ca42aaf0 authored by Nicholas Mc Guire's avatar Nicholas Mc Guire Committed by Thomas Gleixner

time: Refactor msecs_to_jiffies

Refactor the msecs_to_jiffies conditional code part in time.c and 
jiffies.h putting it into conditional functions rather than #ifdefs
to improve readability.

[ tglx: Verified that there is no binary code change ]
Signed-off-by: default avatarNicholas Mc Guire <hofrat@osadl.org>
Cc: Masahiro Yamada <yamada.m@jp.panasonic.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Joe Perches <joe@perches.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Andrew Hunter <ahh@google.com>
Cc: Paul Turner <pjt@google.com>
Cc: Michal Marek <mmarek@suse.cz>
Link: http://lkml.kernel.org/r/1431951554-5563-2-git-send-email-hofrat@osadl.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 0a227985
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/time.h> #include <linux/time.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <asm/param.h> /* for HZ */ #include <asm/param.h> /* for HZ */
#include <generated/timeconst.h>
/* /*
* The following defines establish the engineering parameters of the PLL * The following defines establish the engineering parameters of the PLL
...@@ -288,7 +289,68 @@ static inline u64 jiffies_to_nsecs(const unsigned long j) ...@@ -288,7 +289,68 @@ static inline u64 jiffies_to_nsecs(const unsigned long j)
return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC; return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC;
} }
extern unsigned long msecs_to_jiffies(const unsigned int m); extern unsigned long __msecs_to_jiffies(const unsigned int m);
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
/*
* HZ is equal to or smaller than 1000, and 1000 is a nice round
* multiple of HZ, divide with the factor between them, but round
* upwards:
*/
static inline unsigned long _msecs_to_jiffies(const unsigned int m)
{
return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
}
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
/*
* HZ is larger than 1000, and HZ is a nice round multiple of 1000 -
* simply multiply with the factor between them.
*
* But first make sure the multiplication result cannot overflow:
*/
static inline unsigned long _msecs_to_jiffies(const unsigned int m)
{
if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
return MAX_JIFFY_OFFSET;
return m * (HZ / MSEC_PER_SEC);
}
#else
/*
* Generic case - multiply, round and divide. But first check that if
* we are doing a net multiplication, that we wouldn't overflow:
*/
static inline unsigned long _msecs_to_jiffies(const unsigned int m)
{
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
/**
* msecs_to_jiffies: - convert milliseconds to jiffies
* @m: time in milliseconds
*
* conversion is done as follows:
*
* - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
*
* - 'too large' values [that would result in larger than
* MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
*
* - all other values are converted to jiffies by either multiplying
* the input value by a factor or dividing it with a factor and
* handling any 32-bit overflows.
* for the details see __msecs_to_jiffies()
*
* the HZ range specific helpers _msecs_to_jiffies() are called from
* __msecs_to_jiffies().
*/
static inline unsigned long msecs_to_jiffies(const unsigned int m)
{
return __msecs_to_jiffies(m);
}
extern unsigned long usecs_to_jiffies(const unsigned int u); extern unsigned long usecs_to_jiffies(const unsigned int u);
extern unsigned long timespec_to_jiffies(const struct timespec *value); extern unsigned long timespec_to_jiffies(const struct timespec *value);
extern void jiffies_to_timespec(const unsigned long jiffies, extern void jiffies_to_timespec(const unsigned long jiffies,
......
...@@ -483,9 +483,11 @@ struct timespec64 ns_to_timespec64(const s64 nsec) ...@@ -483,9 +483,11 @@ struct timespec64 ns_to_timespec64(const s64 nsec)
} }
EXPORT_SYMBOL(ns_to_timespec64); EXPORT_SYMBOL(ns_to_timespec64);
#endif #endif
/* /**
* When we convert to jiffies then we interpret incoming values * msecs_to_jiffies: - convert milliseconds to jiffies
* the following way: * @m: time in milliseconds
*
* conversion is done as follows:
* *
* - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET) * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
* *
...@@ -493,51 +495,28 @@ EXPORT_SYMBOL(ns_to_timespec64); ...@@ -493,51 +495,28 @@ EXPORT_SYMBOL(ns_to_timespec64);
* MAX_JIFFY_OFFSET values] mean 'infinite timeout' too. * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
* *
* - all other values are converted to jiffies by either multiplying * - all other values are converted to jiffies by either multiplying
* the input value by a factor or dividing it with a factor * the input value by a factor or dividing it with a factor and
* * handling any 32-bit overflows.
* We must also be careful about 32-bit overflows. * for the details see __msecs_to_jiffies()
*
* msecs_to_jiffies() checks for the passed in value being a constant
* via __builtin_constant_p() allowing gcc to eliminate most of the
* code, __msecs_to_jiffies() is called if the value passed does not
* allow constant folding and the actual conversion must be done at
* runtime.
* the _msecs_to_jiffies helpers are the HZ dependent conversion
* routines found in include/linux/jiffies.h
*/ */
unsigned long msecs_to_jiffies(const unsigned int m) unsigned long __msecs_to_jiffies(const unsigned int m)
{ {
/* /*
* Negative value, means infinite timeout: * Negative value, means infinite timeout:
*/ */
if ((int)m < 0) if ((int)m < 0)
return MAX_JIFFY_OFFSET; return MAX_JIFFY_OFFSET;
return _msecs_to_jiffies(m);
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
/*
* HZ is equal to or smaller than 1000, and 1000 is a nice
* round multiple of HZ, divide with the factor between them,
* but round upwards:
*/
return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
/*
* HZ is larger than 1000, and HZ is a nice round multiple of
* 1000 - simply multiply with the factor between them.
*
* But first make sure the multiplication result cannot
* overflow:
*/
if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
return MAX_JIFFY_OFFSET;
return m * (HZ / MSEC_PER_SEC);
#else
/*
* Generic case - multiply, round and divide. But first
* check that if we are doing a net multiplication, that
* we wouldn't overflow:
*/
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
} }
EXPORT_SYMBOL(msecs_to_jiffies); EXPORT_SYMBOL(__msecs_to_jiffies);
unsigned long usecs_to_jiffies(const unsigned int u) unsigned long usecs_to_jiffies(const unsigned int u)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment