Skip to content
  • Anna-Maria Gleixner's avatar
    hrtimer: Unify remote enqueue handling · 14c80341
    Anna-Maria Gleixner authored
    
    
    hrtimer_reprogram() is conditionally invoked from hrtimer_start_range_ns()
    when hrtimer_cpu_base.hres_active is true.
    
    In the !hres_active case there is a special condition for the nohz_active
    case:
    
      If the newly enqueued timer expires before the first expiring timer on a
      remote CPU then the remote CPU needs to be notified and woken up from a
      NOHZ idle sleep to take the new first expiring timer into account.
    
    Previous changes have already established the prerequisites to make the
    remote enqueue behaviour the same whether high resolution mode is active or
    not:
    
      If the to be enqueued timer expires before the first expiring timer on a
      remote CPU, then it cannot be enqueued there.
    
    This was done for the high resolution mode because there is no way to
    access the remote CPU timer hardware. The same is true for NOHZ, but was
    handled differently by unconditionally enqueuing the timer and waking up
    the remote CPU so it can reprogram its timer. Again there is no compelling
    reason for this difference.
    
    hrtimer_check_target(), which makes the 'can remote enqueue' decision is
    already unconditional, but not yet functional because nothing updates
    hrtimer_cpu_base.expires_next in the !hres_active case.
    
    To unify this the following changes are required:
    
     1) Make the store of the new first expiry time unconditonal in
        hrtimer_reprogram() and check __hrtimer_hres_active() before proceeding
        to the actual hardware access. This check also lets the compiler
        eliminate the rest of the function in case of CONFIG_HIGH_RES_TIMERS=n.
    
     2) Invoke hrtimer_reprogram() unconditionally from
        hrtimer_start_range_ns()
    
     3) Remove the remote wakeup special case for the !high_res && nohz_active
        case.
    
    Confine the timers_nohz_active static key to timer.c which is the only user
    now.
    
    Signed-off-by: default avatarAnna-Maria Gleixner <anna-maria@linutronix.de>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: keescook@chromium.org
    Link: http://lkml.kernel.org/r/20171221104205.7269-21-anna-maria@linutronix.de
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    14c80341