mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
ACPI: PM: s2idle: Avoid possible race related to the EC GPE
commit e3728b50cd9be7d4b1469447cdf1feb93e3b7adb upstream.
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: 56b9918490 ("PM: sleep: Simplify suspend-to-idle control flow")
Cc: 5.4+ <[email protected]> # 5.4+
Signed-off-by: Rafael J. Wysocki <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
parent
b9f78af90d
commit
0671627a5f
3 changed files with 37 additions and 18 deletions
|
|
@ -131,11 +131,12 @@ static void s2idle_loop(void)
|
|||
* to avoid them upfront.
|
||||
*/
|
||||
for (;;) {
|
||||
if (s2idle_ops && s2idle_ops->wake)
|
||||
s2idle_ops->wake();
|
||||
|
||||
if (pm_wakeup_pending())
|
||||
if (s2idle_ops && s2idle_ops->wake) {
|
||||
if (s2idle_ops->wake())
|
||||
break;
|
||||
} else if (pm_wakeup_pending()) {
|
||||
break;
|
||||
}
|
||||
|
||||
pm_wakeup_clear(false);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue