diff options
| author | Luca Tettamanti <kronos.it@gmail.com> | 2006-03-23 06:00:09 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-23 10:38:08 -0500 |
| commit | 9b238205ba5d79a8a242d7a5ddb82b89e4dc4e48 (patch) | |
| tree | 494b06bddd9d6b28a4e83ad7b49523a92ee5b207 /kernel/power | |
| parent | 94c188d32996beac00426740974310e32f162c14 (diff) | |
[PATCH] swsusp: add s2ram ioctl to userland interface
Add the SNAPSHOT_S2RAM ioctl to the snapshot device.
This ioctl allows a userland application to make the system (previously frozen
with the SNAPSHOT_FREE ioctl) enter the S3 state without freezing processes
and disabling nonboot CPUs for the second time.
This will allow us to implement the suspend-to-disk-and-RAM (STDR)
functionality in the userland suspend tools.
Signed-off-by: Luca Tettamanti <kronos.it@gmail.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/power')
| -rw-r--r-- | kernel/power/main.c | 2 | ||||
| -rw-r--r-- | kernel/power/power.h | 4 | ||||
| -rw-r--r-- | kernel/power/user.c | 36 |
3 files changed, 40 insertions, 2 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 9cb235cba4a9..ee371f50ccaa 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
| @@ -103,7 +103,7 @@ static int suspend_prepare(suspend_state_t state) | |||
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | 105 | ||
| 106 | static int suspend_enter(suspend_state_t state) | 106 | int suspend_enter(suspend_state_t state) |
| 107 | { | 107 | { |
| 108 | int error = 0; | 108 | int error = 0; |
| 109 | unsigned long flags; | 109 | unsigned long flags; |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 42c431c8bdde..f06f12f21767 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
| @@ -77,7 +77,8 @@ int snapshot_image_loaded(struct snapshot_handle *handle); | |||
| 77 | #define SNAPSHOT_GET_SWAP_PAGE _IOR(SNAPSHOT_IOC_MAGIC, 8, void *) | 77 | #define SNAPSHOT_GET_SWAP_PAGE _IOR(SNAPSHOT_IOC_MAGIC, 8, void *) |
| 78 | #define SNAPSHOT_FREE_SWAP_PAGES _IO(SNAPSHOT_IOC_MAGIC, 9) | 78 | #define SNAPSHOT_FREE_SWAP_PAGES _IO(SNAPSHOT_IOC_MAGIC, 9) |
| 79 | #define SNAPSHOT_SET_SWAP_FILE _IOW(SNAPSHOT_IOC_MAGIC, 10, unsigned int) | 79 | #define SNAPSHOT_SET_SWAP_FILE _IOW(SNAPSHOT_IOC_MAGIC, 10, unsigned int) |
| 80 | #define SNAPSHOT_IOC_MAXNR 10 | 80 | #define SNAPSHOT_S2RAM _IO(SNAPSHOT_IOC_MAGIC, 11) |
| 81 | #define SNAPSHOT_IOC_MAXNR 11 | ||
| 81 | 82 | ||
| 82 | /** | 83 | /** |
| 83 | * The bitmap is used for tracing allocated swap pages | 84 | * The bitmap is used for tracing allocated swap pages |
| @@ -112,3 +113,4 @@ extern int swsusp_resume(void); | |||
| 112 | extern int swsusp_read(void); | 113 | extern int swsusp_read(void); |
| 113 | extern int swsusp_write(void); | 114 | extern int swsusp_write(void); |
| 114 | extern void swsusp_close(void); | 115 | extern void swsusp_close(void); |
| 116 | extern int suspend_enter(suspend_state_t state); | ||
diff --git a/kernel/power/user.c b/kernel/power/user.c index bbd4842104aa..3f1539fbe48a 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -266,6 +266,42 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
| 266 | } | 266 | } |
| 267 | break; | 267 | break; |
| 268 | 268 | ||
| 269 | case SNAPSHOT_S2RAM: | ||
| 270 | if (!data->frozen) { | ||
| 271 | error = -EPERM; | ||
| 272 | break; | ||
| 273 | } | ||
| 274 | |||
| 275 | if (down_trylock(&pm_sem)) { | ||
| 276 | error = -EBUSY; | ||
| 277 | break; | ||
| 278 | } | ||
| 279 | |||
| 280 | if (pm_ops->prepare) { | ||
| 281 | error = pm_ops->prepare(PM_SUSPEND_MEM); | ||
| 282 | if (error) | ||
| 283 | goto OutS3; | ||
| 284 | } | ||
| 285 | |||
| 286 | /* Put devices to sleep */ | ||
| 287 | error = device_suspend(PMSG_SUSPEND); | ||
| 288 | if (error) { | ||
| 289 | printk(KERN_ERR "Failed to suspend some devices.\n"); | ||
| 290 | } else { | ||
| 291 | /* Enter S3, system is already frozen */ | ||
| 292 | suspend_enter(PM_SUSPEND_MEM); | ||
| 293 | |||
| 294 | /* Wake up devices */ | ||
| 295 | device_resume(); | ||
| 296 | } | ||
| 297 | |||
| 298 | if (pm_ops->finish) | ||
| 299 | pm_ops->finish(PM_SUSPEND_MEM); | ||
| 300 | |||
| 301 | OutS3: | ||
| 302 | up(&pm_sem); | ||
| 303 | break; | ||
| 304 | |||
| 269 | default: | 305 | default: |
| 270 | error = -ENOTTY; | 306 | error = -ENOTTY; |
| 271 | 307 | ||
