On Fri, 8 May 2015, John Stultz wrote: > +static inline s64 ktime_divns(const ktime_t kt, s64 div) > { > + /* > + * Negative divisors could cause an inf loop, > + * so bug out here. > + */ > + BUG_ON(div < 0); > if (__builtin_constant_p(div) && !(div >> 32)) { > - u64 ns = kt.tv64; > + s64 ns = kt.tv64; > + int neg = (ns < 0); > + > + if (neg) > + ns = -ns; > do_div(ns, div); This triggers the typecheck for u64 in do_div(). The delta patch below should do the trick. Thanks, tglx diff --git a/include/linux/ktime.h b/include/linux/ktime.h index ab2de1c7932c..b9620ebe356f 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h @@ -177,13 +177,13 @@ static inline s64 ktime_divns(const ktime_t kt, s64 div) if (__builtin_constant_p(div) && !(div >> 32)) { s64 ns = kt.tv64; int neg = (ns < 0); + u64 tmp; if (neg) ns = -ns; - do_div(ns, div); - if (neg) - ns = -ns; - return ns; + tmp = ns; + do_div(tmp, div); + return neg ? -tmp : tmp; } else { return __ktime_divns(kt, div); } diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index c98ce4d9f613..bac65f810afd 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -268,8 +268,9 @@ lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags) */ s64 __ktime_divns(const ktime_t kt, s64 div) { - s64 dclc; int neg, sft = 0; + s64 dclc; + u64 tmp; dclc = ktime_to_ns(kt); neg = (dclc < 0); @@ -280,12 +281,9 @@ s64 __ktime_divns(const ktime_t kt, s64 div) sft++; div >>= 1; } - dclc >>= sft; - do_div(dclc, (unsigned long) div); - if (neg) - dclc = -dclc; - - return dclc; + tmp = dclc >> sft; + do_div(tmp, (unsigned long) div); + return neg ? -tmp : tmp; } EXPORT_SYMBOL_GPL(__ktime_divns); #endif /* BITS_PER_LONG >= 64 */ -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html