[LUCID] [PATCH] PM: Measure device suspend and resume times
manoj.iyer at canonical.com
manoj.iyer at canonical.com
Tue Jan 26 14:38:06 UTC 2010
Yes, I do have a patch for that, but I not sure we want to have that in
Lucid kernel as it populates dmesg with a ton of info.
Cheers
--- manjo
On Mon, 25 Jan 2010, Colin Ian King wrote:
> Maybe I'm missing something, but it would be even more useful to get the
> resume time of each device so that we can see where resume bottlenecks
> are occurring. I'd like to know which device is causing the hangs.
>
> Colin
>
> On Sun, 2010-01-24 at 19:05 -0600, Manoj Iyer wrote:
>> The following patch from Rafael measures the suspend/resume times of
>> devices. It logs the total suspend/resume times of devices as follows:
>>
>> [ 62.820296] PM: suspend of devices complete after 2108.836 msecs
>> [ 62.820300] PM: suspend devices took 2.110 seconds
>> [ 62.860107] PM: late suspend of devices complete after 39.801 msecs
>> [ 63.440105] PM: early resume of devices complete after 20.013 msecs
>> [ 67.337821] PM: resume of devices complete after 3887.665 msecs
>> [ 67.338078] PM: resume devices took 3.890 seconds
>> [ 67.338117] PM: Finishing wakeup.
>>
>>
>> The following changes since commit
>> 8275e80fb72b97750d338c905ed7575df8967b95:
>> Rafael J. Wysocki (1):
>> PM: Measure device suspend and resume times
>>
>> are available in the git repository at:
>>
>>
>> ssh://zinc.canonical.com/srv/kernel.ubuntu.com/git/manjo/ubuntu-lucid.git
>> suspendresume
>>
>> From 8275e80fb72b97750d338c905ed7575df8967b95 Mon Sep 17 00:00:00 2001
>> From: Rafael J. Wysocki <rjw at sisk.pl>
>> Date: Fri, 18 Dec 2009 01:57:47 +0100
>> Subject: [PATCH] PM: Measure device suspend and resume times
>>
>> Measure and print the time of suspending and resuming all devices.
>>
>> Signed-off-by: Rafael J. Wysocki <rjw at sisk.pl>
>> (cherry picked from commit ecf762b2581e12ac761d12a6e4e297c2224aa899)
>>
>> Signed-off-by: Manoj Iyer <manoj.iyer at canonical.com>
>> ---
>> drivers/base/power/main.c | 27 +++++++++++++++++++++++++++
>> 1 files changed, 27 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
>> index 8aa2443..d72d4b3 100644
>> --- a/drivers/base/power/main.c
>> +++ b/drivers/base/power/main.c
>> @@ -324,6 +324,23 @@ static void pm_dev_err(struct device *dev, pm_message_t state, char *info,
>> kobject_name(&dev->kobj), pm_verb(state.event), info, error);
>> }
>>
>> +static void dpm_show_time(ktime_t starttime, pm_message_t state, char *info)
>> +{
>> + ktime_t calltime;
>> + s64 usecs64;
>> + int usecs;
>> +
>> + calltime = ktime_get();
>> + usecs64 = ktime_to_ns(ktime_sub(calltime, starttime));
>> + do_div(usecs64, NSEC_PER_USEC);
>> + usecs = usecs64;
>> + if (usecs == 0)
>> + usecs = 1;
>> + pr_info("PM: %s%s%s of devices complete after %ld.%03ld msecs\n",
>> + info ?: "", info ? " " : "", pm_verb(state.event),
>> + usecs / USEC_PER_MSEC, usecs % USEC_PER_MSEC);
>> +}
>> +
>> /*------------------------- Resume routines -------------------------*/
>>
>> /**
>> @@ -363,6 +380,7 @@ static int device_resume_noirq(struct device *dev, pm_message_t state)
>> void dpm_resume_noirq(pm_message_t state)
>> {
>> struct device *dev;
>> + ktime_t starttime = ktime_get();
>>
>> mutex_lock(&dpm_list_mtx);
>> transition_started = false;
>> @@ -376,6 +394,7 @@ void dpm_resume_noirq(pm_message_t state)
>> pm_dev_err(dev, state, " early", error);
>> }
>> mutex_unlock(&dpm_list_mtx);
>> + dpm_show_time(starttime, state, "early");
>> resume_device_irqs();
>> }
>> EXPORT_SYMBOL_GPL(dpm_resume_noirq);
>> @@ -441,6 +460,7 @@ static int device_resume(struct device *dev, pm_message_t state)
>> static void dpm_resume(pm_message_t state)
>> {
>> struct list_head list;
>> + ktime_t starttime = ktime_get();
>>
>> INIT_LIST_HEAD(&list);
>> mutex_lock(&dpm_list_mtx);
>> @@ -469,6 +489,7 @@ static void dpm_resume(pm_message_t state)
>> }
>> list_splice(&list, &dpm_list);
>> mutex_unlock(&dpm_list_mtx);
>> + dpm_show_time(starttime, state, NULL);
>> }
>>
>> /**
>> @@ -604,6 +625,7 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state)
>> int dpm_suspend_noirq(pm_message_t state)
>> {
>> struct device *dev;
>> + ktime_t starttime = ktime_get();
>> int error = 0;
>>
>> suspend_device_irqs();
>> @@ -619,6 +641,8 @@ int dpm_suspend_noirq(pm_message_t state)
>> mutex_unlock(&dpm_list_mtx);
>> if (error)
>> dpm_resume_noirq(resume_event(state));
>> + else
>> + dpm_show_time(starttime, state, "late");
>> return error;
>> }
>> EXPORT_SYMBOL_GPL(dpm_suspend_noirq);
>> @@ -679,6 +703,7 @@ static int device_suspend(struct device *dev, pm_message_t state)
>> static int dpm_suspend(pm_message_t state)
>> {
>> struct list_head list;
>> + ktime_t starttime = ktime_get();
>> int error = 0;
>>
>> INIT_LIST_HEAD(&list);
>> @@ -704,6 +729,8 @@ static int dpm_suspend(pm_message_t state)
>> }
>> list_splice(&list, dpm_list.prev);
>> mutex_unlock(&dpm_list_mtx);
>> + if (!error)
>> + dpm_show_time(starttime, state, NULL);
>> return error;
>> }
>>
>> --
>> 1.6.3.3
>>
>>
>>
>> Cheers
>> --- manjo
>>
>
>
>
More information about the kernel-team
mailing list