Commit d5e181f78ac753893eb930868a52a4488cd3de0a

Authored by Jeremy Fitzhardinge
Committed by Ingo Molnar
1 parent f595ec964d

add an inlined version of iter_div_u64_rem

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 <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

Showing 2 changed files with 20 additions and 14 deletions Side-by-side Diff

include/linux/math64.h
... ... @@ -83,5 +83,24 @@
83 83  
84 84 u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder);
85 85  
  86 +static __always_inline u32
  87 +__iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
  88 +{
  89 + u32 ret = 0;
  90 +
  91 + while (dividend >= divisor) {
  92 + /* The following asm() prevents the compiler from
  93 + optimising this loop into a modulo operation. */
  94 + asm("" : "+rm"(dividend));
  95 +
  96 + dividend -= divisor;
  97 + ret++;
  98 + }
  99 +
  100 + *remainder = dividend;
  101 +
  102 + return ret;
  103 +}
  104 +
86 105 #endif /* _LINUX_MATH64_H */
... ... @@ -105,20 +105,7 @@
105 105 */
106 106 u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
107 107 {
108   - u32 ret = 0;
109   -
110   - while (dividend >= divisor) {
111   - /* The following asm() prevents the compiler from
112   - optimising this loop into a modulo operation. */
113   - asm("" : "+rm"(dividend));
114   -
115   - dividend -= divisor;
116   - ret++;
117   - }
118   -
119   - *remainder = dividend;
120   -
121   - return ret;
  108 + return __iter_div_u64_rem(dividend, divisor, remainder);
122 109 }
123 110 EXPORT_SYMBOL(iter_div_u64_rem);