On 17 November 2015 at 14:48, Fu, Zhonghui <zhonghui...@linux.intel.com> wrote: > > > On 11/16/2015 7:30 PM, Ulf Hansson wrote: >> On 15 November 2015 at 14:53, Fu, Zhonghui <zhonghui...@linux.intel.com> >> wrote: >>> Now, PM core supports asynchronous suspend/resume mode for devices >>> during system suspend/resume, and the power state transition of one >>> device may be completed in separate kernel thread. PM core ensures >>> all power state transition timing dependency between devices. This
What "timing dependency"? >>> patch enables SDIO card and function devices to suspend/resume >>> asynchronously. This will take advantage of multicore and improve >>> system suspend/resume speed. After enabling the SDIO devices and all >>> their child devices to suspend/resume asynchronously on ASUS T100TA, >>> the system suspend-to-idle time is reduced from 1645ms to 1119ms, and >>> the system resume time is reduced from 940ms to 918ms. Are these improvements achieved by $subject patch on its own or you need below patches: [PATCH v3] mmc: enable mmc host device to suspend/resume asynchronously [1] [PATCH v3] mmc/sdhci-acpi: enable sdhci-acpi device to suspend/resume asynchronously [2] Depending if you have SD/(e)MMC card slot(s), the below patch might affect your results. So it might be a good idea to re-run your test to get some fresh data. [PATCH 1/2] mmc: core: Make runtime resume default behavior for MMC/SD [3] >>> >>> Signed-off-by: Zhonghui Fu <zhonghui...@linux.intel.com> >> I think this is an interesting change, but I wonder if you really >> understand how this affects the order of how devices may be >> suspended/resumed? >> >> Also, I believe you didn't answer my question for the earlier version >> of the patch, so let me try again. >> >> There are a strict dependency chain when suspending/resuming devices >> that must be maintained. Currently this is controlled via device >> registration/probe order. >> >> An SDIO func driver/device must always be suspended *before* the SDIO >> card device. Additionally the corresponding MMC host, must be >> suspended after the SDIO card device. Vice verse applies to the resume >> sequence. >> >> As this patch enables asynchronous suspend, I am worried that it will >> break this dependency chain. What do you think? > After enabling asynchronous suspend/resume, PM core still ensures the strict > suspend/resume dependency between child and parent devices - child must be > suspended before its parent, and parent must be resumed before its child. > SDIO function is child of SDIO card, and SDIO card is child of MMC host, and > MMC host is child of MMC controller. So the dependency chain is not broken. > Actually, many devices have been using asynchronous suspend/resume mode now. I believe your view of how the PM core works for devices that *don't* use async suspend is wrong! The PM core doesn't respect parent/child relations during the device system PM phase for these devices. Instead it relies on that devices in the "dpm list" are ordered correctly. As I tried to describe earlier, that list is being updated during device registration and probing (there are some other special cases as well). So, by enabling async suspend for a device it will trigger the PM core durng device system PM, to start caring about device's parent/child relations. I would appreciate if you could add some of this information to the change log, as that's *why* it should work nicely for mmc/sd/sdio to use async suspend. > > Thanks, > Zhonghui >> >> Kind regards >> Ulf Hansson >> >>> --- >>> Changes in v3: >>> - Add test result in commit message >>> >>> drivers/mmc/core/sdio.c | 4 ++++ >>> 1 files changed, 4 insertions(+), 0 deletions(-) >>> >>> diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c >>> index 16d838e..530ce88 100644 >>> --- a/drivers/mmc/core/sdio.c >>> +++ b/drivers/mmc/core/sdio.c >>> @@ -1113,6 +1113,8 @@ int mmc_attach_sdio(struct mmc_host *host) >>> pm_runtime_enable(&card->dev); >>> } >>> >>> + device_enable_async_suspend(&card->dev); >>> + This change will also affect SDIO combo cards. That means the when there is a mmc blk device driver bound to the mmc card, its ->suspend() methods will be called asynchronously. Have you considered that? Especially since there are nothing being mentioned about it in the change-log? Also, within this context I am wondering why you *only* enable async suspend for SDIO cards and not all cards (SD/MMC)? Is there a problem with doing that? >>> /* >>> * The number of functions on the card is encoded inside >>> * the ocr. >>> @@ -1133,6 +1135,8 @@ int mmc_attach_sdio(struct mmc_host *host) >>> */ >>> if (host->caps & MMC_CAP_POWER_OFF_CARD) >>> pm_runtime_enable(&card->sdio_func[i]->dev); >>> + >>> + device_enable_async_suspend(&card->sdio_func[i]->dev); >>> } >>> >>> /* >>> -- 1.7.1 >>> > [1] https://lkml.org/lkml/2015/11/15/83 [2] https://lkml.org/lkml/2015/11/16/6 [3] http://www.spinics.net/lists/linux-mmc/msg34004.html Kind regards Ulf Hansson -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html