• Anna-Maria Gleixner's avatar
    hrtimer: Prepare support for PREEMPT_RT · f61eff83
    Anna-Maria Gleixner authored
    When PREEMPT_RT is enabled, the soft interrupt thread can be preempted.  If
    the soft interrupt thread is preempted in the middle of a timer callback,
    then calling hrtimer_cancel() can lead to two issues:
    
      - If the caller is on a remote CPU then it has to spin wait for the timer
        handler to complete. This can result in unbound priority inversion.
    
      - If the caller originates from the task which preempted the timer
        handler on the same CPU, then spin waiting for the timer handler to
        complete is never going to end.
    
    To avoid these issues, add a new lock to the timer base which is held
    around the execution of the timer callbacks. If hrtimer_cancel() detects
    that the timer callback is currently running, it blocks on the expiry
    lock. When the callback is finished, the expiry lock is dropped by the
    softirq thread which wakes up the waiter and the system makes progress.
    
    This addresses both the priority inversion and the life lock issues.
    
    The same issue can happen in virtual machines when the vCPU which runs a
    timer callback is scheduled out. If a second vCPU of the same guest calls
    hrtimer_cancel() it will spin wait for the other vCPU to be scheduled back
    in. The expiry lock mechanism would avoid that. It'd be trivial to enable
    this when paravirt spinlocks are enabled in a guest, but it's not clear
    whether this is an actual problem in the wild, so for now it's an RT only
    mechanism.
    
    [ tglx: Refactored it for mainline ]
    Signed-off-by: default avatarAnna-Maria Gleixner <anna-maria@linutronix.de>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20190726185753.737767218@linutronix.de
    
    
    f61eff83
hrtimer.c 59.7 KB