From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752442AbbF2NVX (ORCPT ); Mon, 29 Jun 2015 09:21:23 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:53896 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752033AbbF2NVP (ORCPT ); Mon, 29 Jun 2015 09:21:15 -0400 X-AuditID: cbfee691-f79ca6d00000456a-07-55914649852e From: Nitish Ambastha To: rjw@rjwysocki.net, pavel@ucw.cz, len.brown@intel.com, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: cpgs@samsung.com, nitish.a@samsung.com, nits.ambastha@gmail.com Subject: [PATCHv2 1/1] kernel/power/autosleep.c: check for pm_suspend() return before queueing suspend again Date: Tue, 30 Jun 2015 00:24:14 +0530 Message-id: <1435604054-29711-1-git-send-email-nitish.a@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1435581297-20271-1-git-send-email-nitish.a@samsung.com> References: <1435581297-20271-1-git-send-email-nitish.a@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrELMWRmVeSWpSXmKPExsWyRsSkTtfTbWKowfZ2eYuXhzQtZk3Zy2Rx edccNovPvUcYLZ4sfMJkcbR3A4vF3VNH2SzOnL7E6sDhsXPWXXaPxXteMnlsudrO4tG3ZRWj x4rV39k9Pm+SC2CL4rJJSc3JLEst0rdL4MrobN7IWPBZsOJI5z72BsYNfF2MnBwSAiYSK189 Z4SwxSQu3FvP1sXIxSEksJRRYtrvBkaYoj+LXjNDJBYxSpx4f5QRwvnNKPGueR1YFZuAjsTn bR/ZQGwRgSKJXU//gcWZBZwlWvtXsXQxcnAIC+RJnNztAhJmEVCVWPv3FlgJr4CLxIF1v5lA SiQEFCTmTLIBMTkFXCW6m6NAKoSAKhadP8YOslVCYBW7xPJ1qxghxghIfJt8iAWiVVZi0wFm iJMlJQ6uuMEygVF4ASPDKkbR1ILkguKk9CJTveLE3OLSvHS95PzcTYzAoD/979nEHYz3D1gf YhTgYFTi4f36bEKoEGtiWXFl7iFGU6ANE5mlRJPzgbGVVxJvaGxmZGFqYmpsZG5ppiTOqyP9 M1hIID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDY1P7VKd0w60nJZKMq7fenffXR9z8noO/x95r C6cHvX3dJvY3bMXOxOf5u62kDm4PLnzvI2fJ1JvgWWbxUS3Y/9iPxbF3Cj2u7DZ51DDnzC2N MAnOc22Ln6j/EpW925T5TLLQaE34vdgTBz58U+00NNafLPEnpb3o2WGXCqbUS0q3iqwW79SV UGIpzkg01GIuKk4EACDmfBF1AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrDIsWRmVeSWpSXmKPExsVy+t9jAV1Pt4mhBuvOCFm8PKRpMWvKXiaL y7vmsFl87j3CaPFk4RMmi6O9G1gs7p46ymZx5vQlVgcOj52z7rJ7LN7zksljy9V2Fo++LasY PVas/s7u8XmTXABbVAOjTUZqYkpqkUJqXnJ+SmZeuq2Sd3C8c7ypmYGhrqGlhbmSQl5ibqqt kotPgK5bZg7QQUoKZYk5pUChgMTiYiV9O0wTQkPcdC1gGiN0fUOC4HqMDNBAwhrGjM7mjYwF nwUrjnTuY29g3MDXxcjJISFgIvFn0WtmCFtM4sK99WxdjFwcQgKLGCVOvD/KCOH8ZpR417yO EaSKTUBH4vO2j2wgtohAkcSup//A4swCzhKt/atYuhg5OIQF8iRO7nYBCbMIqEqs/XsLrIRX wEXiwLrfTCAlEgIKEnMm2YCYnAKuEt3NUSAVQkAVi84fY5/AyLuAkWEVo2hqQXJBcVJ6rpFe cWJucWleul5yfu4mRnBMPZPewbiqweIQowAHoxIPr8OLCaFCrIllxZW5hxglOJiVRHgvbwYK 8aYkVlalFuXHF5XmpBYfYjQFumkis5Rocj4w3vNK4g2NTcxNjU0tTSxMzCyVxHlP5vuECgmk J5akZqemFqQWwfQxcXBKNTCmHjyZ5Rfh0fHJa5XVGbfnrXt4uvfUvrp+7aHWnKuzkx6VaF29 qe/3aU2y5JZ247U8d5g2mW1NnLLaSKEu7MTt2zKi0crbmEuz/4poSn2U4bEyt4192tc6bcaJ p4b7WKKsRCo4JtfNan1TJdrfvoil5uahbw9e8xhlTU7a8MG1rCtM7pHZjjlKLMUZiYZazEXF iQAylivhvwIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Prevent tight loop for suspend-resume when some devices failed to suspend If some devices failed to suspend, we monitor this error in try_to_suspend(). pm_suspend() is already an 'int' returning function, how about checking return from pm_suspend() before queueing suspend again? For devices which do not register for pending events, this will prevent tight loop for suspend-resume in suspend abort scenarios due to device suspend failures Signed-off-by: Nitish Ambastha --- v2: Rearranged code to make wait entry shared with existing one as suggested by Pavel Machek Corrected log level from pr_info to pr_err for failure log Added return check for hibernate() kernel/power/autosleep.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/kernel/power/autosleep.c b/kernel/power/autosleep.c index 9012ecf..1a86698 100644 --- a/kernel/power/autosleep.c +++ b/kernel/power/autosleep.c @@ -26,6 +26,7 @@ static struct wakeup_source *autosleep_ws; static void try_to_suspend(struct work_struct *work) { unsigned int initial_count, final_count; + int error = 0; if (!pm_get_wakeup_count(&initial_count, true)) goto out; @@ -43,22 +44,30 @@ static void try_to_suspend(struct work_struct *work) return; } if (autosleep_state >= PM_SUSPEND_MAX) - hibernate(); + error = hibernate(); else - pm_suspend(autosleep_state); + error = pm_suspend(autosleep_state); mutex_unlock(&autosleep_lock); + if (error) { + pr_err("PM: suspend returned (%d)\n", error); + goto wait; + } + if (!pm_get_wakeup_count(&final_count, false)) goto out; + if (final_count != initial_count) + goto out; + + wait: /* - * If the wakeup occured for an unknown reason, wait to prevent the - * system from trying to suspend and waking up in a tight loop. + * If some devices failed to suspend or if the wakeup ocurred + * for an unknown reason, wait to prevent the system from + * trying to suspend and waking up in a tight loop. */ - if (final_count == initial_count) - schedule_timeout_uninterruptible(HZ / 2); - + schedule_timeout_uninterruptible(HZ / 2); out: queue_up_suspend_work(); } -- 1.7.9.5