• Nicholas Piggin's avatar
    powerpc/time: avoid programming DEC at the start of the timer interrupt · c8455020
    Nicholas Piggin authored
    Setting DEC to maximum at the start of the timer interrupt is not
    necessary and can be avoided for performance when MSR[EE] is not
    enabled during the handler as explained in commit 0faf20a1
    ("powerpc/64s/interrupt: Don't enable MSR[EE] in irq handlers unless
    perf is in use"), where this change was first attempted.
    
    The idea is that the timer interrupt runs with MSR[EE]=0, and at the end
    of the interrupt DEC is programmed to the next timer interval, so there
    is no need to clear the decrementer exception before then.
    
    When the above commit was merged, that was not quite true. The low res
    timer subsystem had some cases in the oneshot timer code where if the
    tick was to be stopped and no timers active, the clock device would not
    get the ->set_state_oneshot_stopped() call, so DEC would not get
    reprogrammed, and this would hang taking continual timer interrupts.
    
    So this was reverted in commit d2b9be1f ("powerpc/time: Always set
    decrementer in timer_interrupt()"), which was a partial revert of the
    above commit.
    
    Commit 62c1256d ("timers/nohz: Switch to ONESHOT_STOPPED in the
    low-res handler when the tick is stopped") was later merged to fix this
    missing case in the timer subsystem, so now the behaviour can be
    restored.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220909142457.278032-1-npiggin@gmail.com
    c8455020
time.c 26.2 KB