|
@@ -36,6 +36,7 @@
|
|
|
#include <linux/security.h>
|
|
|
#include <linux/fs.h>
|
|
|
#include <linux/slab.h>
|
|
|
+#include <linux/math64.h>
|
|
|
|
|
|
#include <asm/uaccess.h>
|
|
|
#include <asm/unistd.h>
|
|
@@ -587,9 +588,7 @@ clock_t jiffies_to_clock_t(long x)
|
|
|
return x / (HZ / USER_HZ);
|
|
|
# endif
|
|
|
#else
|
|
|
- u64 tmp = (u64)x * TICK_NSEC;
|
|
|
- do_div(tmp, (NSEC_PER_SEC / USER_HZ));
|
|
|
- return (long)tmp;
|
|
|
+ return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
|
|
|
#endif
|
|
|
}
|
|
|
EXPORT_SYMBOL(jiffies_to_clock_t);
|
|
@@ -601,16 +600,12 @@ unsigned long clock_t_to_jiffies(unsigned long x)
|
|
|
return ~0UL;
|
|
|
return x * (HZ / USER_HZ);
|
|
|
#else
|
|
|
- u64 jif;
|
|
|
-
|
|
|
/* Don't worry about loss of precision here .. */
|
|
|
if (x >= ~0UL / HZ * USER_HZ)
|
|
|
return ~0UL;
|
|
|
|
|
|
/* .. but do try to contain it here */
|
|
|
- jif = x * (u64) HZ;
|
|
|
- do_div(jif, USER_HZ);
|
|
|
- return jif;
|
|
|
+ return div_u64((u64)x * HZ, USER_HZ);
|
|
|
#endif
|
|
|
}
|
|
|
EXPORT_SYMBOL(clock_t_to_jiffies);
|
|
@@ -619,10 +614,9 @@ u64 jiffies_64_to_clock_t(u64 x)
|
|
|
{
|
|
|
#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
|
|
|
# if HZ < USER_HZ
|
|
|
- x *= USER_HZ;
|
|
|
- do_div(x, HZ);
|
|
|
+ x = div_u64(x * USER_HZ, HZ);
|
|
|
# elif HZ > USER_HZ
|
|
|
- do_div(x, HZ / USER_HZ);
|
|
|
+ x = div_u64(x, HZ / USER_HZ);
|
|
|
# else
|
|
|
/* Nothing to do */
|
|
|
# endif
|
|
@@ -632,8 +626,7 @@ u64 jiffies_64_to_clock_t(u64 x)
|
|
|
* but even this doesn't overflow in hundreds of years
|
|
|
* in 64 bits, so..
|
|
|
*/
|
|
|
- x *= TICK_NSEC;
|
|
|
- do_div(x, (NSEC_PER_SEC / USER_HZ));
|
|
|
+ x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ));
|
|
|
#endif
|
|
|
return x;
|
|
|
}
|
|
@@ -642,21 +635,17 @@ EXPORT_SYMBOL(jiffies_64_to_clock_t);
|
|
|
u64 nsec_to_clock_t(u64 x)
|
|
|
{
|
|
|
#if (NSEC_PER_SEC % USER_HZ) == 0
|
|
|
- do_div(x, (NSEC_PER_SEC / USER_HZ));
|
|
|
+ return div_u64(x, NSEC_PER_SEC / USER_HZ);
|
|
|
#elif (USER_HZ % 512) == 0
|
|
|
- x *= USER_HZ/512;
|
|
|
- do_div(x, (NSEC_PER_SEC / 512));
|
|
|
+ return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512);
|
|
|
#else
|
|
|
/*
|
|
|
* max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
|
|
|
* overflow after 64.99 years.
|
|
|
* exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
|
|
|
*/
|
|
|
- x *= 9;
|
|
|
- do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2)) /
|
|
|
- USER_HZ));
|
|
|
+ return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ);
|
|
|
#endif
|
|
|
- return x;
|
|
|
}
|
|
|
|
|
|
#if (BITS_PER_LONG < 64)
|