|
@@ -905,22 +905,11 @@ static inline ktime_t hrtimer_update_lowres(struct hrtimer *timer, ktime_t tim,
|
|
return tim;
|
|
return tim;
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * hrtimer_start_range_ns - (re)start an hrtimer
|
|
|
|
- * @timer: the timer to be added
|
|
|
|
- * @tim: expiry time
|
|
|
|
- * @delta_ns: "slack" range for the timer
|
|
|
|
- * @mode: timer mode: absolute (HRTIMER_MODE_ABS) or
|
|
|
|
- * relative (HRTIMER_MODE_REL), and pinned (HRTIMER_MODE_PINNED)
|
|
|
|
- */
|
|
|
|
-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 an active timer from the queue: */
|
|
remove_hrtimer(timer, base, true);
|
|
remove_hrtimer(timer, base, true);
|
|
@@ -935,12 +924,27 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
|
/* Switch the timer base, if necessary: */
|
|
/* Switch the timer base, if necessary: */
|
|
new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
|
|
new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
|
|
|
|
|
|
- leftmost = enqueue_hrtimer(timer, new_base, mode);
|
|
|
|
- if (!leftmost)
|
|
|
|
- goto unlock;
|
|
|
|
|
|
+ return enqueue_hrtimer(timer, new_base, mode);
|
|
|
|
+}
|
|
|
|
+/**
|
|
|
|
+ * hrtimer_start_range_ns - (re)start an hrtimer
|
|
|
|
+ * @timer: the timer to be added
|
|
|
|
+ * @tim: expiry time
|
|
|
|
+ * @delta_ns: "slack" range for the timer
|
|
|
|
+ * @mode: timer mode: absolute (HRTIMER_MODE_ABS) or
|
|
|
|
+ * relative (HRTIMER_MODE_REL), and pinned (HRTIMER_MODE_PINNED)
|
|
|
|
+ */
|
|
|
|
+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);
|
|
|
|
+
|
|
|
|
+ if (__hrtimer_start_range_ns(timer, tim, delta_ns, mode, base))
|
|
|
|
+ hrtimer_reprogram(timer);
|
|
|
|
|
|
- hrtimer_reprogram(timer);
|
|
|
|
-unlock:
|
|
|
|
unlock_hrtimer_base(timer, &flags);
|
|
unlock_hrtimer_base(timer, &flags);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(hrtimer_start_range_ns);
|
|
EXPORT_SYMBOL_GPL(hrtimer_start_range_ns);
|