public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: Greg KH <gregkh@suse.de>
Cc: Andrew Morton <akpm@osdl.org>,
	linux-kernel@vger.kernel.org, Pavel Machek <pavel@ucw.cz>,
	Linus Torvalds <torvalds@osdl.org>,
	linux-pm@lists.osdl.org
Subject: Re: [patch] suspend/resume debugging: device filter
Date: Sat, 5 May 2007 11:24:25 +0200	[thread overview]
Message-ID: <20070505092425.GA23125@elte.hu> (raw)
In-Reply-To: <20070126015536.GA14917@suse.de>


* Greg KH <gregkh@suse.de> wrote:

> Here's a (compile tested only) patch that does this on a per-device 
> basis, which is smaller, and should work just as well as your patch.
> 
> It creates a new file in the power/ directory for every device called 
> "can_suspend".  Write a '0' to it to prevent that device from being 
> suspended.
> 
> Does this work for you?

yeah, i was able to use this too to debug suspend/resume problems. But 
i've added the check to the resume path too - for example sw-suspend 
does a resume of devices during its suspend cycle, cutting off much of 
the netconsole output.

which makes the can_suspend flag mis-named - perhaps rename it to 
exclude_pm ?

updated patch below, against v2.6.21. Could we get this into v2.6.22 
please? It's a real time-saver.

	Ingo

---
 drivers/base/power/resume.c  |    6 ++++++
 drivers/base/power/suspend.c |    2 +-
 drivers/base/power/sysfs.c   |   30 ++++++++++++++++++++++++++++++
 include/linux/device.h       |    1 +
 4 files changed, 38 insertions(+), 1 deletion(-)

Index: linux/drivers/base/power/resume.c
===================================================================
--- linux.orig/drivers/base/power/resume.c
+++ linux/drivers/base/power/resume.c
@@ -24,6 +24,9 @@ int resume_device(struct device * dev)
 {
 	int error = 0;
 
+	if (dev->no_suspend)
+		return 0;
+
 	TRACE_DEVICE(dev);
 	TRACE_RESUME(0);
 	down(&dev->sem);
@@ -52,6 +55,9 @@ static int resume_device_early(struct de
 {
 	int error = 0;
 
+	if (dev->no_suspend)
+		return 0;
+
 	TRACE_DEVICE(dev);
 	TRACE_RESUME(0);
 	if (dev->bus && dev->bus->resume_early) {
Index: linux/drivers/base/power/suspend.c
===================================================================
--- linux.orig/drivers/base/power/suspend.c
+++ linux/drivers/base/power/suspend.c
@@ -78,7 +78,7 @@ int suspend_device(struct device * dev, 
 		suspend_report_result(dev->class->suspend, error);
 	}
 
-	if (!error && dev->bus && dev->bus->suspend && !dev->power.power_state.event) {
+	if (!error && !dev->no_suspend && dev->bus && dev->bus->suspend && !dev->power.power_state.event) {
 		dev_dbg(dev, "%s%s\n",
 			suspend_verb(state.event),
 			((state.event == PM_EVENT_SUSPEND)
Index: linux/drivers/base/power/sysfs.c
===================================================================
--- linux.orig/drivers/base/power/sysfs.c
+++ linux/drivers/base/power/sysfs.c
@@ -141,12 +141,42 @@ wake_store(struct device * dev, struct d
 
 static DEVICE_ATTR(wakeup, 0644, wake_show, wake_store);
 
+static ssize_t can_suspend_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	return sprintf(buf, "%s\n", dev->no_suspend ? "no" : "yes");
+}
+
+static ssize_t can_suspend_store(struct device *dev,
+				 struct device_attribute *attr,
+				 const char *buf, size_t n)
+{
+	if (!n)
+		return -EINVAL;
+
+	switch (buf[0]) {
+	case 'y':
+	case 'Y':
+	case '1':
+		dev->no_suspend = 0;
+		break;
+	case 'n':
+	case 'N':
+	case '0':
+		dev->no_suspend = 1;
+		break;
+	}
+
+	return n;
+}
+static DEVICE_ATTR(can_suspend, 0644, can_suspend_show, can_suspend_store);
 
 static struct attribute * power_attrs[] = {
 #ifdef	CONFIG_PM_SYSFS_DEPRECATED
 	&dev_attr_state.attr,
 #endif
 	&dev_attr_wakeup.attr,
+	&dev_attr_can_suspend.attr,
 	NULL,
 };
 static struct attribute_group pm_attr_group = {
Index: linux/include/linux/device.h
===================================================================
--- linux.orig/include/linux/device.h
+++ linux/include/linux/device.h
@@ -402,6 +402,7 @@ struct device {
 	char	bus_id[BUS_ID_SIZE];	/* position on parent bus */
 	struct device_type	*type;
 	unsigned		is_registered:1;
+	unsigned		no_suspend:1;
 	struct device_attribute uevent_attr;
 	struct device_attribute *devt_attr;
 

  parent reply	other threads:[~2007-05-05  9:24 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-25 11:05 [patch] suspend/resume debugging: device filter Ingo Molnar
2007-01-25 11:28 ` Nigel Cunningham
2007-01-25 11:32 ` Pavel Machek
2007-01-26  1:55 ` Greg KH
2007-01-26  9:36   ` Pavel Machek
2007-05-05  9:24   ` Ingo Molnar [this message]
2007-05-05  9:39     ` Rafael J. Wysocki
2007-05-05 10:08     ` Pavel Machek
2007-05-08  2:54       ` [linux-pm] " Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070505092425.GA23125@elte.hu \
    --to=mingo@elte.hu \
    --cc=akpm@osdl.org \
    --cc=gregkh@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@lists.osdl.org \
    --cc=pavel@ucw.cz \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox