diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/power/hibernate.c | 41 | ||||
-rw-r--r-- | kernel/power/user.c | 22 |
2 files changed, 31 insertions, 32 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index b26f5f1e773e..d4e54053d009 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
@@ -644,22 +644,22 @@ int hibernate(void) | |||
644 | if (error) | 644 | if (error) |
645 | goto Exit; | 645 | goto Exit; |
646 | 646 | ||
647 | /* Allocate memory management structures */ | ||
648 | error = create_basic_memory_bitmaps(); | ||
649 | if (error) | ||
650 | goto Exit; | ||
651 | |||
652 | printk(KERN_INFO "PM: Syncing filesystems ... "); | 647 | printk(KERN_INFO "PM: Syncing filesystems ... "); |
653 | sys_sync(); | 648 | sys_sync(); |
654 | printk("done.\n"); | 649 | printk("done.\n"); |
655 | 650 | ||
656 | error = freeze_processes(); | 651 | error = freeze_processes(); |
657 | if (error) | 652 | if (error) |
658 | goto Free_bitmaps; | 653 | goto Exit; |
654 | |||
655 | /* Allocate memory management structures */ | ||
656 | error = create_basic_memory_bitmaps(); | ||
657 | if (error) | ||
658 | goto Thaw; | ||
659 | 659 | ||
660 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); | 660 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); |
661 | if (error || freezer_test_done) | 661 | if (error || freezer_test_done) |
662 | goto Thaw; | 662 | goto Free_bitmaps; |
663 | 663 | ||
664 | if (in_suspend) { | 664 | if (in_suspend) { |
665 | unsigned int flags = 0; | 665 | unsigned int flags = 0; |
@@ -682,14 +682,13 @@ int hibernate(void) | |||
682 | pr_debug("PM: Image restored successfully.\n"); | 682 | pr_debug("PM: Image restored successfully.\n"); |
683 | } | 683 | } |
684 | 684 | ||
685 | Free_bitmaps: | ||
686 | free_basic_memory_bitmaps(); | ||
685 | Thaw: | 687 | Thaw: |
686 | thaw_processes(); | 688 | thaw_processes(); |
687 | 689 | ||
688 | /* Don't bother checking whether freezer_test_done is true */ | 690 | /* Don't bother checking whether freezer_test_done is true */ |
689 | freezer_test_done = false; | 691 | freezer_test_done = false; |
690 | |||
691 | Free_bitmaps: | ||
692 | free_basic_memory_bitmaps(); | ||
693 | Exit: | 692 | Exit: |
694 | pm_notifier_call_chain(PM_POST_HIBERNATION); | 693 | pm_notifier_call_chain(PM_POST_HIBERNATION); |
695 | pm_restore_console(); | 694 | pm_restore_console(); |
@@ -806,21 +805,19 @@ static int software_resume(void) | |||
806 | pm_prepare_console(); | 805 | pm_prepare_console(); |
807 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); | 806 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); |
808 | if (error) | 807 | if (error) |
809 | goto close_finish; | 808 | goto Close_Finish; |
810 | |||
811 | error = create_basic_memory_bitmaps(); | ||
812 | if (error) | ||
813 | goto close_finish; | ||
814 | 809 | ||
815 | pr_debug("PM: Preparing processes for restore.\n"); | 810 | pr_debug("PM: Preparing processes for restore.\n"); |
816 | error = freeze_processes(); | 811 | error = freeze_processes(); |
817 | if (error) { | 812 | if (error) |
818 | swsusp_close(FMODE_READ); | 813 | goto Close_Finish; |
819 | goto Done; | ||
820 | } | ||
821 | 814 | ||
822 | pr_debug("PM: Loading hibernation image.\n"); | 815 | pr_debug("PM: Loading hibernation image.\n"); |
823 | 816 | ||
817 | error = create_basic_memory_bitmaps(); | ||
818 | if (error) | ||
819 | goto Thaw; | ||
820 | |||
824 | error = swsusp_read(&flags); | 821 | error = swsusp_read(&flags); |
825 | swsusp_close(FMODE_READ); | 822 | swsusp_close(FMODE_READ); |
826 | if (!error) | 823 | if (!error) |
@@ -828,9 +825,9 @@ static int software_resume(void) | |||
828 | 825 | ||
829 | printk(KERN_ERR "PM: Failed to load hibernation image, recovering.\n"); | 826 | printk(KERN_ERR "PM: Failed to load hibernation image, recovering.\n"); |
830 | swsusp_free(); | 827 | swsusp_free(); |
831 | thaw_processes(); | ||
832 | Done: | ||
833 | free_basic_memory_bitmaps(); | 828 | free_basic_memory_bitmaps(); |
829 | Thaw: | ||
830 | thaw_processes(); | ||
834 | Finish: | 831 | Finish: |
835 | pm_notifier_call_chain(PM_POST_RESTORE); | 832 | pm_notifier_call_chain(PM_POST_RESTORE); |
836 | pm_restore_console(); | 833 | pm_restore_console(); |
@@ -840,7 +837,7 @@ static int software_resume(void) | |||
840 | mutex_unlock(&pm_mutex); | 837 | mutex_unlock(&pm_mutex); |
841 | pr_debug("PM: Hibernation image not present or could not be loaded.\n"); | 838 | pr_debug("PM: Hibernation image not present or could not be loaded.\n"); |
842 | return error; | 839 | return error; |
843 | close_finish: | 840 | Close_Finish: |
844 | swsusp_close(FMODE_READ); | 841 | swsusp_close(FMODE_READ); |
845 | goto Finish; | 842 | goto Finish; |
846 | } | 843 | } |
diff --git a/kernel/power/user.c b/kernel/power/user.c index 4ed81e74f86f..63368163e98d 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
@@ -60,11 +60,6 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
60 | error = -ENOSYS; | 60 | error = -ENOSYS; |
61 | goto Unlock; | 61 | goto Unlock; |
62 | } | 62 | } |
63 | if(create_basic_memory_bitmaps()) { | ||
64 | atomic_inc(&snapshot_device_available); | ||
65 | error = -ENOMEM; | ||
66 | goto Unlock; | ||
67 | } | ||
68 | nonseekable_open(inode, filp); | 63 | nonseekable_open(inode, filp); |
69 | data = &snapshot_state; | 64 | data = &snapshot_state; |
70 | filp->private_data = data; | 65 | filp->private_data = data; |
@@ -90,10 +85,9 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
90 | if (error) | 85 | if (error) |
91 | pm_notifier_call_chain(PM_POST_RESTORE); | 86 | pm_notifier_call_chain(PM_POST_RESTORE); |
92 | } | 87 | } |
93 | if (error) { | 88 | if (error) |
94 | free_basic_memory_bitmaps(); | ||
95 | atomic_inc(&snapshot_device_available); | 89 | atomic_inc(&snapshot_device_available); |
96 | } | 90 | |
97 | data->frozen = 0; | 91 | data->frozen = 0; |
98 | data->ready = 0; | 92 | data->ready = 0; |
99 | data->platform_support = 0; | 93 | data->platform_support = 0; |
@@ -111,11 +105,11 @@ static int snapshot_release(struct inode *inode, struct file *filp) | |||
111 | lock_system_sleep(); | 105 | lock_system_sleep(); |
112 | 106 | ||
113 | swsusp_free(); | 107 | swsusp_free(); |
114 | free_basic_memory_bitmaps(); | ||
115 | data = filp->private_data; | 108 | data = filp->private_data; |
116 | free_all_swap_pages(data->swap); | 109 | free_all_swap_pages(data->swap); |
117 | if (data->frozen) { | 110 | if (data->frozen) { |
118 | pm_restore_gfp_mask(); | 111 | pm_restore_gfp_mask(); |
112 | free_basic_memory_bitmaps(); | ||
119 | thaw_processes(); | 113 | thaw_processes(); |
120 | } | 114 | } |
121 | pm_notifier_call_chain(data->mode == O_RDONLY ? | 115 | pm_notifier_call_chain(data->mode == O_RDONLY ? |
@@ -220,14 +214,22 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
220 | printk("done.\n"); | 214 | printk("done.\n"); |
221 | 215 | ||
222 | error = freeze_processes(); | 216 | error = freeze_processes(); |
223 | if (!error) | 217 | if (error) |
218 | break; | ||
219 | |||
220 | error = create_basic_memory_bitmaps(); | ||
221 | if (error) | ||
222 | thaw_processes(); | ||
223 | else | ||
224 | data->frozen = 1; | 224 | data->frozen = 1; |
225 | |||
225 | break; | 226 | break; |
226 | 227 | ||
227 | case SNAPSHOT_UNFREEZE: | 228 | case SNAPSHOT_UNFREEZE: |
228 | if (!data->frozen || data->ready) | 229 | if (!data->frozen || data->ready) |
229 | break; | 230 | break; |
230 | pm_restore_gfp_mask(); | 231 | pm_restore_gfp_mask(); |
232 | free_basic_memory_bitmaps(); | ||
231 | thaw_processes(); | 233 | thaw_processes(); |
232 | data->frozen = 0; | 234 | data->frozen = 0; |
233 | break; | 235 | break; |