hrtimer: Provide hrtimer_sleeper_start_expires()
authorThomas Gleixner <tglx@linutronix.de>
Tue, 30 Jul 2019 19:03:53 +0000 (21:03 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 1 Aug 2019 15:43:15 +0000 (17:43 +0200)
hrtimer_sleepers will gain a scheduling class dependent treatment on
PREEMPT_RT. Create a wrapper around hrtimer_start_expires() to make that
possible.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
include/linux/hrtimer.h
kernel/time/hrtimer.c

index 0df373bed3d745525f9624d2070a601f19dedd81..24072a0942c002a48109885bd195554292f0822c 100644 (file)
@@ -408,6 +408,9 @@ static inline void hrtimer_start_expires(struct hrtimer *timer,
        hrtimer_start_range_ns(timer, soft, delta, mode);
 }
 
+void hrtimer_sleeper_start_expires(struct hrtimer_sleeper *sl,
+                                  enum hrtimer_mode mode);
+
 static inline void hrtimer_restart(struct hrtimer *timer)
 {
        hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
index bb55d62f631e5c8beb2172aa752c55f4a378d459..dab1ea1a99d02f43f768f0d995ec4283115f942a 100644 (file)
@@ -1650,6 +1650,21 @@ static enum hrtimer_restart hrtimer_wakeup(struct hrtimer *timer)
        return HRTIMER_NORESTART;
 }
 
+/**
+ * hrtimer_sleeper_start_expires - Start a hrtimer sleeper timer
+ * @sl:                sleeper to be started
+ * @mode:      timer mode abs/rel
+ *
+ * Wrapper around hrtimer_start_expires() for hrtimer_sleeper based timers
+ * to allow PREEMPT_RT to tweak the delivery mode (soft/hardirq context)
+ */
+void hrtimer_sleeper_start_expires(struct hrtimer_sleeper *sl,
+                                  enum hrtimer_mode mode)
+{
+       hrtimer_start_expires(&sl->timer, mode);
+}
+EXPORT_SYMBOL_GPL(hrtimer_sleeper_start_expires);
+
 static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
                                   clockid_t clock_id, enum hrtimer_mode mode)
 {
@@ -1698,7 +1713,7 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod
 
        do {
                set_current_state(TASK_INTERRUPTIBLE);
-               hrtimer_start_expires(&t->timer, mode);
+               hrtimer_sleeper_start_expires(t, mode);
 
                if (likely(t->task))
                        freezable_schedule();
@@ -1953,7 +1968,7 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
 
        hrtimer_init_sleeper_on_stack(&t, clock_id, mode);
        hrtimer_set_expires_range_ns(&t.timer, *expires, delta);
-       hrtimer_start_expires(&t.timer, mode);
+       hrtimer_sleeper_start_expires(&t, mode);
 
        if (likely(t.task))
                schedule();