diff options
Diffstat (limited to 'kernel/hrtimer.c')
-rw-r--r-- | kernel/hrtimer.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index ec4cb9f3e3b7..6a7938a0d513 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -135,7 +135,7 @@ EXPORT_SYMBOL_GPL(ktime_get_ts); | |||
135 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | 135 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) |
136 | { | 136 | { |
137 | ktime_t xtim, tomono; | 137 | ktime_t xtim, tomono; |
138 | struct timespec xts; | 138 | struct timespec xts, tom; |
139 | unsigned long seq; | 139 | unsigned long seq; |
140 | 140 | ||
141 | do { | 141 | do { |
@@ -145,10 +145,11 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | |||
145 | #else | 145 | #else |
146 | xts = xtime; | 146 | xts = xtime; |
147 | #endif | 147 | #endif |
148 | tom = wall_to_monotonic; | ||
148 | } while (read_seqretry(&xtime_lock, seq)); | 149 | } while (read_seqretry(&xtime_lock, seq)); |
149 | 150 | ||
150 | xtim = timespec_to_ktime(xts); | 151 | xtim = timespec_to_ktime(xts); |
151 | tomono = timespec_to_ktime(wall_to_monotonic); | 152 | tomono = timespec_to_ktime(tom); |
152 | base->clock_base[CLOCK_REALTIME].softirq_time = xtim; | 153 | base->clock_base[CLOCK_REALTIME].softirq_time = xtim; |
153 | base->clock_base[CLOCK_MONOTONIC].softirq_time = | 154 | base->clock_base[CLOCK_MONOTONIC].softirq_time = |
154 | ktime_add(xtim, tomono); | 155 | ktime_add(xtim, tomono); |
@@ -644,6 +645,12 @@ hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) | |||
644 | orun++; | 645 | orun++; |
645 | } | 646 | } |
646 | timer->expires = ktime_add(timer->expires, interval); | 647 | timer->expires = ktime_add(timer->expires, interval); |
648 | /* | ||
649 | * Make sure, that the result did not wrap with a very large | ||
650 | * interval. | ||
651 | */ | ||
652 | if (timer->expires.tv64 < 0) | ||
653 | timer->expires = ktime_set(KTIME_SEC_MAX, 0); | ||
647 | 654 | ||
648 | return orun; | 655 | return orun; |
649 | } | 656 | } |