On Fri, 26 Jul 2019, Steven Rostedt wrote: > On Fri, 26 Jul 2019 20:30:58 +0200 > Thomas Gleixner <t...@linutronix.de> wrote: > > > +++ b/kernel/time/hrtimer.c > > @@ -1662,6 +1662,30 @@ static enum hrtimer_restart hrtimer_wake > > static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, > > clockid_t clock_id, enum hrtimer_mode mode) > > { > > + /* > > + * On PREEMPT_RT enabled kernels hrtimers which are not explicitely > > + * marked for hard interrupt expiry mode are moved into soft > > + * interrupt context either for latency reasons or because the > > + * hrtimer callback takes regular spinlocks or invokes other > > + * functions which are not suitable for hard interrupt context on > > + * PREEMPT_RT. > > Have we marked all timer handlers that have normal spin_locks as > HRTIMER_MODE_SOFT? Otherwise, can't we switch one to hard below and > having their handler grab a spin_lock/mutex in hard interrupt context > in RT?
See patch 09/12. We move all timers into soft mode which are not marked MODE_HARD. > > + * > > + * The hrtimer_sleeper callback is RT compatible in hard interrupt ^^^^^^^^^^^^^^ > > + * context, but there is a latency concern: Untrusted userspace can > > + * spawn many threads which arm timers for the same expiry time on > > + * the same CPU. That causes a latency spike due to the wakeup of > > + * a gazillion threads. > > + * > > + * OTOH, priviledged real-time user space applications rely on the > > + * low latency of hard interrupt wakeups. If the current task is in > > + * a real-time scheduling class, mark the mode for hard interrupt > > + * expiry. > > + */ > > + if (IS_ENABLED(CONFIG_PREEMPT_RT)) { > > + if (task_is_realtime(current) && !(mode & HRTIMER_MODE_SOFT)) > > + mode |= HRTIMER_MODE_HARD; > > + } > > + > > __hrtimer_init(&sl->timer, clock_id, mode); > > sl->timer.function = hrtimer_wakeup; It's the wakeup function and nothing is supposed to override that. Thanks, tglx