Patch "PM / s2idle: Clear the events_check_enabled flag" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
PM / s2idle: Clear the events_check_enabled flag
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
pm-s2idle-clear-the-events_check_enabled-flag.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Mon Dec 18 13:28:59 CET 2017
From: Rajat Jain <[email protected]>
Date: Tue, 31 Oct 2017 14:44:24 -0700
Subject: PM / s2idle: Clear the events_check_enabled flag
From: Rajat Jain <[email protected]>
[ Upstream commit 95b982b45122c57da2ee0b46cce70775e1d987af ]
Problem: This flag does not get cleared currently in the suspend or resume path in the following cases:
* In case some driver's suspend routine returns an error.
* Successful s2idle case
* etc?
Why is this a problem: What happens is that the next suspend attempt could fail even though the user did not enable the flag by writing to /sys/power/wakeup_count. This is 1 use case how the issue can be seen (but similar use case with driver suspend failure can be thought of):
1. Read /sys/power/wakeup_count
2. echo count > /sys/power/wakeup_count
3. echo freeze > /sys/power/wakeup_count
4. Let the system suspend, and wakeup the system using some wake source that calls pm_wakeup_event() e.g. power button or something.
5. Note that the combined wakeup count would be incremented due to the pm_wakeup_event() in the resume path.
6. After resuming the events_check_enabled flag is still set.
At this point if the user attempts to freeze again (without writing to /sys/power/wakeup_count), the suspend would fail even though there has been no wake event since the past resume.
Address that by clearing the flag just before a resume is completed, so that it is always cleared for the corner cases mentioned above.
--- kernel/power/suspend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/power/suspend.c +1 -1
@@ -437,7 +437,6 @@ static int suspend_enter(suspend_state_t error = suspend_ops->enter (state);trace_suspend_resume (TPS ("machine_suspend" ), state, false); - events_check_enabled = false; }else if (*wakeup) { error = -EBUSY ; }
@@ -582,6 +581,7 @@ static int enter_state(suspend_state_t spm_restore_gfp_mask (); Finish: + events_check_enabled = false;pm_pr_dbg ("Finishing wakeup.\n" );suspend_finish (); Unlock:
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/pm-s2idle-clear-the-events_check_enabled-flag.patch