Commit d5e181f78ac753893eb930868a52a4488cd3de0a
Committed by
Ingo Molnar
1 parent
f595ec964d
Exists in
master
and in
4 other branches
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 */ |
lib/div64.c
... | ... | @@ -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); |