From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: linux-pm <linux-pm@lists.linux-foundation.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Linux PCI <linux-pci@vger.kernel.org>,
ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
Len Brown <lenb@kernel.org>, Zhang Rui <rui.zhang@intel.com>,
Pavel Machek <pavel@ucw.cz>,
Alan Stern <stern@rowland.harvard.edu>,
Arjan van de Ven <arjan@infradead.org>,
Ingo Molnar <mingo@elte.hu>
Subject: [PATCH 6/9] PM: Add a switch for disabling/enabling asynchronous suspend/resume
Date: Thu, 10 Sep 2009 01:38:25 +0200 [thread overview]
Message-ID: <200909100138.25839.rjw@sisk.pl> (raw)
In-Reply-To: <200909100127.11252.rjw@sisk.pl>
From: Rafael J. Wysocki <rjw@sisk.pl>
Add sysfs attribute kernel/power/pm_async allowing the user space to
disable and enable async suspend/resume of devices.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/base/power/main.c | 13 +++++++------
drivers/base/power/power.h | 6 +++---
kernel/power/main.c | 31 ++++++++++++++++++++++++++++++-
3 files changed, 40 insertions(+), 10 deletions(-)
Index: linux-2.6/kernel/power/main.c
===================================================================
--- linux-2.6.orig/kernel/power/main.c
+++ linux-2.6/kernel/power/main.c
@@ -44,6 +44,32 @@ int pm_notifier_call_chain(unsigned long
== NOTIFY_BAD) ? -EINVAL : 0;
}
+/* If set, devices may be suspended and resumed asynchronously. */
+int pm_async_enabled = 1;
+
+static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
+ char *buf)
+{
+ return sprintf(buf, "%d\n", pm_async_enabled);
+}
+
+static ssize_t pm_async_store(struct kobject *kobj, struct kobj_attribute *attr,
+ const char *buf, size_t n)
+{
+ unsigned long val;
+
+ if (strict_strtoul(buf, 10, &val))
+ return -EINVAL;
+
+ if (val > 1)
+ return -EINVAL;
+
+ pm_async_enabled = val;
+ return n;
+}
+
+power_attr(pm_async);
+
#ifdef CONFIG_PM_DEBUG
int pm_test_level = TEST_NONE;
@@ -208,9 +234,12 @@ static struct attribute * g[] = {
#ifdef CONFIG_PM_TRACE
&pm_trace_attr.attr,
#endif
-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG)
+#ifdef CONFIG_PM_SLEEP
+ &pm_async_attr.attr,
+#ifdef CONFIG_PM_DEBUG
&pm_test_attr.attr,
#endif
+#endif
NULL,
};
Index: linux-2.6/drivers/base/power/main.c
===================================================================
--- linux-2.6.orig/drivers/base/power/main.c
+++ linux-2.6/drivers/base/power/main.c
@@ -235,7 +235,7 @@ static int device_pm_wait_fn(struct devi
*/
static void device_pm_wait_for_masters(struct device *slave)
{
- if (!pm_trace_enabled)
+ if (pm_async_enabled && !pm_trace_enabled)
device_for_each_master(slave, slave, device_pm_wait_fn);
}
@@ -245,7 +245,8 @@ static void device_pm_wait_for_masters(s
*/
static void device_pm_wait_for_slaves(struct device *master)
{
- device_for_each_slave(master, master, device_pm_wait_fn);
+ if (pm_async_enabled)
+ device_for_each_slave(master, master, device_pm_wait_fn);
}
/**
@@ -560,7 +561,7 @@ static int device_resume_noirq(struct de
if (pm_op_started(dev))
return 0;
- if (dev->power.async_suspend && !pm_trace_enabled) {
+ if (pm_async_enabled && !pm_trace_enabled && dev->power.async_suspend) {
async_schedule(async_resume_noirq, dev);
return 0;
}
@@ -719,7 +720,7 @@ static int device_resume(struct device *
if (pm_op_started(dev))
return 0;
- if (dev->power.async_suspend && !pm_trace_enabled) {
+ if (pm_async_enabled && !pm_trace_enabled && dev->power.async_suspend) {
get_device(dev);
async_schedule(async_resume, dev);
return 0;
@@ -965,7 +966,7 @@ static int device_suspend_noirq(struct d
if (pm_op_started(dev))
return 0;
- if (dev->power.async_suspend) {
+ if (pm_async_enabled && dev->power.async_suspend) {
async_schedule(async_suspend_noirq, dev);
return 0;
}
@@ -1139,7 +1140,7 @@ static int device_suspend(struct device
if (pm_op_started(dev))
return 0;
- if (dev->power.async_suspend) {
+ if (pm_async_enabled && dev->power.async_suspend) {
get_device(dev);
async_schedule(async_suspend, dev);
return 0;
Index: linux-2.6/drivers/base/power/power.h
===================================================================
--- linux-2.6.orig/drivers/base/power/power.h
+++ linux-2.6/drivers/base/power/power.h
@@ -16,10 +16,10 @@ static inline void pm_runtime_remove(str
#ifdef CONFIG_PM_SLEEP
-/*
- * main.c
- */
+/* kernel/power/main.c */
+extern int pm_async_enabled;
+/* drivers/base/power/main.c */
extern struct list_head dpm_list; /* The active device list */
static inline struct device *to_device(struct list_head *entry)
next prev parent reply other threads:[~2009-09-09 23:38 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-09 23:27 [PATCH 0/9] PM: Asynchronous suspend of devices Rafael J. Wysocki
2009-09-09 23:32 ` [PATCH 1/9] PM: Introduce PM links framework Rafael J. Wysocki
2009-09-09 23:32 ` Rafael J. Wysocki
2010-01-30 5:11 ` Mahalingam, Nithish
2009-09-09 23:35 ` [PATCH 2/9] PM: Asynchronous resume of devices Rafael J. Wysocki
2009-09-09 23:35 ` Rafael J. Wysocki
2009-09-09 23:36 ` [PATCH 3/9] PM: Asynchronous suspend " Rafael J. Wysocki
2009-09-09 23:36 ` Rafael J. Wysocki
2009-09-09 23:36 ` [PATCH 4/9] PM: Allow PCI devices to suspend/resume asynchronously Rafael J. Wysocki
2009-09-09 23:36 ` Rafael J. Wysocki
2009-09-09 23:37 ` [PATCH 5/9] PM: Allow ACPI " Rafael J. Wysocki
2009-09-09 23:37 ` Rafael J. Wysocki
2009-09-09 23:38 ` Rafael J. Wysocki [this message]
2009-09-10 10:26 ` [PATCH 6/9] PM: Add a switch for disabling/enabling asynchronous suspend/resume Pavel Machek
2009-09-10 10:26 ` Pavel Machek
2009-09-10 18:56 ` Rafael J. Wysocki
2009-09-10 18:56 ` Rafael J. Wysocki
2009-09-10 18:59 ` Pavel Machek
2009-09-10 18:59 ` Pavel Machek
2009-09-10 20:15 ` Rafael J. Wysocki
2009-09-10 20:15 ` Rafael J. Wysocki
2009-09-09 23:38 ` Rafael J. Wysocki
2009-09-09 23:39 ` [PATCH 7/9] PM: Measure device suspend and resume times Rafael J. Wysocki
2009-09-09 23:39 ` Rafael J. Wysocki
2009-09-11 17:48 ` Ben Gamari
2009-09-11 22:18 ` Rafael J. Wysocki
2009-09-09 23:40 ` [PATCH 8/9] PM: Add facility for advanced testing of async suspend/resume Rafael J. Wysocki
2009-09-09 23:40 ` Rafael J. Wysocki
2009-09-09 23:40 ` [PATCH 9/9] PM: Measure suspend and resume times for individual devices Rafael J. Wysocki
2009-09-09 23:40 ` Rafael J. Wysocki
2009-09-10 18:37 ` [PATCH 0/9] PM: Asynchronous suspend of devices Pavel Machek
2009-09-10 18:37 ` Pavel Machek
2009-09-10 18:43 ` Rafael J. Wysocki
2009-09-10 18:43 ` Rafael J. Wysocki
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=200909100138.25839.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=arjan@infradead.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=mingo@elte.hu \
--cc=pavel@ucw.cz \
--cc=rui.zhang@intel.com \
--cc=stern@rowland.harvard.edu \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.