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);
 
        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)
 {
 
        do {
                set_current_state(TASK_INTERRUPTIBLE);
-               hrtimer_start_expires(&t->timer, mode);
+               hrtimer_sleeper_start_expires(t, mode);
 
                if (likely(t->task))
                        freezable_schedule();
 
        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();