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

Reply via email to