Fix accidental implicit cast in HR-timer conversion
authorDavid Howells <dhowells@redhat.com>
Wed, 5 Nov 2008 17:38:47 +0000 (17:38 +0000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Nov 2008 23:44:19 +0000 (15:44 -0800)
Fix the hrtimer_add_expires_ns() function.  It should take a 'u64 ns' argument,
but rather takes an 'unsigned long ns' argument - which might only be 32-bits.

On FRV, this results in the kernel locking up because hrtimer_forward() passes
the result of a 64-bit multiplication to this function, for which the compiler
discards the top 32-bits - something that didn't happen when ktime_add_ns() was
called directly.

Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/hrtimer.h

index 2b3645b1acf4609e55fa36f22368cca34d439a2a..07e510a3b00a89e78c2f48b591208b19dac6ef4e 100644 (file)
@@ -239,7 +239,7 @@ static inline void hrtimer_add_expires(struct hrtimer *timer, ktime_t time)
        timer->_softexpires = ktime_add_safe(timer->_softexpires, time);
 }
 
-static inline void hrtimer_add_expires_ns(struct hrtimer *timer, unsigned long ns)
+static inline void hrtimer_add_expires_ns(struct hrtimer *timer, u64 ns)
 {
        timer->_expires = ktime_add_ns(timer->_expires, ns);
        timer->_softexpires = ktime_add_ns(timer->_softexpires, ns);