• Frederic Weisbecker's avatar
    posix-timers: Fix full dynticks CPUs kick on timer rescheduling · c925077c
    Frederic Weisbecker authored
    A posix CPU timer can be rearmed while it is firing or after it is
    notified with a signal. This can happen for example with timers that
    were set with a non zero interval in timer_settime().
    
    This rearming can happen in two places:
    
    1) On timer firing time, which happens on the target's tick. If the timer
    can't trigger a signal because it is ignored, it reschedules itself
    to honour the timer interval.
    
    2) On signal handling from the timer's notification target. This one
    can be a different task than the timer's target itself. Once the
    signal is notified, the notification target rearms the timer, again
    to honour the timer interval.
    
    When a timer is rearmed, we need to notify the full dynticks CPUs
    such that they restart their tick in case they are running tasks that
    may have a share in elapsing this timer.
    
    Now the 1st case above handles full dynticks CPUs with a call to
    posix_cpu_timer_kick_nohz() from the posix cpu timer firing code. But
    the second case ignores the fact that some CPUs may run non-idle tasks
    with their tick off. As a result, when a timer is resheduled after its signal
    notification, the full dynticks CPUs may completely ignore it and not
    tick on the timer as expected
    
    This patch fixes this bug by handling both cases in one. All we need
    is to move the kick to the rearming common code in posix_cpu_timer_schedule().
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Olivier Langlois <olivier@olivierlanglois.net>
    c925077c
posix-cpu-timers.c 39.5 KB