diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-23 17:57:40 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-23 17:57:40 -0700 |
commit | c5db6a3bdeb72f4238e1faefa4ce4eab7a64baea (patch) | |
tree | e0034ec600453c1c1377e6b42f8818d56127617c /kernel | |
parent | 9bd4459a3d31cfe79dfb5ea00912471537f219c3 (diff) | |
parent | f7bcb70ebae0dcdb5a2d859b09e4465784d99029 (diff) | |
download | linux-c5db6a3bdeb72f4238e1faefa4ce4eab7a64baea.tar.gz linux-c5db6a3bdeb72f4238e1faefa4ce4eab7a64baea.tar.bz2 linux-c5db6a3bdeb72f4238e1faefa4ce4eab7a64baea.zip |
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fix from Thomas Gleixner:
"One more fix from the timer departement:
- Handle division of negative nanosecond values proper on 32bit.
A recent cleanup wrecked the sign handling of the dividend and
dropped the check for negative divisors"
* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
ktime: Fix ktime_divns to do signed division
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/time/hrtimer.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 76d4bd962b19..93ef7190bdea 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -266,21 +266,23 @@ lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags) /* * Divide a ktime value by a nanosecond value */ -u64 __ktime_divns(const ktime_t kt, s64 div) +s64 __ktime_divns(const ktime_t kt, s64 div) { - u64 dclc; int sft = 0; + s64 dclc; + u64 tmp; dclc = ktime_to_ns(kt); + tmp = dclc < 0 ? -dclc : dclc; + /* Make sure the divisor is less than 2^32: */ while (div >> 32) { sft++; div >>= 1; } - dclc >>= sft; - do_div(dclc, (unsigned long) div); - - return dclc; + tmp >>= sft; + do_div(tmp, (unsigned long) div); + return dclc < 0 ? -tmp : tmp; } EXPORT_SYMBOL_GPL(__ktime_divns); #endif /* BITS_PER_LONG >= 64 */ |