Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754833AbdLFFpP (ORCPT ); Wed, 6 Dec 2017 00:45:15 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:52059 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754754AbdLFFpM (ORCPT ); Wed, 6 Dec 2017 00:45:12 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20171206054511epoutp023d07d7be737e1a7690e4c9f00b0754fa~9nk7LszQn1348013480epoutp02h X-AuditID: b6c32a4a-b79ff70000001151-99-5a2783e50730 Mime-Version: 1.0 Subject: 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: <20171206053831epcms5p58903d153d261ffd797e43b6983cda1ce@epcms5p5> Date: Wed, 06 Dec 2017 05:38:31 +0000 X-CMS-MailID: 20171206053831epcms5p58903d153d261ffd797e43b6983cda1ce Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" X-Sendblock-Type: REQ_APPROVE X-MTR: 20171206053831epcms5p58903d153d261ffd797e43b6983cda1ce CMS-TYPE: 105P X-Brightmail-Tracker: H4sIAAAAAAAAA02SfUgTcRjH+91tt+tlcZ5WT/ZmF1kO3Fubm5VRGbHecNAfkRF26a/NcjfZ bfZCkLgksoLCXi+tSEpTSXvRTBPFXhZWQm9SSVFRkb2XVlQW7TxH/fd5vnyfVx6aZHdQsXS2 4Mc+gc/hqCGq+ssJusSXwSnpxvvtWnuwrIayS3ubCfvdxhLK3rPrCrI/br9K2W/euKOeTTnK LnUTjpbSao3j/P1tKkdF1XeNo+fseKc6Hc90Yz4L++KwkOnNyhZcKdyipRmpGdYkoynRlGy3 cXEC78Ep3LzFzsT52TnhCbi4PD4nEJacvChyhlkzfd6AH8e5vaI/hVthMpn1JqNNbzab9Rbr yulma9iyCrt/fChW5T6atKFXCuSj0LgiNJgGxgK9pedURWgIzTJNCE51HQwHNK1louB3Q7SM 0cwC2F60XLazDAetj78gmaMZA3R9u07JTDGJUB36RshlYphaAqreFZJKfS0c3PZSpfAYuFBe hxQeAX35EX087P9aTUb0j9eODnhioPDJrQE9Cp7+aBrQY+HG4aBabgZMEMHdrQcIJdiNYHtl p0Zx2aAl9JWQWcssgb7nRf3dVMxkaAudGeg8D2r3d/czyUyAC+9LSHljkkmAmkaDYhkH+9pP EwqnwKueUo1iHw67fr0gIks2HIlwPJzqOK5WeCy82XqJUtgBPw/VaOTywMyBE3XUbjRR+ndp 6b8ZpH8zHENkJRqNc0WPC4vWXLOA1+tF3iMGBJc+0+s5i/ofUbewAZ3sWNyGGBpxw7QVUnw6 q+bzxI2eNgQ0ycVoVxumpLPaLH7jJuzzZvgCOVhsQ9bwNfaQsSMyveG3FvwZJkuy0ZKUZDMZ jckWbpT22sXAcpZx8X68DuNc7IvkEfTg2Hw0/HX5i/IPE9bUP6wrfmOrWF3LDgot63A90HRm D9Ul9G3a5yxLfZvWcOX2M6GAWFTbOoZVBQt7W3UTR+fZbge6j029F5JWeg3ukS1zLTvzo7b4 Z0ud/vL6+ZtttifSnxLKWdbsrer+lLbuVwtouj7fKyaM09iCI80zClLjN6ytM3Mq0c2bdKRP 5P8C5CRk8J4DAAA= DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20171206053831epcms5p58903d153d261ffd797e43b6983cda1ce X-RootMTR: 20171206053831epcms5p58903d153d261ffd797e43b6983cda1ce References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4434 Lines: 137 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 is domain for async schedules in PM core (As we solved in our case). Below patch is for solving this problem. >From b8ea152eed6eef3b53275e7dd240a4d2124e9d4d Mon Sep 17 00:00:00 2001 From: Anuj Gupta Date: Tue, 5 Dec 2017 21:34:49 -0800 Subject: [PATCH] Added domain_pm to PM core Signed-off-by: Vikas Bansal --- drivers/base/power/main.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index db2f044..2d19dfb 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 *); +ASYNC_DOMAIN(domain_pm); /* * The entries in the dpm_list list are in a depth first order, simply @@ -615,7 +616,7 @@ 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 +642,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 +756,7 @@ 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 +781,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 +920,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 +947,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 +1157,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 +1203,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 +1317,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 +1362,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 +1577,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 +1623,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