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: Nicholas 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.org Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
0a227985d4
commit
ca42aaf0c8
@ -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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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);
|
|||||||
* 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.
|
||||||
|
* for the details see __msecs_to_jiffies()
|
||||||
*
|
*
|
||||||
* We must also be careful about 32-bit overflows.
|
* 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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user