| From: Anna-Maria Gleixner <anna-maria@linutronix.de> |
| Date: Thu, 31 Aug 2017 11:03:07 +0000 |
| Subject: [PATCH 13/25] hrtimer: Split out code from hrtimer_start_range_ns() |
| for reuse |
| |
| Preparatory patch for softirq based hrtimers. No functional change. |
| |
| Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| kernel/time/hrtimer.c | 44 ++++++++++++++++++++++++-------------------- |
| 1 file changed, 24 insertions(+), 20 deletions(-) |
| |
| --- a/kernel/time/hrtimer.c |
| +++ b/kernel/time/hrtimer.c |
| @@ -909,22 +909,11 @@ static inline ktime_t hrtimer_update_low |
| return tim; |
| } |
| |
| -/** |
| - * hrtimer_start_range_ns - (re)start an hrtimer on the current CPU |
| - * @timer: the timer to be added |
| - * @tim: expiry time |
| - * @delta_ns: "slack" range for the timer |
| - * @mode: expiry mode: absolute (HRTIMER_MODE_ABS) or |
| - * relative (HRTIMER_MODE_REL) |
| - */ |
| -void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, |
| - u64 delta_ns, const enum hrtimer_mode mode) |
| +static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, |
| + u64 delta_ns, const enum hrtimer_mode mode, |
| + struct hrtimer_clock_base *base) |
| { |
| - struct hrtimer_clock_base *base, *new_base; |
| - unsigned long flags; |
| - int leftmost; |
| - |
| - base = lock_hrtimer_base(timer, &flags); |
| + struct hrtimer_clock_base *new_base; |
| |
| /* Remove an active timer from the queue: */ |
| remove_hrtimer(timer, base, true); |
| @@ -939,13 +928,28 @@ void hrtimer_start_range_ns(struct hrtim |
| /* Switch the timer base, if necessary: */ |
| new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED); |
| |
| - leftmost = enqueue_hrtimer(timer, new_base); |
| - if (!leftmost) |
| - goto unlock; |
| + return enqueue_hrtimer(timer, new_base); |
| +} |
| + |
| +/** |
| + * hrtimer_start_range_ns - (re)start an hrtimer on the current CPU |
| + * @timer: the timer to be added |
| + * @tim: expiry time |
| + * @delta_ns: "slack" range for the timer |
| + * @mode: expiry mode: absolute (HRTIMER_MODE_ABS) or |
| + * relative (HRTIMER_MODE_REL) |
| + */ |
| +void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, |
| + u64 delta_ns, const enum hrtimer_mode mode) |
| +{ |
| + struct hrtimer_clock_base *base; |
| + unsigned long flags; |
| + |
| + base = lock_hrtimer_base(timer, &flags); |
| |
| - hrtimer_reprogram(timer); |
| + if (__hrtimer_start_range_ns(timer, tim, delta_ns, mode, base)) |
| + hrtimer_reprogram(timer); |
| |
| -unlock: |
| unlock_hrtimer_base(timer, &flags); |
| } |
| EXPORT_SYMBOL_GPL(hrtimer_start_range_ns); |