enum hrtimer_mode mode)
 {
        bool softtimer = !!(mode & HRTIMER_MODE_SOFT);
-       int base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0;
        struct hrtimer_cpu_base *cpu_base;
+       int base;
+
+       /*
+        * On PREEMPT_RT enabled kernels hrtimers which are not explicitely
+        * marked for hard interrupt expiry mode are moved into soft
+        * interrupt context for latency reasons and because the callbacks
+        * can invoke functions which might sleep on RT, e.g. spin_lock().
+        */
+       if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(mode & HRTIMER_MODE_HARD))
+               softtimer = true;
 
        memset(timer, 0, sizeof(struct hrtimer));
 
        if (clock_id == CLOCK_REALTIME && mode & HRTIMER_MODE_REL)
                clock_id = CLOCK_MONOTONIC;
 
+       base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0;
        base += hrtimer_clockid_to_base(clock_id);
        timer->is_soft = softtimer;
        timer->is_hard = !softtimer;