diff options
-rw-r--r-- | Documentation/power/userland-swsusp.txt | 26 | ||||
-rw-r--r-- | kernel/power/power.h | 10 | ||||
-rw-r--r-- | kernel/power/user.c | 18 |
3 files changed, 34 insertions, 20 deletions
diff --git a/Documentation/power/userland-swsusp.txt b/Documentation/power/userland-swsusp.txt index 0785500e65fb..af52d535a896 100644 --- a/Documentation/power/userland-swsusp.txt +++ b/Documentation/power/userland-swsusp.txt | |||
@@ -27,17 +27,17 @@ once at a time. | |||
27 | The ioctl() commands recognized by the device are: | 27 | The ioctl() commands recognized by the device are: |
28 | 28 | ||
29 | SNAPSHOT_FREEZE - freeze user space processes (the current process is | 29 | SNAPSHOT_FREEZE - freeze user space processes (the current process is |
30 | not frozen); this is required for SNAPSHOT_ATOMIC_SNAPSHOT | 30 | not frozen); this is required for SNAPSHOT_CREATE_IMAGE |
31 | and SNAPSHOT_ATOMIC_RESTORE to succeed | 31 | and SNAPSHOT_ATOMIC_RESTORE to succeed |
32 | 32 | ||
33 | SNAPSHOT_UNFREEZE - thaw user space processes frozen by SNAPSHOT_FREEZE | 33 | SNAPSHOT_UNFREEZE - thaw user space processes frozen by SNAPSHOT_FREEZE |
34 | 34 | ||
35 | SNAPSHOT_ATOMIC_SNAPSHOT - create a snapshot of the system memory; the | 35 | SNAPSHOT_CREATE_IMAGE - create a snapshot of the system memory; the |
36 | last argument of ioctl() should be a pointer to an int variable, | 36 | last argument of ioctl() should be a pointer to an int variable, |
37 | the value of which will indicate whether the call returned after | 37 | the value of which will indicate whether the call returned after |
38 | creating the snapshot (1) or after restoring the system memory state | 38 | creating the snapshot (1) or after restoring the system memory state |
39 | from it (0) (after resume the system finds itself finishing the | 39 | from it (0) (after resume the system finds itself finishing the |
40 | SNAPSHOT_ATOMIC_SNAPSHOT ioctl() again); after the snapshot | 40 | SNAPSHOT_CREATE_IMAGE ioctl() again); after the snapshot |
41 | has been created the read() operation can be used to transfer | 41 | has been created the read() operation can be used to transfer |
42 | it out of the kernel | 42 | it out of the kernel |
43 | 43 | ||
@@ -49,23 +49,23 @@ SNAPSHOT_ATOMIC_RESTORE - restore the system memory state from the | |||
49 | 49 | ||
50 | SNAPSHOT_FREE - free memory allocated for the snapshot image | 50 | SNAPSHOT_FREE - free memory allocated for the snapshot image |
51 | 51 | ||
52 | SNAPSHOT_SET_IMAGE_SIZE - set the preferred maximum size of the image | 52 | SNAPSHOT_PREF_IMAGE_SIZE - set the preferred maximum size of the image |
53 | (the kernel will do its best to ensure the image size will not exceed | 53 | (the kernel will do its best to ensure the image size will not exceed |
54 | this number, but if it turns out to be impossible, the kernel will | 54 | this number, but if it turns out to be impossible, the kernel will |
55 | create the smallest image possible) | 55 | create the smallest image possible) |
56 | 56 | ||
57 | SNAPSHOT_GET_IMAGE_SIZE - return the actual size of the hibernation image | 57 | SNAPSHOT_GET_IMAGE_SIZE - return the actual size of the hibernation image |
58 | 58 | ||
59 | SNAPSHOT_AVAIL_SWAP - return the amount of available swap in bytes (the last | 59 | SNAPSHOT_AVAIL_SWAP_SIZE - return the amount of available swap in bytes (the |
60 | argument should be a pointer to an unsigned int variable that will | 60 | last argument should be a pointer to an unsigned int variable that will |
61 | contain the result if the call is successful). | 61 | contain the result if the call is successful). |
62 | 62 | ||
63 | SNAPSHOT_GET_SWAP_PAGE - allocate a swap page from the resume partition | 63 | SNAPSHOT_ALLOC_SWAP_PAGE - allocate a swap page from the resume partition |
64 | (the last argument should be a pointer to a loff_t variable that | 64 | (the last argument should be a pointer to a loff_t variable that |
65 | will contain the swap page offset if the call is successful) | 65 | will contain the swap page offset if the call is successful) |
66 | 66 | ||
67 | SNAPSHOT_FREE_SWAP_PAGES - free all swap pages allocated with | 67 | SNAPSHOT_FREE_SWAP_PAGES - free all swap pages allocated by |
68 | SNAPSHOT_GET_SWAP_PAGE | 68 | SNAPSHOT_ALLOC_SWAP_PAGE |
69 | 69 | ||
70 | SNAPSHOT_SET_SWAP_AREA - set the resume partition and the offset (in <PAGE_SIZE> | 70 | SNAPSHOT_SET_SWAP_AREA - set the resume partition and the offset (in <PAGE_SIZE> |
71 | units) from the beginning of the partition at which the swap header is | 71 | units) from the beginning of the partition at which the swap header is |
@@ -102,7 +102,7 @@ The device's write() operation is used for uploading the system memory snapshot | |||
102 | into the kernel. It has the same limitations as the read() operation. | 102 | into the kernel. It has the same limitations as the read() operation. |
103 | 103 | ||
104 | The release() operation frees all memory allocated for the snapshot image | 104 | The release() operation frees all memory allocated for the snapshot image |
105 | and all swap pages allocated with SNAPSHOT_GET_SWAP_PAGE (if any). | 105 | and all swap pages allocated with SNAPSHOT_ALLOC_SWAP_PAGE (if any). |
106 | Thus it is not necessary to use either SNAPSHOT_FREE or | 106 | Thus it is not necessary to use either SNAPSHOT_FREE or |
107 | SNAPSHOT_FREE_SWAP_PAGES before closing the device (in fact it will also | 107 | SNAPSHOT_FREE_SWAP_PAGES before closing the device (in fact it will also |
108 | unfreeze user space processes frozen by SNAPSHOT_UNFREEZE if they are | 108 | unfreeze user space processes frozen by SNAPSHOT_UNFREEZE if they are |
@@ -113,7 +113,7 @@ snapshot image from/to the kernel will use a swap parition, called the resume | |||
113 | partition, or a swap file as storage space (if a swap file is used, the resume | 113 | partition, or a swap file as storage space (if a swap file is used, the resume |
114 | partition is the partition that holds this file). However, this is not really | 114 | partition is the partition that holds this file). However, this is not really |
115 | required, as they can use, for example, a special (blank) suspend partition or | 115 | required, as they can use, for example, a special (blank) suspend partition or |
116 | a file on a partition that is unmounted before SNAPSHOT_ATOMIC_SNAPSHOT and | 116 | a file on a partition that is unmounted before SNAPSHOT_CREATE_IMAGE and |
117 | mounted afterwards. | 117 | mounted afterwards. |
118 | 118 | ||
119 | These utilities MUST NOT make any assumptions regarding the ordering of | 119 | These utilities MUST NOT make any assumptions regarding the ordering of |
@@ -135,7 +135,7 @@ means, such as checksums, to ensure the integrity of the snapshot image. | |||
135 | The suspending and resuming utilities MUST lock themselves in memory, | 135 | The suspending and resuming utilities MUST lock themselves in memory, |
136 | preferrably using mlockall(), before calling SNAPSHOT_FREEZE. | 136 | preferrably using mlockall(), before calling SNAPSHOT_FREEZE. |
137 | 137 | ||
138 | The suspending utility MUST check the value stored by SNAPSHOT_ATOMIC_SNAPSHOT | 138 | The suspending utility MUST check the value stored by SNAPSHOT_CREATE_IMAGE |
139 | in the memory location pointed to by the last argument of ioctl() and proceed | 139 | in the memory location pointed to by the last argument of ioctl() and proceed |
140 | in accordance with it: | 140 | in accordance with it: |
141 | 1. If the value is 1 (ie. the system memory snapshot has just been | 141 | 1. If the value is 1 (ie. the system memory snapshot has just been |
@@ -149,7 +149,7 @@ in accordance with it: | |||
149 | image has been saved. | 149 | image has been saved. |
150 | (b) The suspending utility SHOULD NOT attempt to perform any | 150 | (b) The suspending utility SHOULD NOT attempt to perform any |
151 | file system operations (including reads) on the file systems | 151 | file system operations (including reads) on the file systems |
152 | that were mounted before SNAPSHOT_ATOMIC_SNAPSHOT has been | 152 | that were mounted before SNAPSHOT_CREATE_IMAGE has been |
153 | called. However, it MAY mount a file system that was not | 153 | called. However, it MAY mount a file system that was not |
154 | mounted at that time and perform some operations on it (eg. | 154 | mounted at that time and perform some operations on it (eg. |
155 | use it for saving the image). | 155 | use it for saving the image). |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 8837ea334e33..0dd66fabd393 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -147,12 +147,8 @@ struct resume_swap_area { | |||
147 | #define SNAPSHOT_IOC_MAGIC '3' | 147 | #define SNAPSHOT_IOC_MAGIC '3' |
148 | #define SNAPSHOT_FREEZE _IO(SNAPSHOT_IOC_MAGIC, 1) | 148 | #define SNAPSHOT_FREEZE _IO(SNAPSHOT_IOC_MAGIC, 1) |
149 | #define SNAPSHOT_UNFREEZE _IO(SNAPSHOT_IOC_MAGIC, 2) | 149 | #define SNAPSHOT_UNFREEZE _IO(SNAPSHOT_IOC_MAGIC, 2) |
150 | #define SNAPSHOT_ATOMIC_SNAPSHOT _IOW(SNAPSHOT_IOC_MAGIC, 3, void *) | ||
151 | #define SNAPSHOT_ATOMIC_RESTORE _IO(SNAPSHOT_IOC_MAGIC, 4) | 150 | #define SNAPSHOT_ATOMIC_RESTORE _IO(SNAPSHOT_IOC_MAGIC, 4) |
152 | #define SNAPSHOT_FREE _IO(SNAPSHOT_IOC_MAGIC, 5) | 151 | #define SNAPSHOT_FREE _IO(SNAPSHOT_IOC_MAGIC, 5) |
153 | #define SNAPSHOT_SET_IMAGE_SIZE _IOW(SNAPSHOT_IOC_MAGIC, 6, unsigned long) | ||
154 | #define SNAPSHOT_AVAIL_SWAP _IOR(SNAPSHOT_IOC_MAGIC, 7, void *) | ||
155 | #define SNAPSHOT_GET_SWAP_PAGE _IOR(SNAPSHOT_IOC_MAGIC, 8, void *) | ||
156 | #define SNAPSHOT_FREE_SWAP_PAGES _IO(SNAPSHOT_IOC_MAGIC, 9) | 152 | #define SNAPSHOT_FREE_SWAP_PAGES _IO(SNAPSHOT_IOC_MAGIC, 9) |
157 | #define SNAPSHOT_S2RAM _IO(SNAPSHOT_IOC_MAGIC, 11) | 153 | #define SNAPSHOT_S2RAM _IO(SNAPSHOT_IOC_MAGIC, 11) |
158 | #define SNAPSHOT_SET_SWAP_AREA _IOW(SNAPSHOT_IOC_MAGIC, 13, \ | 154 | #define SNAPSHOT_SET_SWAP_AREA _IOW(SNAPSHOT_IOC_MAGIC, 13, \ |
@@ -160,7 +156,11 @@ struct resume_swap_area { | |||
160 | #define SNAPSHOT_GET_IMAGE_SIZE _IOR(SNAPSHOT_IOC_MAGIC, 14, loff_t) | 156 | #define SNAPSHOT_GET_IMAGE_SIZE _IOR(SNAPSHOT_IOC_MAGIC, 14, loff_t) |
161 | #define SNAPSHOT_PLATFORM_SUPPORT _IO(SNAPSHOT_IOC_MAGIC, 15) | 157 | #define SNAPSHOT_PLATFORM_SUPPORT _IO(SNAPSHOT_IOC_MAGIC, 15) |
162 | #define SNAPSHOT_POWER_OFF _IO(SNAPSHOT_IOC_MAGIC, 16) | 158 | #define SNAPSHOT_POWER_OFF _IO(SNAPSHOT_IOC_MAGIC, 16) |
163 | #define SNAPSHOT_IOC_MAXNR 16 | 159 | #define SNAPSHOT_CREATE_IMAGE _IOW(SNAPSHOT_IOC_MAGIC, 17, int) |
160 | #define SNAPSHOT_PREF_IMAGE_SIZE _IO(SNAPSHOT_IOC_MAGIC, 18) | ||
161 | #define SNAPSHOT_AVAIL_SWAP_SIZE _IOR(SNAPSHOT_IOC_MAGIC, 19, loff_t) | ||
162 | #define SNAPSHOT_ALLOC_SWAP_PAGE _IOR(SNAPSHOT_IOC_MAGIC, 20, loff_t) | ||
163 | #define SNAPSHOT_IOC_MAXNR 20 | ||
164 | 164 | ||
165 | /* If unset, the snapshot device cannot be open. */ | 165 | /* If unset, the snapshot device cannot be open. */ |
166 | extern atomic_t snapshot_device_available; | 166 | extern atomic_t snapshot_device_available; |
diff --git a/kernel/power/user.c b/kernel/power/user.c index 5e866e078550..b902a7e3bd12 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
@@ -40,6 +40,16 @@ | |||
40 | #define PMOPS_ENTER 2 | 40 | #define PMOPS_ENTER 2 |
41 | #define PMOPS_FINISH 3 | 41 | #define PMOPS_FINISH 3 |
42 | 42 | ||
43 | /* | ||
44 | * NOTE: The following ioctl definitions are wrong and have been replaced with | ||
45 | * correct ones. They are only preserved here for compatibility with existing | ||
46 | * userland utilities and will be removed in the future. | ||
47 | */ | ||
48 | #define SNAPSHOT_ATOMIC_SNAPSHOT _IOW(SNAPSHOT_IOC_MAGIC, 3, void *) | ||
49 | #define SNAPSHOT_SET_IMAGE_SIZE _IOW(SNAPSHOT_IOC_MAGIC, 6, unsigned long) | ||
50 | #define SNAPSHOT_AVAIL_SWAP _IOR(SNAPSHOT_IOC_MAGIC, 7, void *) | ||
51 | #define SNAPSHOT_GET_SWAP_PAGE _IOR(SNAPSHOT_IOC_MAGIC, 8, void *) | ||
52 | |||
43 | 53 | ||
44 | #define SNAPSHOT_MINOR 231 | 54 | #define SNAPSHOT_MINOR 231 |
45 | 55 | ||
@@ -191,6 +201,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
191 | data->frozen = 0; | 201 | data->frozen = 0; |
192 | break; | 202 | break; |
193 | 203 | ||
204 | case SNAPSHOT_CREATE_IMAGE: | ||
194 | case SNAPSHOT_ATOMIC_SNAPSHOT: | 205 | case SNAPSHOT_ATOMIC_SNAPSHOT: |
195 | if (data->mode != O_RDONLY || !data->frozen || data->ready) { | 206 | if (data->mode != O_RDONLY || !data->frozen || data->ready) { |
196 | error = -EPERM; | 207 | error = -EPERM; |
@@ -198,7 +209,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
198 | } | 209 | } |
199 | error = hibernation_snapshot(data->platform_support); | 210 | error = hibernation_snapshot(data->platform_support); |
200 | if (!error) | 211 | if (!error) |
201 | error = put_user(in_suspend, (unsigned int __user *)arg); | 212 | error = put_user(in_suspend, (int __user *)arg); |
202 | if (!error) | 213 | if (!error) |
203 | data->ready = 1; | 214 | data->ready = 1; |
204 | break; | 215 | break; |
@@ -219,6 +230,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
219 | data->ready = 0; | 230 | data->ready = 0; |
220 | break; | 231 | break; |
221 | 232 | ||
233 | case SNAPSHOT_PREF_IMAGE_SIZE: | ||
222 | case SNAPSHOT_SET_IMAGE_SIZE: | 234 | case SNAPSHOT_SET_IMAGE_SIZE: |
223 | image_size = arg; | 235 | image_size = arg; |
224 | break; | 236 | break; |
@@ -233,12 +245,14 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
233 | error = put_user(size, (loff_t __user *)arg); | 245 | error = put_user(size, (loff_t __user *)arg); |
234 | break; | 246 | break; |
235 | 247 | ||
248 | case SNAPSHOT_AVAIL_SWAP_SIZE: | ||
236 | case SNAPSHOT_AVAIL_SWAP: | 249 | case SNAPSHOT_AVAIL_SWAP: |
237 | size = count_swap_pages(data->swap, 1); | 250 | size = count_swap_pages(data->swap, 1); |
238 | size <<= PAGE_SHIFT; | 251 | size <<= PAGE_SHIFT; |
239 | error = put_user(size, (loff_t __user *)arg); | 252 | error = put_user(size, (loff_t __user *)arg); |
240 | break; | 253 | break; |
241 | 254 | ||
255 | case SNAPSHOT_ALLOC_SWAP_PAGE: | ||
242 | case SNAPSHOT_GET_SWAP_PAGE: | 256 | case SNAPSHOT_GET_SWAP_PAGE: |
243 | if (data->swap < 0 || data->swap >= MAX_SWAPFILES) { | 257 | if (data->swap < 0 || data->swap >= MAX_SWAPFILES) { |
244 | error = -ENODEV; | 258 | error = -ENODEV; |
@@ -247,7 +261,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
247 | offset = alloc_swapdev_block(data->swap); | 261 | offset = alloc_swapdev_block(data->swap); |
248 | if (offset) { | 262 | if (offset) { |
249 | offset <<= PAGE_SHIFT; | 263 | offset <<= PAGE_SHIFT; |
250 | error = put_user(offset, (sector_t __user *)arg); | 264 | error = put_user(offset, (loff_t __user *)arg); |
251 | } else { | 265 | } else { |
252 | error = -ENOSPC; | 266 | error = -ENOSPC; |
253 | } | 267 | } |