Skip to contentSkip to conversation

add an inlined version of iter_div_u64_rem

PATCH New Jeremy Fitzhardinge 1 participant 1 message May 14, 2008 Library code

lore
Share & tools
lore
#0 lore raw

PATCH 2/3 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.

---

include/linux/math64.h |   19 +++++++++++++++++++
lib/div64.c            |   15 +--------------
2 files changed, 20 insertions(+), 14 deletions(-)

===================================================================

include/linux/math64.h +0 -0
@@ -83,4 +83,23 @@
 

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 */
===================================================================

lib/div64.c +0 -0
@@ -105,19 +105,6 @@
 */

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);