Skip to content
  • Thomas Gleixner's avatar
    PM / suspend: Prevent might sleep splats · c1a957d1
    Thomas Gleixner authored
    
    
    timekeeping suspend/resume calls read_persistent_clock() which takes
    rtc_lock. That results in might sleep warnings because at that point
    we run with interrupts disabled.
    
    We cannot convert rtc_lock to a raw spinlock as that would trigger
    other might sleep warnings.
    
    As a workaround we disable the might sleep warnings by setting
    system_state to SYSTEM_SUSPEND before calling sysdev_suspend() and
    restoring it to SYSTEM_RUNNING afer sysdev_resume(). There is no lock
    contention because hibernate / suspend to RAM is single-CPU at this
    point.
    
    In s2idle's case the system_state is set to SYSTEM_SUSPEND before
    timekeeping_suspend() which is invoked by the last CPU. In the resume
    case it set back to SYSTEM_RUNNING after timekeeping_resume() which is
    invoked by the first CPU in the resume case. The other CPUs will block
    on tick_freeze_lock.
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    [bigeasy: cover s2idle in tick_freeze() / tick_unfreeze()]
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    c1a957d1