• Rafael J. Wysocki's avatar
    ACPI: PM: s2idle: Avoid possible race related to the EC GPE · e3728b50
    Rafael J. Wysocki authored
    It is theoretically possible for the ACPI EC GPE to be set after the
    s2idle_ops->wake() called from s2idle_loop() has returned and before
    the subsequent pm_wakeup_pending() check is carried out.  If that
    happens, the resulting wakeup event will cause the system to resume
    even though it may be a spurious one.
    
    To avoid that race, first make the ->wake() callback in struct
    platform_s2idle_ops return a bool value indicating whether or not
    to let the system resume and rearrange s2idle_loop() to use that
    value instad of the direct pm_wakeup_pending() call if ->wake() is
    present.
    
    Next, rework acpi_s2idle_wake() to process EC events and check
    pm_wakeup_pending() before re-arming the SCI for system wakeup
    to prevent it from triggering prematurely and add comments to
    that function to explain the rationale for the new code flow.
    
    Fixes: 56b99184 ("PM: sleep: Simplify suspend-to-idle control flow")
    Cc: 5.4+ <stable@vger.kernel.org> # 5.4+
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    e3728b50
suspend.c 15.3 KB