PM / Sleep: call early resume handlers when suspend_noirq fails
Subsystems (4)
PATCH 1/1 PM / Sleep: call early resume handlers when suspend_noirq fails
Commit cf579dfb82550e34de7ccf3ef090d8b834ccd3a9 (PM / Sleep: Introduce "late suspend" and "early resume" of devices) introduced a bug where suspend_late handlers would be called, but if dpm_suspend_noirq returned an error the early_resume handlers would never be called. All devices would end up on the dpm_late_early_list, and would never be resumed again.
Fix it by calling dpm_resume_early when dpm_suspend_noirq returns an error.
--- drivers/base/power/main.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)
drivers/base/power/main.c +9 -1
@@ -989,8 +989,16 @@ static int dpm_suspend_late(pm_message_t state)int dpm_suspend_end (pm_message_t state) {int error =dpm_suspend_late (state); +if (error) +return error; -return error ? :dpm_suspend_noirq (state); + error =dpm_suspend_noirq (state); +if (error) { +dpm_resume_early (state); +return error; + } + +return 0 ; }EXPORT_SYMBOL_GPL (dpm_suspend_end);
Signature · 1 line
1.7.7.3
Rafael J. Wysocki
AppliedQuoted 11 lines · Colin Cross
Commit
cf579dfb82550e34de7ccf3ef090d8b834ccd3a9(PM / Sleep: Introduce "late suspend" and "early resume" of devices) introduced a bug wheresuspend_latehandlers would be called, but ifdpm_suspend_noirqreturned an error theearly_resumehandlers would never be called. All devices would end up on thedpm_late_early_list, and would never be resumed again.Fix it by calling
dpm_resume_earlywhendpm_suspend_noirqreturns an error.Signed-off-by Colin Cross <[email protected]>
Nice catch, thanks!
Applied, with a CC to -stable.
Thanks,
Rafael
Quoted 27 lines
--- drivers/base/power/main.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)drivers/base/power/main.c +9
-1@@ -989,8 +989,16 @@ static int dpm_suspend_late(pm_message_t state)int dpm_suspend_end (pm_message_t state) {int error =dpm_suspend_late (state); +if (error) +return error; -return error ? :dpm_suspend_noirq (state); + error =dpm_suspend_noirq (state); +if (error) { +dpm_resume_early (state); +return error; + } + +return 0 ; }EXPORT_SYMBOL_GPL (dpm_suspend_end);