mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 2 changed files with 81 additions and 40 deletions
				
			
		| 
						 | 
					@ -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 a new issue