[PATCH] hrtimer: move div_long_long_rem out of jiffies.h
move div_long_long_rem() from jiffies.h into a new calc64.h include file, as it is a general math function useful for other things than the jiffy code. Convert it to an inline function Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
af4cd3fe4c
commit
5cca7619a5
2 changed files with 55 additions and 12 deletions
49
include/linux/calc64.h
Normal file
49
include/linux/calc64.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
#ifndef _LINUX_CALC64_H
|
||||
#define _LINUX_CALC64_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
/*
|
||||
* This is a generic macro which is used when the architecture
|
||||
* specific div64.h does not provide a optimized one.
|
||||
*
|
||||
* The 64bit dividend is divided by the divisor (data type long), the
|
||||
* result is returned and the remainder stored in the variable
|
||||
* referenced by remainder (data type long *). In contrast to the
|
||||
* do_div macro the dividend is kept intact.
|
||||
*/
|
||||
#ifndef div_long_long_rem
|
||||
#define div_long_long_rem(dividend, divisor, remainder) \
|
||||
do_div_llr((dividend), divisor, remainder)
|
||||
|
||||
static inline unsigned long do_div_llr(const long long dividend,
|
||||
const long divisor, long *remainder)
|
||||
{
|
||||
u64 result = dividend;
|
||||
|
||||
*(remainder) = do_div(result, divisor);
|
||||
return (unsigned long) result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Sign aware variation of the above. On some architectures a
|
||||
* negative dividend leads to an divide overflow exception, which
|
||||
* is avoided by the sign check.
|
||||
*/
|
||||
static inline long div_long_long_rem_signed(const long long dividend,
|
||||
const long divisor, long *remainder)
|
||||
{
|
||||
long res;
|
||||
|
||||
if (unlikely(dividend < 0)) {
|
||||
res = -div_long_long_rem(-dividend, divisor, remainder);
|
||||
*remainder = -(*remainder);
|
||||
} else
|
||||
res = div_long_long_rem(dividend, divisor, remainder);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,21 +1,12 @@
|
|||
#ifndef _LINUX_JIFFIES_H
|
||||
#define _LINUX_JIFFIES_H
|
||||
|
||||
#include <linux/calc64.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/timex.h>
|
||||
#include <asm/param.h> /* for HZ */
|
||||
#include <asm/div64.h>
|
||||
|
||||
#ifndef div_long_long_rem
|
||||
#define div_long_long_rem(dividend,divisor,remainder) \
|
||||
({ \
|
||||
u64 result = dividend; \
|
||||
*remainder = do_div(result,divisor); \
|
||||
result; \
|
||||
})
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following defines establish the engineering parameters of the PLL
|
||||
|
@ -373,8 +364,11 @@ jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
|
|||
* one divide.
|
||||
*/
|
||||
u64 nsec = (u64)jiffies * TICK_NSEC;
|
||||
value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_usec);
|
||||
value->tv_usec /= NSEC_PER_USEC;
|
||||
long tv_usec;
|
||||
|
||||
value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec);
|
||||
tv_usec /= NSEC_PER_USEC;
|
||||
value->tv_usec = tv_usec;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue