public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: linux-pm <linux-pm@lists.osdl.org>
Cc: Pavel Machek <pavel@ucw.cz>
Subject: [PATCH] introduce /sys/power/disk_powerdown_mode
Date: Wed, 21 Mar 2007 10:23:01 +0100	[thread overview]
Message-ID: <1174468981.3769.8.camel@johannes.berg> (raw)

This patch introduces /sys/power/disk_powerdown_mode and
deprecates /sys/power/disk. The former has the advantages
 * a much more expressive name
 * contains all valid modes as well as the selected one
   in a fashion known from the LED subsystem.

The disk attribute is scheduled for removal, but since there
are no disadvantages in keeping we give it plenty of time.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>

---
 Documentation/feature-removal-schedule.txt |   12 +++
 kernel/power/Kconfig                       |   13 ++++
 kernel/power/disk.c                        |   92 ++++++++++++++++++++++++++++-
 3 files changed, 114 insertions(+), 3 deletions(-)

--- linux-2.6.orig/kernel/power/disk.c	2007-03-21 08:21:18.726639252 +0100
+++ linux-2.6/kernel/power/disk.c	2007-03-21 10:16:21.802243895 +0100
@@ -307,7 +307,7 @@ static const char * const pm_disk_modes[
 };
 
 /**
- *	disk - Control suspend-to-disk mode
+ *	disk/disk_powerdown_mode - Control suspend-to-disk mode
  *
  *	Suspend-to-disk can be handled in several ways. We have a few options
  *	for putting the system to sleep - using the platform driver (e.g. ACPI
@@ -331,6 +331,7 @@ static const char * const pm_disk_modes[
  *	supports it (as determined from pm_ops->pm_disk_mode).
  */
 
+#ifdef CONFIG_PM_DISKATTR
 static ssize_t disk_show(struct subsystem * subsys, char * buf)
 {
 	return sprintf(buf, "%s\n", pm_disk_modes[pm_disk_mode]);
@@ -374,13 +375,95 @@ static ssize_t disk_store(struct subsyst
 		error = -EINVAL;
 	}
 
-	pr_debug("PM: suspend-to-disk mode set to '%s'\n",
-		 pm_disk_modes[mode]);
+	if (!error)
+		pr_debug("PM: suspend-to-disk mode set to '%s'\n",
+			 pm_disk_modes[mode]);
 	mutex_unlock(&pm_mutex);
 	return error ? error : n;
 }
 
 power_attr(disk);
