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 | } |
