Hibernation: Add PM_RESTORE_PREPARE and PM_POST_RESTORE notifiers
Subsystems (2)
PATCH 1/1 Hibernation: Add PM_RESTORE_PREPARE and PM_POST_RESTORE notifiers
[Len, please add to the suspend branch.]
---
From: Alan Stern <[email protected]>
This patch (as1006) adds PM_RESTORE_PREPARE and PM_POST_RESTORE notifiers to the PM core, to be used in analogy with the existing PM_HIBERNATION_PREPARE and PM_POST_HIBERNATION notifiers.
--- Documentation/power/notifiers.txt | 8 ++++++++ include/linux/notifier.h | 2 ++ kernel/power/disk.c | 6 ++++++ kernel/power/user.c | 27 +++++++++++++++------------ 4 files changed, 31 insertions(+), 12 deletions(-)
Documentation/power/notifiers.txt +8 -0
@@ -28,6 +28,14 @@ PM_POST_HIBERNATION The system memory st hibernation. Device drivers' .resume() callbacks have been executed and tasks have been thawed. +PM_RESTORE_PREPARE The system is going to restore a hibernation image. + If all goes well the restored kernel will issue a + PM_POST_HIBERNATION notification. + +PM_POST_RESTORE An error occurred during the hibernation restore. + Device drivers' .resume() callbacks have been executed + and tasks have been thawed. + PM_SUSPEND_PREPARE The system is preparing for a suspend. PM_POST_SUSPEND The system has just resumed or an error occured during
include/linux/notifier.h +2 -0
@@ -230,6 +230,8 @@ static inline int notifier_to_errno(int#define PM_POST_HIBERNATION 0x0002/* Hibernation finished */ #define PM_SUSPEND_PREPARE 0x0003/* Going to suspend the system */ #define PM_POST_SUSPEND 0x0004/* Suspend finished */ +#define PM_RESTORE_PREPARE 0x0005/* Going to restore a saved image */ +#define PM_POST_RESTORE 0x0006/* Restore failed */ /* Console keyboard events. * Note: KBD_KEYCODE is always sent before KBD_UNBOUND_KEYCODE, KBD_UNICODE and
kernel/power/disk.c +6 -0
@@ -489,6 +489,10 @@ static int software_resume(void) goto Unlock; } + error =pm_notifier_call_chain (PM_RESTORE_PREPARE ); +if (error) + goto Exit; + error =create_basic_memory_bitmaps ();if (error) goto Finish;
@@ -512,6 +516,8 @@ static int software_resume(void) Done:free_basic_memory_bitmaps (); Finish: +pm_notifier_call_chain (PM_POST_RESTORE ); + Exit:atomic_inc (&snapshot_device_available);/* For success case, the suspend path will release the lock */ Unlock:
kernel/power/user.c +15 -12
@@ -67,6 +67,7 @@ atomic_t snapshot_device_available = ATOstatic int snapshot_open (struct inode *inode,struct file *filp) {struct snapshot_data *data; +int error;if (!atomic_add_unless (&snapshot_device_available,-1 ,0 ))return -EBUSY ;
@@ -87,9 +88,15 @@ static int snapshot_open(struct inode *i data->swap = swsusp_resume_device ?swap_type_of (swsusp_resume_device,0 ,NULL ) :-1 ; data->mode =O_RDONLY ; + error =pm_notifier_call_chain (PM_RESTORE_PREPARE ); }else { data->swap =-1 ; data->mode =O_WRONLY ; + error =pm_notifier_call_chain (PM_HIBERNATION_PREPARE ); + } +if (error) { +atomic_inc (&snapshot_device_available); +return error; } data->frozen =0 ; data->ready =0 ;
@@ -111,6 +118,8 @@ static int snapshot_release(struct inodethaw_processes ();mutex_unlock (&pm_mutex); } +pm_notifier_call_chain (data->mode ==O_WRONLY ? +PM_POST_HIBERNATION :PM_POST_RESTORE );atomic_inc (&snapshot_device_available);return 0 ; }
@@ -174,18 +183,13 @@ static int snapshot_ioctl(struct inode *if (data->frozen)break ;mutex_lock (&pm_mutex); - error =pm_notifier_call_chain (PM_HIBERNATION_PREPARE ); -if (!error) { -printk ("Syncing filesystems ... " ); -sys_sync (); -printk ("done.\n" ); - - error =freeze_processes (); -if (error) -thaw_processes (); - } +printk ("Syncing filesystems ... " ); +sys_sync (); +printk ("done.\n" ); + + error =freeze_processes ();if (error) -pm_notifier_call_chain (PM_POST_HIBERNATION ); +thaw_processes ();mutex_unlock (&pm_mutex);if (!error) data->frozen =1 ;
@@ -196,7 +200,6 @@ static int snapshot_ioctl(struct inode *break ;mutex_lock (&pm_mutex);thaw_processes (); -pm_notifier_call_chain (PM_POST_HIBERNATION );mutex_unlock (&pm_mutex); data->frozen =0 ;break ;
Quoted 4 lines · Rafael J. Wysocki
[Len, please add to the suspend branch.]
---
From: Alan Stern <[email protected]>
Quoted 8 lines
This patch (as1006) adds
PM_RESTORE_PREPAREandPM_POST_RESTOREnotifiers to the PM core, to be used in analogy with the existingPM_HIBERNATION_PREPAREandPM_POST_HIBERNATIONnotifiers.Signed-off-by Alan Stern <[email protected]>Cc Pavel Machek <[email protected]>Cc Nigel Cunningham <[email protected]>Signed-off-by "Rafael J. Wysocki" <[email protected]>
ACK.
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Quoted 4 lines · Rafael J. Wysocki
[Len, please add to the suspend branch.]
---
From: Alan Stern <[email protected]>
Quoted 8 lines
This patch (as1006) adds
PM_RESTORE_PREPAREandPM_POST_RESTOREnotifiers to the PM core, to be used in analogy with the existingPM_HIBERNATION_PREPAREandPM_POST_HIBERNATIONnotifiers.Signed-off-by Alan Stern <[email protected]>Cc Pavel Machek <[email protected]>Cc Nigel Cunningham <[email protected]>Signed-off-by "Rafael J. Wysocki" <[email protected]>
ACK.
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Quoted 8 lines · Rafael J. Wysocki
[Len, please add to the suspend branch.]
---
From: Alan Stern <[email protected]>This patch (as1006) adds
PM_RESTORE_PREPAREandPM_POST_RESTOREnotifiers to the PM core, to be used in analogy with the existingPM_HIBERNATION_PREPAREandPM_POST_HIBERNATIONnotifiers.
Quoted 5 lines
Signed-off-by Alan Stern <[email protected]>Cc Pavel Machek <[email protected]>Cc Nigel Cunningham <[email protected]>Signed-off-by "Rafael J. Wysocki" <[email protected]>---
Please consider this version of the patch as obsolete. An update has just been sent.
Greetings,
Rafael
Quoted 139 lines
Documentation/power/notifiers.txt | 8 ++++++++ include/linux/notifier.h | 2 ++ kernel/power/disk.c | 6 ++++++ kernel/power/user.c | 27 +++++++++++++++------------ 4 files changed, 31 insertions(+), 12 deletions(-)Index:
linux-2.6/Documentation/power/notifiers.txt
===================================================================Documentation/power/notifiers.txt +8
-0@@ -28,6 +28,14 @@ PM_POST_HIBERNATION The system memory st hibernation. Device drivers' .resume() callbacks have been executed and tasks have been thawed. +PM_RESTORE_PREPARE The system is going to restore a hibernation image. + If all goes well the restored kernel will issue a + PM_POST_HIBERNATION notification. + +PM_POST_RESTORE An error occurred during the hibernation restore. + Device drivers' .resume() callbacks have been executed + and tasks have been thawed. + PM_SUSPEND_PREPARE The system is preparing for a suspend. PM_POST_SUSPEND The system has just resumed or an error occured duringIndex:
linux-2.6/include/linux/notifier.h
===================================================================include/linux/notifier.h +2
-0@@ -230,6 +230,8 @@ static inline int notifier_to_errno(int#define PM_POST_HIBERNATION 0x0002/* Hibernation finished */ #define PM_SUSPEND_PREPARE 0x0003/* Going to suspend the system */ #define PM_POST_SUSPEND 0x0004/* Suspend finished */ +#define PM_RESTORE_PREPARE 0x0005/* Going to restore a saved image */ +#define PM_POST_RESTORE 0x0006/* Restore failed */ /* Console keyboard events. * Note: KBD_KEYCODE is always sent before KBD_UNBOUND_KEYCODE, KBD_UNICODE and Index:
linux-2.6/kernel/power/disk.c
===================================================================kernel/power/disk.c +6
-0@@ -489,6 +489,10 @@ static int software_resume(void) goto Unlock; } + error =pm_notifier_call_chain (PM_RESTORE_PREPARE ); +if (error) + goto Exit; + error =create_basic_memory_bitmaps ();if (error) goto Finish;@@ -512,6 +516,8 @@ static int software_resume(void) Done:free_basic_memory_bitmaps (); Finish: +pm_notifier_call_chain (PM_POST_RESTORE ); + Exit:atomic_inc (&snapshot_device_available);/* For success case, the suspend path will release the lock */ Unlock:Index:
linux-2.6/kernel/power/user.c
===================================================================kernel/power/user.c +15
-13@@ -67,6 +67,7 @@ atomic_t snapshot_device_available = ATOstatic int snapshot_open (struct inode *inode,struct file *filp) {struct snapshot_data *data; +int error;if (!atomic_add_unless (&snapshot_device_available,-1 ,0 ))return -EBUSY ;@@ -87,9 +88,15 @@ static int snapshot_open(struct inode *i data->swap = swsusp_resume_device ?swap_type_of (swsusp_resume_device,0 ,NULL ) :-1 ; data->mode =O_RDONLY ; + error =pm_notifier_call_chain (PM_RESTORE_PREPARE ); }else { data->swap =-1 ; data->mode =O_WRONLY ; + error =pm_notifier_call_chain (PM_HIBERNATION_PREPARE ); + } +if (error) { +atomic_inc (&snapshot_device_available); +return error; } data->frozen =0 ; data->ready =0 ;@@ -111,6 +118,8 @@ static int snapshot_release(struct inodethaw_processes ();mutex_unlock (&pm_mutex); } +pm_notifier_call_chain (data->mode ==O_WRONLY ? +PM_POST_HIBERNATION :PM_POST_RESTORE );atomic_inc (&snapshot_device_available);return 0 ; }@@ -174,18 +183,13 @@ static int snapshot_ioctl(struct inode *if (data->frozen)break ;mutex_lock (&pm_mutex); - error =pm_notifier_call_chain (PM_HIBERNATION_PREPARE ); -if (!error) { -printk ("Syncing filesystems ... " ); -sys_sync (); -printk ("done.\n" ); - - error =freeze_processes (); -if (error) -thaw_processes (); - } +printk ("Syncing filesystems ... " ); +sys_sync (); +printk ("done.\n" ); + + error =freeze_processes ();if (error) -pm_notifier_call_chain (PM_POST_HIBERNATION ); +thaw_processes ();mutex_unlock (&pm_mutex);if (!error) data->frozen =1 ;@@ -196,7 +200,6 @@ static int snapshot_ioctl(struct inode *break ;mutex_lock (&pm_mutex);thaw_processes (); -pm_notifier_call_chain (PM_POST_HIBERNATION );mutex_unlock (&pm_mutex); data->frozen =0 ;break ; -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Signature · 1 line
"Premature optimization is the root of all evil." - Donald Knuth
Quoted 8 lines · Rafael J. Wysocki
[Len, please add to the suspend branch.]
---
From: Alan Stern <[email protected]>This patch (as1006) adds
PM_RESTORE_PREPAREandPM_POST_RESTOREnotifiers to the PM core, to be used in analogy with the existingPM_HIBERNATION_PREPAREandPM_POST_HIBERNATIONnotifiers.
Quoted 5 lines
Signed-off-by Alan Stern <[email protected]>Cc Pavel Machek <[email protected]>Cc Nigel Cunningham <[email protected]>Signed-off-by "Rafael J. Wysocki" <[email protected]>---
Please consider this version of the patch as obsolete. An update has just been sent.
Greetings,
Rafael
Quoted 139 lines
Documentation/power/notifiers.txt | 8 ++++++++ include/linux/notifier.h | 2 ++ kernel/power/disk.c | 6 ++++++ kernel/power/user.c | 27 +++++++++++++++------------ 4 files changed, 31 insertions(+), 12 deletions(-)Index:
linux-2.6/Documentation/power/notifiers.txt
===================================================================Documentation/power/notifiers.txt +8
-0@@ -28,6 +28,14 @@ PM_POST_HIBERNATION The system memory st hibernation. Device drivers' .resume() callbacks have been executed and tasks have been thawed. +PM_RESTORE_PREPARE The system is going to restore a hibernation image. + If all goes well the restored kernel will issue a + PM_POST_HIBERNATION notification. + +PM_POST_RESTORE An error occurred during the hibernation restore. + Device drivers' .resume() callbacks have been executed + and tasks have been thawed. + PM_SUSPEND_PREPARE The system is preparing for a suspend. PM_POST_SUSPEND The system has just resumed or an error occured duringIndex:
linux-2.6/include/linux/notifier.h
===================================================================include/linux/notifier.h +2
-0@@ -230,6 +230,8 @@ static inline int notifier_to_errno(int#define PM_POST_HIBERNATION 0x0002/* Hibernation finished */ #define PM_SUSPEND_PREPARE 0x0003/* Going to suspend the system */ #define PM_POST_SUSPEND 0x0004/* Suspend finished */ +#define PM_RESTORE_PREPARE 0x0005/* Going to restore a saved image */ +#define PM_POST_RESTORE 0x0006/* Restore failed */ /* Console keyboard events. * Note: KBD_KEYCODE is always sent before KBD_UNBOUND_KEYCODE, KBD_UNICODE and Index:
linux-2.6/kernel/power/disk.c
===================================================================kernel/power/disk.c +6
-0@@ -489,6 +489,10 @@ static int software_resume(void) goto Unlock; } + error =pm_notifier_call_chain (PM_RESTORE_PREPARE ); +if (error) + goto Exit; + error =create_basic_memory_bitmaps ();if (error) goto Finish;@@ -512,6 +516,8 @@ static int software_resume(void) Done:free_basic_memory_bitmaps (); Finish: +pm_notifier_call_chain (PM_POST_RESTORE ); + Exit:atomic_inc (&snapshot_device_available);/* For success case, the suspend path will release the lock */ Unlock:Index:
linux-2.6/kernel/power/user.c
===================================================================kernel/power/user.c +15
-13@@ -67,6 +67,7 @@ atomic_t snapshot_device_available = ATOstatic int snapshot_open (struct inode *inode,struct file *filp) {struct snapshot_data *data; +int error;if (!atomic_add_unless (&snapshot_device_available,-1 ,0 ))return -EBUSY ;@@ -87,9 +88,15 @@ static int snapshot_open(struct inode *i data->swap = swsusp_resume_device ?swap_type_of (swsusp_resume_device,0 ,NULL ) :-1 ; data->mode =O_RDONLY ; + error =pm_notifier_call_chain (PM_RESTORE_PREPARE ); }else { data->swap =-1 ; data->mode =O_WRONLY ; + error =pm_notifier_call_chain (PM_HIBERNATION_PREPARE ); + } +if (error) { +atomic_inc (&snapshot_device_available); +return error; } data->frozen =0 ; data->ready =0 ;@@ -111,6 +118,8 @@ static int snapshot_release(struct inodethaw_processes ();mutex_unlock (&pm_mutex); } +pm_notifier_call_chain (data->mode ==O_WRONLY ? +PM_POST_HIBERNATION :PM_POST_RESTORE );atomic_inc (&snapshot_device_available);return 0 ; }@@ -174,18 +183,13 @@ static int snapshot_ioctl(struct inode *if (data->frozen)break ;mutex_lock (&pm_mutex); - error =pm_notifier_call_chain (PM_HIBERNATION_PREPARE ); -if (!error) { -printk ("Syncing filesystems ... " ); -sys_sync (); -printk ("done.\n" ); - - error =freeze_processes (); -if (error) -thaw_processes (); - } +printk ("Syncing filesystems ... " ); +sys_sync (); +printk ("done.\n" ); + + error =freeze_processes ();if (error) -pm_notifier_call_chain (PM_POST_HIBERNATION ); +thaw_processes ();mutex_unlock (&pm_mutex);if (!error) data->frozen =1 ;@@ -196,7 +200,6 @@ static int snapshot_ioctl(struct inode *break ;mutex_lock (&pm_mutex);thaw_processes (); -pm_notifier_call_chain (PM_POST_HIBERNATION );mutex_unlock (&pm_mutex); data->frozen =0 ;break ; -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Signature · 1 line
"Premature optimization is the root of all evil." - Donald Knuth