+#endif
+
+static ssize_t disk_powerdown_mode_show(struct subsystem *subsys, char *buf)
+{
+	int i;
+	char *start = buf;
+
+	for (i = PM_DISK_PLATFORM; i < PM_DISK_MAX; i++) {
+		if (!pm_disk_modes[i])
+			continue;
+		switch (i) {
+		case PM_DISK_SHUTDOWN:
+		case PM_DISK_REBOOT:
+		case PM_DISK_TEST:
+		case PM_DISK_TESTPROC:
+			break;
+		default:
+			if (pm_ops && pm_ops->enter &&
+			    (i == pm_ops->pm_disk_mode))
+				break;
+			/* not a valid mode, continue with loop */
+			continue;
+		}
+		if (i == pm_disk_mode)
+			buf += sprintf(buf, "[%s]", pm_disk_modes[i]);
+		else
+			buf += sprintf(buf, "%s", pm_disk_modes[i]);
+		if (i+1 != PM_DISK_MAX)
+			buf += sprintf(buf, " ");
+	}
+	buf += sprintf(buf, "\n");
+	return buf-start;
+}
+
+
+static ssize_t disk_powerdown_mode_store(struct subsystem *s,
+					 const char *buf, size_t n)
+{
+	int error = 0;
+	int i;
+	int len;
+	char *p;
+	suspend_disk_method_t mode = 0;
+
+	p = memchr(buf, '\n', n);
+	len = p ? p - buf : n;
+
+	mutex_lock(&pm_mutex);
+	for (i = PM_DISK_PLATFORM; i < PM_DISK_MAX; i++) {
+		if (!strncmp(buf, pm_disk_modes[i], len)) {
+			mode = i;
+			break;
+		}
+	}
+	if (mode) {
+		switch (mode) {
+		case PM_DISK_SHUTDOWN:
+		case PM_DISK_REBOOT:
+		case PM_DISK_TEST:
+		case PM_DISK_TESTPROC:
+			pm_disk_mode = mode;
+			break;
+		default:
+			if (pm_ops && pm_ops->enter &&
+			    (mode == pm_ops->pm_disk_mode))
+				pm_disk_mode = mode;
+			else
+				error = -EINVAL;
+		}
+	} else {
+		error = -EINVAL;
+	}
+
+	if (!error)
+		pr_debug("PM: suspend-to-disk mode set to '%s'\n",
+			 pm_disk_modes[mode]);
+	mutex_unlock(&pm_mutex);
+	return error ? error : n;
+}
+
+power_attr(disk_powerdown_mode);
 
 static ssize_t resume_show(struct subsystem * subsys, char *buf)
 {
@@ -434,7 +517,10 @@ static ssize_t image_size_store(struct s
 power_attr(image_size);
 
 static struct attribute * g[] = {
+#ifdef CONFIG_PM_DISKATTR
 	&disk_attr.attr,
+#endif
+	&disk_powerdown_mode_attr.attr,
 	&resume_attr.attr,
 	&image_size_attr.attr,
 	NULL,
--- linux-2.6.orig/kernel/power/Kconfig	2007-03-21 08:27:18.496639252 +0100
+++ linux-2.6/kernel/power/Kconfig	2007-03-21 10:17:42.562243895 +0100
@@ -19,6 +19,19 @@ config PM
 	  will issue the hlt instruction if nothing is to be done, thereby
 	  sending the processor to sleep and saving power.
 
+config PM_DISKATTR
+	bool "disk attribute in /sys/power/"
+	depends on PM
+	default y
+	---help---
+	  The "disk" attribute in /sys/power/ is being deprecated in favour
+	  of the "disk_powerdown_mode" attribute because the former does not
+	  let userspace see which modes are possible and the name is not
+	  very expressive.
+
+	  Deselect this option to turn off the deprecated disk attribute.
+	  If unsure, leave this option enabled.
+
 config PM_LEGACY
 	bool "Legacy Power Management API (DEPRECATED)"
 	depends on PM
--- linux-2.6.orig/Documentation/feature-removal-schedule.txt	2007-03-21 10:11:52.452243895 +0100
+++ linux-2.6/Documentation/feature-removal-schedule.txt	2007-03-21 10:18:37.832243895 +0100
@@ -334,3 +334,15 @@ Why:	powermac supports proper generic pm
 Who:	Johannes Berg <johannes@sipsolutions.net>
 
 ---------------------------
+
+What:	/sys/power/disk
+When:	Set PM_DISKATTR default n in 2.6.24, remove in 2.6.26
+Files:	kernel/power/disk.c kernel/power/Kconfig
+Why:	/sys/power/disk is not a very expressive name for what it
+	really is: /sys/power/disk_powerdown_mode. Having introduced
+	the latter which also has the advantage that it contains all
+	valid modes as well as the currently selected mode,
+	/sys/power/disk becomes useless.
+Who:	Johannes Berg <johannes@sipsolutions.net>
+
+---------------------------

             reply	other threads:[~2007-03-21  9:23 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-21  9:23 Johannes Berg [this message]
2007-03-21 12:25 ` [PATCH] introduce /sys/power/disk_powerdown_mode Rafael J. Wysocki
2007-03-21 12:25   ` Johannes Berg
2007-03-21 12:29 ` Pavel Machek
2007-03-21 12:32   ` Johannes Berg
2007-03-21 13:11     ` Pavel Machek
2007-03-21 13:12       ` Johannes Berg
2007-03-21 13:17         ` Pavel Machek
2007-03-21 14:01           ` Rafael J. Wysocki
2007-03-21 22:08             ` Pavel Machek
2007-03-22 13:13               ` [linux-pm] " Stefan Seyfried
2007-03-22 14:34         ` [PATCH] power management: change /sys/power/disk display Johannes Berg
2007-03-22 21:45           ` Rafael J. Wysocki
2007-03-23  0:05           ` Pavel Machek
2007-03-23 13:48             ` Johannes Berg
2007-03-23 23:46               ` Pavel Machek
2007-03-23 23:53                 ` Johannes Berg
2007-03-24  0:14                   ` Pavel Machek
2007-03-24  0:16                     ` Johannes Berg

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=1174468981.3769.8.camel@johannes.berg \
    --to=johannes@sipsolutions.net \
    --cc=linux-pm@lists.osdl.org \
    --cc=pavel@ucw.cz \
    /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