From: Pavel Machek <pavel@ucw.cz>
To: kernel list <linux-kernel@vger.kernel.org>,
Patrick Mochel <mochel@osdl.org>
Subject: [pm] Add error handling to software_suspend
Date: Sat, 18 Oct 2003 23:07:05 +0200 [thread overview]
Message-ID: <20031018210705.GA22191@elf.ucw.cz> (raw)
Hi!
This adds error handling to software_suspend(), and kills
software_suspend_enabled variable; it is cleaner that
way. do_software_suspend() is now gone. __read_suspend_image can be
init, so mark it as such to avoid tool warnings. Add prototypes for
freeze_processes and thaw_proceses (or are those elsewhere,
already?). Please apply,
Pavel
--- clean/kernel/power/swsusp.c 2003-10-18 20:26:48.000000000 +0200
+++ linux/kernel/power/swsusp.c 2003-10-18 20:46:48.000000000 +0200
@@ -694,11 +697,22 @@
mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
}
-static void do_software_suspend(void)
+/*
+ * This is main interface to the outside world. It needs to be
+ * called from process context.
+ */
+int software_suspend(void)
{
+ int res;
+ if (!software_suspend_enabled)
+ return -EAGAIN;
+
+ software_suspend_enabled = 0;
+ might_sleep();
+
if (arch_prepare_suspend()) {
printk("%sArchitecture failed to prepare\n", name_suspend);
- return;
+ return -EPERM;
}
if (pm_prepare_console())
printk( "%sCan't allocate a console... proceeding\n", name_suspend);
@@ -716,7 +730,7 @@
blk_run_queues();
/* Save state of all device drivers, and stop them. */
- if(drivers_suspend()==0)
+ if ((res = drivers_suspend())==0)
/* If stopping device drivers worked, we proceed basically into
* suspend_save_image.
*
@@ -728,24 +742,12 @@
*/
do_magic(0);
thaw_processes();
- }
+ } else
+ res = -EBUSY;
software_suspend_enabled = 1;
MDELAY(1000);
pm_restore_console();
-}
-
-/*
- * This is main interface to the outside world. It needs to be
- * called from process context.
- */
-void software_suspend(void)
-{
- if(!software_suspend_enabled)
- return;
-
- software_suspend_enabled = 0;
- might_sleep();
- do_software_suspend();
+ return res;
}
/* More restore stuff */
@@ -915,7 +917,7 @@
extern dev_t __init name_to_dev_t(const char *line);
-static int __read_suspend_image(struct block_device *bdev, union diskpage *cur, int noresume)
+static int __init __read_suspend_image(struct block_device *bdev, union diskpage *cur, int noresume)
{
swp_entry_t next;
int i, nr_pgdir_pages;
--- clean/include/linux/suspend.h 2003-10-18 20:26:47.000000000 +0200
+++ linux/include/linux/suspend.h 2003-10-18 22:54:53.000000000 +0200
@@ -45,31 +44,43 @@
/* mm/page_alloc.c */
extern void drain_local_pages(void);
+/* kernel/power/swsusp.c */
+extern int software_suspend(void);
+
extern unsigned int nr_copy_pages __nosavedata;
extern suspend_pagedir_t *pagedir_nosave __nosavedata;
-#endif /* CONFIG_PM */
-
-#ifdef CONFIG_SOFTWARE_SUSPEND
-
-extern unsigned char software_suspend_enabled;
-extern void software_suspend(void);
#else /* CONFIG_SOFTWARE_SUSPEND */
-static inline void software_suspend(void)
+static inline int software_suspend(void)
{
printk("Warning: fake suspend called\n");
+ return -EPERM;
}
+#define software_resume() do { } while(0)
#endif /* CONFIG_SOFTWARE_SUSPEND */
#ifdef CONFIG_PM
extern void refrigerator(unsigned long);
+extern int freeze_processes(void);
+extern void thaw_processes(void);
+
+extern int pm_prepare_console(void);
+extern void pm_restore_console(void);
#else
static inline void refrigerator(unsigned long flag)
{
}
+static inline int freeze_processes(void)
+{
+ return 0;
+}
+static inline void thaw_processes(void)
+{
+
+}
#endif /* CONFIG_PM */
#endif /* _LINUX_SWSUSP_H */
--- clean/kernel/sys.c 2003-10-18 20:26:48.000000000 +0200
+++ linux/kernel/sys.c 2003-10-18 20:44:57.000000000 +0200
@@ -474,13 +474,11 @@
#ifdef CONFIG_SOFTWARE_SUSPEND
case LINUX_REBOOT_CMD_SW_SUSPEND:
- if (!software_suspend_enabled) {
+ {
+ int ret = software_suspend();
unlock_kernel();
- return -EAGAIN;
+ return ret;
}
- software_suspend();
- do_exit(0);
- break;
#endif
default:
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
next reply other threads:[~2003-10-18 21:07 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-18 21:07 Pavel Machek [this message]
2003-10-19 19:19 ` [pm] Add error handling to software_suspend Aviram Jenik
2003-10-19 19:27 ` Pavel Machek
2003-10-20 18:44 ` Patrick Mochel
2003-10-20 19:13 ` Pavel Machek
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=20031018210705.GA22191@elf.ucw.cz \
--to=pavel@ucw.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=mochel@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 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.