Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 17577
b: refs/heads/master
c: 5cca761
h: refs/heads/master
i:
  17575: c0b4ba5
v: v3
  • Loading branch information
Thomas Gleixner authored and Linus Torvalds committed Jan 10, 2006
1 parent 3298a63 commit f3cc274
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: af4cd3fe4cfa75ca74f8d8622867371289043a8d
refs/heads/master: 5cca7619a562c9d98a3a0123dc878d79bf3c8fb3
49 changes: 49 additions & 0 deletions trunk/include/linux/calc64.h
Original file line number Diff line number Diff line change
@@ -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
18 changes: 6 additions & 12 deletions trunk/include/linux/jiffies.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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;
}

/*
Expand Down

0 comments on commit f3cc274

Please sign in to comment.