- int error;
- unsigned int free_pages;
-
- if (!pm_ops || !pm_ops->enter)
- return -EPERM;
-
- pm_prepare_console();
-
- if (freeze_processes()) {
- error = -EAGAIN;
- goto Thaw;
- }
-
- if ((free_pages = global_page_state(NR_FREE_PAGES))
- < FREE_PAGE_NUMBER) {
- pr_debug("PM: free some memory\n");
- shrink_all_memory(FREE_PAGE_NUMBER - free_pages);
- if (nr_free_pages() < FREE_PAGE_NUMBER) {
- error = -ENOMEM;
- printk(KERN_ERR "PM: No enough memory\n");
- goto Thaw;
- }
- }
-
- if (pm_ops->prepare) {
- if ((error = pm_ops->prepare(state)))
- goto Thaw;
- }
-
- suspend_console();
- error = device_suspend(PMSG_SUSPEND);
- if (error) {
- printk(KERN_ERR "Some devices failed to suspend\n");
- goto Resume_devices;
- }
- error = disable_nonboot_cpus();
- if (!error)
- return 0;
-
- enable_nonboot_cpus();
- Resume_devices:
- pm_finish(state);
- device_resume();
- resume_console();
- Thaw:
- thaw_processes();
- pm_restore_console();
- return error;