Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b7760ba authored by Sameer Nanda's avatar Sameer Nanda Committed by Rafael J. Wysocki
Browse files

PM / Sleep: add knob for printing device resume times



Added a new knob called /sys/power/pm_print_times. Setting it to 1
enables printing of time taken by devices to suspend and resume.
Setting it to 0 disables this printing (unless overridden by
initcall_debug kernel command line option).

Signed-off-by: default avatarSameer Nanda <snanda@chromium.org>
Acked-by: default avatarGreg KH <gregkh@linuxfoundation.org>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 443772d4
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -231,3 +231,16 @@ Description:
		Reads from this file return a string consisting of the names of
		wakeup sources created with the help of /sys/power/wake_lock
		that are inactive at the moment, separated with spaces.

What:		/sys/power/pm_print_times
Date:		May 2012
Contact:	Sameer Nanda <snanda@chromium.org>
Description:
		The /sys/power/pm_print_times file allows user space to
		control whether the time taken by devices to suspend and
		resume is printed.  These prints are useful for hunting down
		devices that take too long to suspend or resume.

		Writing a "1" enables this printing while writing a "0"
		disables it.  The default value is "0".  Reading from this file
		will display the current value.
+2 −2
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ static ktime_t initcall_debug_start(struct device *dev)
{
	ktime_t calltime = ktime_set(0, 0);

	if (initcall_debug) {
	if (pm_print_times) {
		pr_info("calling  %s+ @ %i, parent: %s\n",
			dev_name(dev), task_pid_nr(current),
			dev->parent ? dev_name(dev->parent) : "none");
@@ -181,7 +181,7 @@ static void initcall_debug_report(struct device *dev, ktime_t calltime,
{
	ktime_t delta, rettime;

	if (initcall_debug) {
	if (pm_print_times) {
		rettime = ktime_get();
		delta = ktime_sub(rettime, calltime);
		pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev),
+11 −0
Original line number Diff line number Diff line
@@ -85,3 +85,14 @@ static inline int pm_qos_sysfs_add(struct device *dev) { return 0; }
static inline void pm_qos_sysfs_remove(struct device *dev) {}

#endif

#ifdef CONFIG_PM_DEBUG

extern int pm_print_times_enabled;
#define pm_print_times (initcall_debug || pm_print_times_enabled)

#else /* CONFIG_PM_DEBUG */

#define pm_print_times initcall_debug

#endif /* CONFIG_PM_DEBUG */
+33 −0
Original line number Diff line number Diff line
@@ -132,6 +132,38 @@ static ssize_t pm_test_store(struct kobject *kobj, struct kobj_attribute *attr,
}

power_attr(pm_test);

/*
 * pm_print_times: print time taken by devices to suspend and resume.
 *
 * show() returns whether printing of suspend and resume times is enabled.
 * store() accepts 0 or 1.  0 disables printing and 1 enables it.
 */
int pm_print_times_enabled;

static ssize_t pm_print_times_show(struct kobject *kobj,
				   struct kobj_attribute *attr, char *buf)
{
	return sprintf(buf, "%d\n", pm_print_times_enabled);
}

static ssize_t pm_print_times_store(struct kobject *kobj,
				    struct kobj_attribute *attr,
				    const char *buf, size_t n)
{
	unsigned long val;

	if (kstrtoul(buf, 10, &val))
		return -EINVAL;

	if (val > 1)
		return -EINVAL;

	pm_print_times_enabled = val;
	return n;
}

power_attr(pm_print_times);
#endif /* CONFIG_PM_DEBUG */

#ifdef CONFIG_DEBUG_FS
@@ -530,6 +562,7 @@ static struct attribute * g[] = {
#endif
#ifdef CONFIG_PM_DEBUG
	&pm_test_attr.attr,
	&pm_print_times_attr.attr,
#endif
#endif
	NULL,