]> git.baikalelectronics.ru Git - kernel.git/commit
ACPI: PM: s2idle: Avoid possible race related to the EC GPE
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 11 Feb 2020 09:11:02 +0000 (10:11 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 11 Feb 2020 09:11:02 +0000 (10:11 +0100)
commit234aee2ded88c7de4da4dda4ae40fa5121ca349a
tree446902616310615718c4615e9dbe1a1ea2e5a914
parent7d30256ca64f0195f1e564ef170c5039bc063743
ACPI: PM: s2idle: Avoid possible race related to the EC GPE

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: 115cde26a372 ("PM: sleep: Simplify suspend-to-idle control flow")
Cc: 5.4+ <stable@vger.kernel.org> # 5.4+
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/sleep.c
include/linux/suspend.h
kernel/power/suspend.c