[LUCID 1/2] UBUNTU: SAUCE: PM report driver and device suspend/resume times.

Manoj Iyer manoj.iyer at canonical.com
Thu Feb 11 19:55:35 UTC 2010


This patch is an extension to a resume report patch submitted to upstream 
by Rafael J. Wysocki. cnd tested this kernel and reported that it prints 
information correctly. The messages will be printed if suspend/resume of 
driver/device took more than 100ms. This default can be changed in CONFIG.

Feb 11 13:23:05 cndougla kernel: [   59.848676] PM: suspend of drv:sd 
dev:0:0:0:0 complete after 978.535 msecs
Feb 11 13:23:05 cndougla kernel: [   60.110097] PM: suspend of drv:HDA 
Intel dev:0000:00:08.0 complete after 149.996 msecs
Feb 11 13:23:05 cndougla kernel: [   60.110433] PM: suspend devices took 
1.320 seconds

Feb 11 13:23:05 cndougla kernel: [   61.313617] PM: resume of drv:battery 
dev:PNP0C0A:00 complete after 141.572 msecs
Feb 11 13:23:05 cndougla kernel: [   66.300578] PM: resume of drv:nvidia 
dev:0000:02:00.0 complete after 4849.583 msecs
Feb 11 13:23:05 cndougla kernel: [   66.562640] PM: resume of drv:usb 
dev:usb3 complete after 109.993 msecs
Feb 11 13:23:05 cndougla kernel: [   66.672636] PM: resume of drv:usb 
dev:usb4 complete after 109.980 msecs
Feb 11 13:23:05 cndougla kernel: [   67.076900] PM: resume devices took 
5.900 seconds


The following changes since commit 
a913ef9ba3b23aee8db094d5ab5804777c697ef1:
   Andy Whitcroft (1):
         UBUNTU: Ubuntu-2.6.32-13.18

are available in the git repository at:


ssh://zinc.canonical.com/srv/kernel.ubuntu.com/git/manjo/ubuntu-lucid.git 
srtime

Manoj Iyer (2):
       UBUNTU: SAUCE: PM report driver and device suspend/resume times.
       UBUNTU: [Config] Added CONFIG_SR_REPORT_TIME_LIMIT

  debian.master/config/config.common.ubuntu |    1 +
  drivers/base/power/main.c                 |   35 
+++++++++++++++++++++++++++++
  2 files changed, 36 insertions(+), 0 deletions(-)


>From b5c3874a49410d148d662b42bf2d305e83ddfc3e Mon Sep 17 00:00:00 2001
From: Manoj Iyer <manoj.iyer at canonical.com>
Date: Thu, 11 Feb 2010 13:35:42 -0600
Subject: [PATCH 1/2] UBUNTU: SAUCE: PM report driver and device suspend/resume times.

This patch prints suspend/resume information for each driver/device to
dmesg. I don't think it adds much value to upstream.

Signed-off-by: Manoj Iyer <manoj.iyer at canonical.com>
---
  drivers/base/power/main.c |   35 +++++++++++++++++++++++++++++++++++
  1 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 8aa2443..578b43d 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -29,6 +29,13 @@
  #include "../base.h"
  #include "power.h"

+/* Set default to 100 msecs */
+#ifdef CONFIG_SR_REPORT_TIME_LIMIT
+#define SR_REPORT_TIME_LIMIT CONFIG_SR_REPORT_TIME_LIMIT
+#else
+#define SR_REPORT_TIME_LIMIT 100
+#endif
+
  /*
   * The entries in the dpm_list list are in a depth first order, simply
   * because children are guaranteed to be discovered after parents, and
@@ -324,6 +331,26 @@ 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 device_show_time(struct device *dev, 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;
+	if ((usecs / USEC_PER_MSEC) > SR_REPORT_TIME_LIMIT)
+		pr_info("PM: %s%s%s of drv:%s dev:%s complete after %ld.%03ld msecs\n", info ?: "", info ? " " : "", pm_verb(state.event),
+	       dev_driver_string(dev), dev_name(dev), usecs / USEC_PER_MSEC,
+	       usecs % USEC_PER_MSEC);
+}
+
+
  /*------------------------- Resume routines -------------------------*/

  /**
@@ -337,6 +364,7 @@ static void pm_dev_err(struct device *dev, pm_message_t state, char *info,
  static int device_resume_noirq(struct device *dev, pm_message_t state)
  {
  	int error = 0;
+	ktime_t starttime = ktime_get();

  	TRACE_DEVICE(dev);
  	TRACE_RESUME(0);
@@ -347,6 +375,7 @@ static int device_resume_noirq(struct device *dev, pm_message_t state)
  	if (dev->bus->pm) {
  		pm_dev_dbg(dev, state, "EARLY ");
  		error = pm_noirq_op(dev, dev->bus->pm, state);
+		device_show_time(dev, starttime, state, "early");
  	}
   End:
  	TRACE_RESUME(error);
@@ -388,6 +417,7 @@ EXPORT_SYMBOL_GPL(dpm_resume_noirq);
  static int device_resume(struct device *dev, pm_message_t state)
  {
  	int error = 0;
+	ktime_t starttime = ktime_get();

  	TRACE_DEVICE(dev);
  	TRACE_RESUME(0);
@@ -424,6 +454,7 @@ static int device_resume(struct device *dev, pm_message_t state)
  			error = dev->class->resume(dev);
  		}
  	}
+	device_show_time(dev, starttime, state, NULL);
   End:
  	up(&dev->sem);

@@ -583,6 +614,7 @@ static pm_message_t resume_event(pm_message_t sleep_state)
  static int device_suspend_noirq(struct device *dev, pm_message_t state)
  {
  	int error = 0;
+	ktime_t starttime = ktime_get();

  	if (!dev->bus)
  		return 0;
@@ -590,6 +622,7 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state)
  	if (dev->bus->pm) {
  		pm_dev_dbg(dev, state, "LATE ");
  		error = pm_noirq_op(dev, dev->bus->pm, state);
+		device_show_time(dev, starttime, state, "late");
  	}
  	return error;
  }
@@ -631,6 +664,7 @@ EXPORT_SYMBOL_GPL(dpm_suspend_noirq);
  static int device_suspend(struct device *dev, pm_message_t state)
  {
  	int error = 0;
+	ktime_t starttime = ktime_get();

  	down(&dev->sem);

@@ -666,6 +700,7 @@ static int device_suspend(struct device *dev, pm_message_t state)
  			suspend_report_result(dev->bus->suspend, error);
  		}
  	}
+	device_show_time(dev, starttime, state, NULL);
   End:
  	up(&dev->sem);

-- 
1.6.3.3


Cheers
--- manjo




More information about the kernel-team mailing list