mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Nigel Cunningham <ncunningham@linuxmail.org>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] Suspend2 Merge: init hooks
Date: Thu, 16 Sep 2004 21:18:45 +1000	[thread overview]
Message-ID: <1095333524.3324.186.camel@laptop.cunninghams> (raw)

[Only sent this to Andrew the first time, sorry].

Hi.

This patch adds code to files in the init directory to fire suspend at
the right time during boot. Suspend2 can now be built as modules which
can be loaded from an initrd, so we don't use straight initcalls. The
check as to whether we need to resume is initiated just before mounting
the root fs if we're not using an initrd. If an initrd is in use, it is
expected that it will be configured to mount /proc and echo >
/proc/software_suspend/activate after loading modules and/or setting up
access to the storage medium (should allow for encryption of the image).
If the linuxrc doesn't include the activate call, it is fired after the
initrd finishes.

The patch also makes try_name and name_to_devt non __init so they can be
used to parse new storage locations. The location of the header
(equivalent to resume=) can be [re]set from a proc entry without needing
to reboot.

Regards,

Nigel

diff -ruN linux-2.6.9-rc1/init/do_mounts.c software-suspend-linux-2.6.9-rc1-rev3/init/do_mounts.c
--- linux-2.6.9-rc1/init/do_mounts.c	2004-05-19 22:10:47.000000000 +1000
+++ software-suspend-linux-2.6.9-rc1-rev3/init/do_mounts.c	2004-09-09 19:36:24.000000000 +1000
@@ -52,7 +52,7 @@
 __setup("ro", readonly);
 __setup("rw", readwrite);
 
-static dev_t __init try_name(char *name, int part)
+static dev_t try_name(char *name, int part)
 {
 	char path[64];
 	char buf[32];
@@ -134,16 +134,21 @@
  *	is mounted on rootfs /sys.
  */
 
-dev_t __init name_to_dev_t(char *name)
+dev_t name_to_dev_t(char *name)
 {
 	char s[32];
 	char *p;
 	dev_t res = 0;
-	int part;
+	int part, mount_result;
 
 #ifdef CONFIG_SYSFS
 	sys_mkdir("/sys", 0700);
-	if (sys_mount("sysfs", "/sys", "sysfs", 0, NULL) < 0)
+	/* 
+	 * When changing resume2 parameter for Software Suspend, sysfs may
+	 * already be mounted. 
+	 */
+	mount_result = sys_mount("sysfs", "/sys", "sysfs", 0, NULL);
+	if (mount_result < 0 && mount_result != -EBUSY)
 		goto out;
 #endif
 
@@ -195,7 +200,8 @@
 	res = try_name(s, part);
 done:
 #ifdef CONFIG_SYSFS
-	sys_umount("/sys", 0);
+	if (mount_result >= 0)
+		sys_umount("/sys", 0);
 out:
 	sys_rmdir("/sys");
 #endif
@@ -204,6 +210,8 @@
 	res = 0;
 	goto done;
 }
+/* Exported for Software Suspend */
+EXPORT_SYMBOL(name_to_dev_t);
 
 static int __init root_dev_setup(char *line)
 {
@@ -397,9 +405,27 @@
 
 	is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
 
+	/* Suspend2:
+	 * By this point, suspend_early_init has been called to initialise our
+	 * proc interface. If modules are built in, they have registered (all
+	 * of the above via late_initcalls).
+	 * 
+	 * We have not yet looked to see if an image exists, however. If we
+	 * have an initrd, it is expected that the user will have set it up
+	 * to echo > /proc/software_suspend/activate and thus initiate any
+	 * resume. If they don'tdo that, we do it immediately after the initrd
+	 * is finished (major issues if they mount filesystems rw from the
+	 * initrd! - they are warned. If there's no usable initrd, we do our
+	 * check next
+	 */
 	if (initrd_load())
 		goto out;
 
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	if (!(software_suspend_state & SUSPEND_RESUME_DONE))
+		software_suspend_try_resume();
+#endif
+	
 	if (is_floppy && rd_doload && rd_load_disk(0))
 		ROOT_DEV = Root_RAM0;
 
diff -ruN linux-2.6.9-rc1/init/do_mounts_initrd.c software-suspend-linux-2.6.9-rc1-rev3/init/do_mounts_initrd.c
--- linux-2.6.9-rc1/init/do_mounts_initrd.c	2004-09-07 21:59:00.000000000 +1000
+++ software-suspend-linux-2.6.9-rc1-rev3/init/do_mounts_initrd.c	2004-09-09 19:36:24.000000000 +1000
@@ -7,6 +7,7 @@
 #include <linux/romfs_fs.h>
 #include <linux/initrd.h>
 #include <linux/sched.h>
+#include <linux/suspend.h>
 
 #include "do_mounts.h"
 
@@ -56,12 +57,24 @@
 	sys_chroot(".");
 	mount_devfs_fs ();
 
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	software_suspend_state |= SUSPEND_RUNNING_INITRD;
+#endif
 	pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
 	if (pid > 0) {
-		while (pid != sys_wait4(-1, &i, 0, NULL))
+		while (pid != sys_wait4(-1, &i, 0, NULL)) {
 			yield();
+			if (current->flags & PF_FREEZE)
+				refrigerator(PF_FREEZE);
+		}
 	}
 
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	software_suspend_state &= ~SUSPEND_RUNNING_INITRD;
+	if (!(software_suspend_state & SUSPEND_RESUME_DONE))
+		software_suspend_try_resume();
+#endif
+
 	/* move initrd to rootfs' /old */
 	sys_fchdir(old_fd);
 	sys_mount("/", ".", NULL, MS_MOVE, NULL);
diff -ruN linux-2.6.9-rc1/init/main.c software-suspend-linux-2.6.9-rc1-rev3/init/main.c
--- linux-2.6.9-rc1/init/main.c	2004-09-07 21:59:00.000000000 +1000
+++ software-suspend-linux-2.6.9-rc1-rev3/init/main.c	2004-09-09 19:36:24.000000000 +1000
@@ -45,6 +45,7 @@
 #include <linux/unistd.h>
 #include <linux/rmap.h>
 #include <linux/mempolicy.h>
+#include <linux/suspend.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -696,6 +697,10 @@
 	else
 		prepare_namespace();
 
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	software_suspend_state &= ~SOFTWARE_SUSPEND_BOOT_TIME;
+#endif
+
 	/*
 	 * Ok, we have completed the initial bootup, and
 	 * we're essentially up and running. Get rid of the


-- 
Nigel Cunningham
Pastoral Worker
Christian Reformed Church of Tuggeranong
PO Box 1004, Tuggeranong, ACT 2901

Many today claim to be tolerant. True tolerance, however, can cope with others
being intolerant.


             reply	other threads:[~2004-09-16 11:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-16 11:18 Nigel Cunningham [this message]
2004-09-17  7:27 ` Christoph Hellwig

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=1095333524.3324.186.camel@laptop.cunninghams \
    --to=ncunningham@linuxmail.org \
    --cc=linux-kernel@vger.kernel.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

all inboxes | Powered by JetHome®