Add error handling to software_suspend
Subsystems (2)
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
kernel/power/swsusp.c +18 -19
@@ -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;
include/linux/suspend.h +19 -7
@@ -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 */
kernel/sys.c +3 -5
@@ -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 :
Signature · 2 lines
When do you have a heart between your knees? [Johanka's followup: and *two* hearts?]
Quoted 3 lines · Pavel Machek
Hi!
This adds error handling to
software_suspend(),
Suspending to disk with this patch applied I can see the resume is stuck on:
"Waiting for DMAs to settle down..."
(previously it booted before I could see where the problem is).
I guess it's another evidence that the problem is with the i830 module?
- Aviram
Hi!
Quoted 8 lines
Quoted 1 line
This adds error handling to
software_suspend(),Suspending to disk with this patch applied I can see the resume is stuck on:
"Waiting for DMAs to settle down..."
(previously it booted before I could see where the problem is).I guess it's another evidence that the problem is with the i830 module?
I don't think so. Waiting for DMAs is gross hack where we sleep with interrupts disabled -- waiting for any running DMAs to end / timeout /etc.
You might want to add some more debug printks....
Pavel
Signature · 2 lines
Horseback riding is like software... ...vgf orggre jura vgf serr.
Quoted 7 lines
This adds error handling to
software_suspend(), and killssoftware_suspend_enabledvariable; it is cleaner that way.do_software_suspend()is now gone.__read_suspend_imagecan be init, so mark it as such to avoid tool warnings. Add prototypes forfreeze_processesandthaw_proceses(or are those elsewhere, already?).
They're in kernel/power/power.h, which swsusp.c already includes. I'll apply the rest.
Thanks,
Pat
Hi!
Quoted 9 lines
Quoted 6 lines
This adds error handling to
software_suspend(), and killssoftware_suspend_enabledvariable; it is cleaner that way.do_software_suspend()is now gone.__read_suspend_imagecan be init, so mark it as such to avoid tool warnings. Add prototypes forfreeze_processesandthaw_proceses(or are those elsewhere, already?).They're in
kernel/power/power.h, whichswsusp.calready includes. I'll apply the rest.
Thanks.
Pavel
Signature · 2 lines
When do you have a heart between your knees? [Johanka's followup: and *two* hearts?]