From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752162AbbGMOe3 (ORCPT ); Mon, 13 Jul 2015 10:34:29 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:44321 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751628AbbGMOe1 (ORCPT ); Mon, 13 Jul 2015 10:34:27 -0400 X-AuditID: cbfee68e-f79c56d000006efb-a7-55a3cc71bc2e 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: [PATCHv3 1/1] kernel/power/autosleep.c: check for pm_suspend() return before queueing suspend again Date: Tue, 14 Jul 2015 01:38:02 +0530 Message-id: <1436818082-24087-1-git-send-email-nitish.a@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1435604054-29711-1-git-send-email-nitish.a@samsung.com> References: <1435604054-29711-1-git-send-email-nitish.a@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrMLMWRmVeSWpSXmKPExsWyRsSkVrfwzOJQg9m7JCxeHtK0mDVlL5PF 5V1z2Cw+9x5htHiy8AmTxdHeDSwWd08dZbM4c/oSqwOHx85Zd9k9Fu95yeSx5Wo7i0ffllWM HitWf2f3+LxJLoAtissmJTUnsyy1SN8ugSvjz+w29oLtQhVnpraxNDA28ncxcnJICJhIPDzR wQJhi0lcuLeerYuRi0NIYCmjxJqXq1hhinoWX2cHsYUEFjFKHN3JAlH0m1Fi/f0VjCAJNgEd ic/bPrKB2CICRRK7nv4DizMLOEu09q8C2yAskCex4Np/sKEsAqoSa1+1gcV5BVwk5t6aALSA A2iZgsScSTYgYU4BV4kPk08wQ+x1kZhzYwEryF4JgVXsEvM2trBDzBGQ+Db5EAtEr6zEpgPM EDdLShxccYNlAqPwAkaGVYyiqQXJBcVJ6UVGesWJucWleel6yfm5mxiBYX/637O+HYw3D1gf YhTgYFTi4b2xbVGoEGtiWXFl7iFGU6ANE5mlRJPzgdGVVxJvaGxmZGFqYmpsZG5ppiTOmyD1 M1hIID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDo/TJooeWSql3tomeffx9Vv+NSOFpauWeVxbO fGj8MV/U9YH7JP+5Z9qvb7oZ937SwxSXGayd893lAx6y+nbPqXDYzM8+L+qp6Zx7NyZ9nbS4 5U7J6rX28XpbgrQ+vlbbziPuqjNR8ka3654zTJyGXIb57HHB7vO3Ki52XL1RdfNLj2aB0gNx D5RYijMSDbWYi4oTAdHbLER2AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrLIsWRmVeSWpSXmKPExsVy+t9jAd3CM4tDDbb/EbB4eUjTYtaUvUwW l3fNYbP43HuE0eLJwidMFkd7N7BY3D11lM3izOlLrA4cHjtn3WX3WLznJZPHlqvtLB59W1Yx eqxY/Z3d4/MmuQC2qAZGm4zUxJTUIoXUvOT8lMy8dFsl7+B453hTMwNDXUNLC3MlhbzE3FRb JRefAF23zBygg5QUyhJzSoFCAYnFxUr6dpgmhIa46VrANEbo+oYEwfUYGaCBhDWMGX9mt7EX bBeqODO1jaWBsZG/i5GTQ0LARKJn8XV2CFtM4sK99WwgtpDAIkaJoztZuhi5gOzfjBLr769g BEmwCehIfN72EaxIRKBIYtfTf2BxZgFnidb+VSwgtrBAnsSCa/9ZQWwWAVWJta/awOK8Ai4S c29NAFrGAbRMQWLOJBuQMKeAq8SHySeYIfa6SMy5sYB1AiPvAkaGVYyiqQXJBcVJ6bmGesWJ ucWleel6yfm5mxjBUfVMagfjygaLQ4wCHIxKPLwNWxaFCrEmlhVX5h5ilOBgVhLhTTyyOFSI NyWxsiq1KD++qDQntfgQoynQUROZpUST84ERn1cSb2hsYm5qbGppYmFiZqkkznsy3ydUSCA9 sSQ1OzW1ILUIpo+Jg1OqgbHulX4o81XNq2kLkkWqeFiu7XryUHfijTO8RndE9r/ltZwaUztR zrpr75GrEiGPpy5/66l64yjDFasolpvvzb/2f5jn0JqgdkKztlimb1GvUhjL04AX/8uz+M55 if9seDHZkfvh8R858+rWFfVFCMwMniERbDvJQIFtv0HUquxznR8uCvn4vFViKc5INNRiLipO BAAPf5bTwAIAAA== 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() v3: Restructured code as suggested by Rafael J Wysocki kernel/power/autosleep.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/kernel/power/autosleep.c b/kernel/power/autosleep.c index 9012ecf..e458d0c 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; if (!pm_get_wakeup_count(&initial_count, true)) goto out; @@ -42,23 +43,20 @@ static void try_to_suspend(struct work_struct *work) mutex_unlock(&autosleep_lock); return; } - if (autosleep_state >= PM_SUSPEND_MAX) - hibernate(); - else - pm_suspend(autosleep_state); - mutex_unlock(&autosleep_lock); + error = autosleep_state < PM_SUSPEND_MAX ? + pm_suspend(autosleep_state) : hibernate(); - if (!pm_get_wakeup_count(&final_count, false)) - goto out; + mutex_unlock(&autosleep_lock); /* - * 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) + if (error || (pm_get_wakeup_count(&final_count, false) + && (final_count == initial_count))) schedule_timeout_uninterruptible(HZ / 2); - out: queue_up_suspend_work(); } -- 1.7.9.5