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>

authored by Jeremy Fitzhardinge and committed by Ingo Molnar d5e181f7 f595ec96

+20 -14
+19
include/linux/math64.h
··· 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 */
+1 -14
lib/div64.c
··· 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);