• Chen Yu's avatar
    PM: s2idle: Clear _TIF_POLLING_NRFLAG before suspend to idle · 81e67375
    Chen Yu authored
    Suspend to idle was found to not work on Goldmont CPU recently.
    
    The issue happens due to:
    
     1. On Goldmont the CPU in idle can only be woken up via IPIs,
        not POLLING mode, due to commit 08e237fa ("x86/cpu: Add
        workaround for MONITOR instruction erratum on Goldmont based
        CPUs")
    
     2. When the CPU is entering suspend to idle process, the
        _TIF_POLLING_NRFLAG remains on, because cpuidle_enter_s2idle()
        doesn't match call_cpuidle() exactly.
    
     3. Commit b2a02fc4 ("smp: Optimize send_call_function_single_ipi()")
        makes use of _TIF_POLLING_NRFLAG to avoid sending IPIs to idle
        CPUs.
    
     4. As a result, some IPIs related functions might not work
        well during suspend to idle on Goldmont. For example, one
        suspected victim:
    
        tick_unfreeze() -> timekeeping_resume() -> hrtimers_resume()
        -> clock_was_set() -> on_each_cpu() might wait forever,
        because the IPIs will not be sent to the CPUs which are
        sleeping with _TIF_POLLING_NRFLAG set, and Goldmont CPU
        could not be woken up by only setting _TIF_NEED_RESCHED
        on the monitor address.
    
    To avoid that, clear the _TIF_POLLING_NRFLAG flag before invoking
    enter_s2idle_proper() in cpuidle_enter_s2idle() in analogy with the
    call_cpuidle() code flow.
    
    Fixes: b2a02fc4 ("smp: Optimize send_call_function_single_ipi()")
    Suggested-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Suggested-by: default avatarRafael J. Wysocki <rafael@kernel.org>
    Reported-by: default avatarkbuild test robot <lkp@intel.com>
    Signed-off-by: default avatarChen Yu <yu.c.chen@intel.com>
    [ rjw: Subject / changelog ]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    81e67375
cpuidle.c 17.8 KB