Skip to content

Commit

Permalink
add an inlined version of iter_div_u64_rem
Browse files Browse the repository at this point in the history
iter_div_u64_rem is used in the x86-64 vdso, which cannot call other
kernel code.  For this case, provide the always_inlined version,
__iter_div_u64_rem.

Signed-off-by: Jeremy Fitzhardinge <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
Jeremy Fitzhardinge authored and Ingo Molnar committed Jun 12, 2008
1 parent f595ec9 commit d5e181f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
19 changes: 19 additions & 0 deletions include/linux/math64.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,23 @@ static inline s64 div_s64(s64 dividend, s32 divisor)

u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder);

static __always_inline u32
__iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
{
u32 ret = 0;

while (dividend >= divisor) {
/* The following asm() prevents the compiler from
optimising this loop into a modulo operation. */
asm("" : "+rm"(dividend));

dividend -= divisor;
ret++;
}

*remainder = dividend;

return ret;
}

#endif /* _LINUX_MATH64_H */
15 changes: 1 addition & 14 deletions lib/div64.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,19 +105,6 @@ EXPORT_SYMBOL(div64_u64);
*/
u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
{
u32 ret = 0;

while (dividend >= divisor) {
/* The following asm() prevents the compiler from
optimising this loop into a modulo operation. */
asm("" : "+rm"(dividend));

dividend -= divisor;
ret++;
}

*remainder = dividend;

return ret;
return __iter_div_u64_rem(dividend, divisor, remainder);
}
EXPORT_SYMBOL(iter_div_u64_rem);

0 comments on commit d5e181f

Please sign in to comment.