Use do_div for a subtract loop
Subsystems (2)
PATCH 1/1 Use do_div for a subtract loop
Hello All,
this patch switches the subtract loop in timespec_add_ns to use do_div. The latest GCC SVN version grew intelligent enough to optimize the loop to a division which calls libgcc's __udivdi3, which breaks kernel builds.
Tested by building and booting a little endian qemu MIPS kernel.
Thiemo
Signed-off-by Thiemo Seufer <[email protected]>
include/linux/time.h +5 -3
@@ -5,6 +5,7 @@#ifdef __KERNEL__# include <linux/seqlock.h> +# include <asm/div64.h> #endif #ifndef _STRUCT_TIMESPEC
@@ -169,9 +170,10 @@ extern struct timeval ns_to_timeval(const s64 nsec);static inline void timespec_add_ns (struct timespec *a,u64 ns) { ns += a->tv_nsec; -while (unlikely (ns >=NSEC_PER_SEC )) { - ns -=NSEC_PER_SEC ; - a->tv_sec++; +if (unlikely (ns >=NSEC_PER_SEC )) { +u64 tmp = ns; + ns =do_div (tmp,NSEC_PER_SEC ); + a->tv_sec += tmp; } a->tv_nsec = ns; }