Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752071AbdLFMHf (ORCPT ); Wed, 6 Dec 2017 07:07:35 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:23946 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751416AbdLFMHc (ORCPT ); Wed, 6 Dec 2017 07:07:32 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20171206120730epoutp02e407bb08557278e75815167d443257d8~9syvUaAxB3112731127epoutp02d X-AuditID: b6c32a4b-cdfff700000011c1-2c-5a27dd82adb1 Mime-Version: 1.0 Subject: [PATCH V1] PM: In kernel power management domain_pm created for async schedules Reply-To: vikas.bansal@samsung.com From: Vikas Bansal To: "rjw@rjwysocki.net" , "len.brown@intel.com" , "pavel@ucw.cz" , "gregkh@linuxfoundation.org" , "linux-pm@vger.kernel.org" , "linux-kernel@vger.kernel.org" X-Priority: 3 X-Content-Kind-Code: NORMAL X-Drm-Type: Y,confirm X-EPWebmail-Msg-Type: personal X-Msg-Generator: Mail X-Msg-Type: PERSONAL X-Reply-Demand: N Message-ID: <20171206120714epcms5p70081d5bc518c3bb5f9cca4f56b203abf@epcms5p7> Date: Wed, 06 Dec 2017 12:07:14 +0000 X-CMS-MailID: 20171206120714epcms5p70081d5bc518c3bb5f9cca4f56b203abf Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" X-Sendblock-Type: REQ_APPROVE X-MTR: 20171206120714epcms5p70081d5bc518c3bb5f9cca4f56b203abf CMS-TYPE: 105P X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupjk+LIzCtJLcpLzFFi42LZdlhTQ7fprnqUwe+LvBbNi9ezWcyaspfJ 4vKuOWwWn3uPMFrcPXWUzeLM6UusDmwei/e8ZPLYP3cNu8eWq+0sHitWf2f3+LxJLoA1KtUm IzUxJbVIITUvOT8lMy/dVsk7ON453tTMwFDX0NLCXEkhLzE31VbJxSdA1y0zB+gCJYWyxJxS oFBAYnGxkr6dTVF+aUmqQkZ+cYmtUrShoZGeoYG5npGRkZ6JaayVkSlQSUJqxtauNqaC+SoV J/78ZWtg/C3bxcjJISFgIvF54zW2LkYuDiGB3YwSR/5cZO1i5ODgFRCU+LtDGKRGWCBK4uW0 C4wgtpCAksSBu58YIeL6Ere/nWADsdkEdCXWHP/GBDJHRGADk8TqN63MEAt4JWa0P2WBsKUl ti/fyghhi0r8aYCJy0lM+7qGGSb+/th8qBoRidZ7Z6HighIPfu6GiktJnJ7dzAqyTEKgmVHi cst0JghnAqNE56pr7BBV5hL7j39lArF5BXwl/t65DTaJRUBVonfHRiaIGheJl73Twa5gFpCX 2P52DjPI98wCmhLrd+lDlMhKTD21DqrcVmLmxc1MEOV8Er2/nzDBPLljHoytJrHy3CJWCFtG 4lXLHjYI20Oi518/VNxRYtL3CawTGBVnIcJ6FpIjZiEcsYCReRWjZGpBcW56arFpgXFearle cWJucWleul5yfu4mRnBa1PLewbjpnM8hRgEORiUe3oAZalFCrIllxZW5hxglOJiVRHgvX1aP EuJNSaysSi3Kjy8qzUktPsRoCgyOicxSosn5wJSdVxJvaGJpYGJmZm5oYGBpoiTOe2xnaaSQ QHpiSWp2ampBahFMHxMHp1QDo1PdlctHcyK++3uX1v84+0b7nufVVbJxehHzdujWzfy5e+OU Sax/D1vPLv7HGzfJ8YLm8ZKpvHyn3bZJ6GxbsVtP/Tn/95muTzdcX/xaSvWw2gx93gTTbYzK vmardv/g3rebI7lA9pRw6W7X7c2MZpf2Ov90i1jTe+LNJv+TSQr6Lx9e9WnjvqvEUpyRaKjF XFScCACjMeH5oQMAAA== DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20171206120714epcms5p70081d5bc518c3bb5f9cca4f56b203abf X-RootMTR: 20171206120714epcms5p70081d5bc518c3bb5f9cca4f56b203abf References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4490 Lines: 149 Description: If there is a driver in system which starts creating async schedules just after resume (Same as our case, in which we faced issue). Then async_synchronize_full API in PM cores starts waiting for completion of async schedules created by that driver (Even though those are in a domain). Because of this kernel resume time is increased (We faces the same issue) and whole system is delayed. This problem can be solved by creating a domain for async schedules in PM core (As we solved in our case). Below patch is for solving this problem. Changelog: 1. Created Async domain domain_pm. 2. Converted async_schedule to async_schedule_domain. 3. Converted async_synchronize_full to async_synchronize_full_domain Signed-off-by: Vikas Bansal Signed-off-by: Anuj Gupta --- drivers/base/power/main.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index db2f044..042b034 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -39,6 +39,7 @@ #include "power.h" typedef int (*pm_callback_t)(struct device *); +static ASYNC_DOMAIN(domain_pm); /* * The entries in the dpm_list list are in a depth first order, simply @@ -615,7 +616,8 @@ void dpm_noirq_resume_devices(pm_message_t state) reinit_completion(&dev->power.completion); if (is_async(dev)) { get_device(dev); - async_schedule(async_resume_noirq, dev); + async_schedule_domain(async_resume_noirq, dev, + &domain_pm); } } @@ -641,7 +643,7 @@ void dpm_noirq_resume_devices(pm_message_t state) put_device(dev); } mutex_unlock(&dpm_list_mtx); - async_synchronize_full(); + async_synchronize_full_domain(&domain_pm); dpm_show_time(starttime, state, 0, "noirq"); trace_suspend_resume(TPS("dpm_resume_noirq"), state.event, false); } @@ -755,7 +757,8 @@ void dpm_resume_early(pm_message_t state) reinit_completion(&dev->power.completion); if (is_async(dev)) { get_device(dev); - async_schedule(async_resume_early, dev); + async_schedule_domain(async_resume_early, dev, + &domain_pm); } } @@ -780,7 +783,7 @@ void dpm_resume_early(pm_message_t state) put_device(dev); } mutex_unlock(&dpm_list_mtx); - async_synchronize_full(); + async_synchronize_full_domain(&domain_pm); dpm_show_time(starttime, state, 0, "early"); trace_suspend_resume(TPS("dpm_resume_early"), state.event, false); } @@ -919,7 +922,7 @@ void dpm_resume(pm_message_t state) reinit_completion(&dev->power.completion); if (is_async(dev)) { get_device(dev); - async_schedule(async_resume, dev); + async_schedule_domain(async_resume, dev, &domain_pm); } } @@ -946,7 +949,7 @@ void dpm_resume(pm_message_t state) put_device(dev); } mutex_unlock(&dpm_list_mtx); - async_synchronize_full(); + async_synchronize_full_domain(&domain_pm); dpm_show_time(starttime, state, 0, NULL); cpufreq_resume(); @@ -1156,7 +1159,7 @@ static int device_suspend_noirq(struct device *dev) if (is_async(dev)) { get_device(dev); - async_schedule(async_suspend_noirq, dev); + async_schedule_domain(async_suspend_noirq, dev, &domain_pm); return 0; } return __device_suspend_noirq(dev, pm_transition, false); @@ -1202,7 +1205,7 @@ int dpm_noirq_suspend_devices(pm_message_t state) break; } mutex_unlock(&dpm_list_mtx); - async_synchronize_full(); + async_synchronize_full_domain(&domain_pm); if (!error) error = async_error; @@ -1316,7 +1319,7 @@ static int device_suspend_late(struct device *dev) if (is_async(dev)) { get_device(dev); - async_schedule(async_suspend_late, dev); + async_schedule_domain(async_suspend_late, dev, &domain_pm); return 0; } @@ -1361,7 +1364,7 @@ int dpm_suspend_late(pm_message_t state) break; } mutex_unlock(&dpm_list_mtx); - async_synchronize_full(); + async_synchronize_full_domain(&domain_pm); if (!error) error = async_error; if (error) { @@ -1576,7 +1579,7 @@ static int device_suspend(struct device *dev) if (is_async(dev)) { get_device(dev); - async_schedule(async_suspend, dev); + async_schedule_domain(async_suspend, dev, &domain_pm); return 0; } @@ -1622,7 +1625,7 @@ int dpm_suspend(pm_message_t state) break; } mutex_unlock(&dpm_list_mtx); - async_synchronize_full(); + async_synchronize_full_domain(&domain_pm); if (!error) error = async_error; if (error) { -- 1.7.9.5