On Fri, 26 Jul 2019 20:30:58 +0200
Thomas Gleixner <[email protected]> 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?

-- Steve


> +      *
> +      * 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;
>       sl->task = current;

Reply via email to