summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2006-01-12 11:47:34 +0100
committerThomas Gleixner <tglx@linutronix.de>2006-01-12 11:47:34 +0100
commitc9db4fa11526affde83603fe52595bd1260c1354 (patch)
tree3064d71209b32569cfbd5dd0907fbe65bcf02d5e /kernel
parente2787630c1abb075c935cf47e91beb7c656f48c4 (diff)
downloadlinux-3.10-c9db4fa11526affde83603fe52595bd1260c1354.tar.gz
linux-3.10-c9db4fa11526affde83603fe52595bd1260c1354.tar.bz2
linux-3.10-c9db4fa11526affde83603fe52595bd1260c1354.zip
[hrtimer] Enforce resolution as lower limit of intervals
Roman Zippel pointed out that the missing lower limit of intervals leads to an accounting error in the overrun count. Enforce the lower limit of intervals to resolution in the timer forwarding code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/hrtimer.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 76d759ce623..04ccab099e8 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -275,7 +275,7 @@ void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
* The number of overruns is added to the overrun field.
*/
unsigned long
-hrtimer_forward(struct hrtimer *timer, const ktime_t interval)
+hrtimer_forward(struct hrtimer *timer, ktime_t interval)
{
unsigned long orun = 1;
ktime_t delta, now;
@@ -287,6 +287,9 @@ hrtimer_forward(struct hrtimer *timer, const ktime_t interval)
if (delta.tv64 < 0)
return 0;
+ if (interval.tv64 < timer->base->resolution.tv64)
+ interval.tv64 = timer->base->resolution.tv64;
+
if (unlikely(delta.tv64 >= interval.tv64)) {
nsec_t incr = ktime_to_ns(interval);