1 // SPDX-License-Identifier: GPL-2.0-only
3 * linux/kernel/power/user.c
5 * This file provides the user space interface for software suspend/resume.
7 * Copyright (C) 2006 Rafael J. Wysocki <rjw@sisk.pl>
10 #include <linux/suspend.h>
11 #include <linux/reboot.h>
12 #include <linux/string.h>
13 #include <linux/device.h>
14 #include <linux/miscdevice.h>
16 #include <linux/swap.h>
17 #include <linux/swapops.h>
20 #include <linux/compat.h>
21 #include <linux/console.h>
22 #include <linux/cpu.h>
23 #include <linux/freezer.h>
25 #include <linux/uaccess.h>
29 static bool need_wait
;
31 static struct snapshot_data
{
32 struct snapshot_handle handle
;
37 bool platform_support
;
42 int is_hibernate_resume_dev(dev_t dev
)
44 return hibernation_available() && snapshot_state
.dev
== dev
;
47 static int snapshot_open(struct inode
*inode
, struct file
*filp
)
49 struct snapshot_data
*data
;
50 unsigned int sleep_flags
;
53 if (!hibernation_available())
56 sleep_flags
= lock_system_sleep();
58 if (!hibernate_acquire()) {
63 if ((filp
->f_flags
& O_ACCMODE
) == O_RDWR
) {
68 nonseekable_open(inode
, filp
);
69 data
= &snapshot_state
;
70 filp
->private_data
= data
;
71 memset(&data
->handle
, 0, sizeof(struct snapshot_handle
));
72 if ((filp
->f_flags
& O_ACCMODE
) == O_RDONLY
) {
73 /* Hibernating. The image device should be accessible. */
74 data
->swap
= swap_type_of(swsusp_resume_device
, 0);
75 data
->mode
= O_RDONLY
;
76 data
->free_bitmaps
= false;
77 error
= pm_notifier_call_chain_robust(PM_HIBERNATION_PREPARE
, PM_POST_HIBERNATION
);
80 * Resuming. We may need to wait for the image device to
86 data
->mode
= O_WRONLY
;
87 error
= pm_notifier_call_chain_robust(PM_RESTORE_PREPARE
, PM_POST_RESTORE
);
89 error
= create_basic_memory_bitmaps();
90 data
->free_bitmaps
= !error
;
98 data
->platform_support
= false;
102 unlock_system_sleep(sleep_flags
);
107 static int snapshot_release(struct inode
*inode
, struct file
*filp
)
109 struct snapshot_data
*data
;
110 unsigned int sleep_flags
;
112 sleep_flags
= lock_system_sleep();
115 data
= filp
->private_data
;
117 free_all_swap_pages(data
->swap
);
119 pm_restore_gfp_mask();
120 free_basic_memory_bitmaps();
122 } else if (data
->free_bitmaps
) {
123 free_basic_memory_bitmaps();
125 pm_notifier_call_chain(data
->mode
== O_RDONLY
?
126 PM_POST_HIBERNATION
: PM_POST_RESTORE
);
129 unlock_system_sleep(sleep_flags
);
134 static ssize_t
snapshot_read(struct file
*filp
, char __user
*buf
,
135 size_t count
, loff_t
*offp
)
137 loff_t pg_offp
= *offp
& ~PAGE_MASK
;
138 struct snapshot_data
*data
;
139 unsigned int sleep_flags
;
142 sleep_flags
= lock_system_sleep();
144 data
= filp
->private_data
;
149 if (!pg_offp
) { /* on page boundary? */
150 res
= snapshot_read_next(&data
->handle
);
154 res
= PAGE_SIZE
- pg_offp
;
157 res
= simple_read_from_buffer(buf
, count
, &pg_offp
,
158 data_of(data
->handle
), res
);
163 unlock_system_sleep(sleep_flags
);
168 static ssize_t
snapshot_write(struct file
*filp
, const char __user
*buf
,
169 size_t count
, loff_t
*offp
)
171 loff_t pg_offp
= *offp
& ~PAGE_MASK
;
172 struct snapshot_data
*data
;
173 unsigned long sleep_flags
;
177 wait_for_device_probe();
181 sleep_flags
= lock_system_sleep();
183 data
= filp
->private_data
;
186 res
= snapshot_write_next(&data
->handle
);
193 if (!data_of(data
->handle
)) {
198 res
= simple_write_to_buffer(data_of(data
->handle
), res
, &pg_offp
,
203 unlock_system_sleep(sleep_flags
);
208 struct compat_resume_swap_area
{
209 compat_loff_t offset
;
213 static int snapshot_set_swap_area(struct snapshot_data
*data
,
219 if (swsusp_swap_in_use())
222 if (in_compat_syscall()) {
223 struct compat_resume_swap_area swap_area
;
225 if (copy_from_user(&swap_area
, argp
, sizeof(swap_area
)))
227 swdev
= new_decode_dev(swap_area
.dev
);
228 offset
= swap_area
.offset
;
230 struct resume_swap_area swap_area
;
232 if (copy_from_user(&swap_area
, argp
, sizeof(swap_area
)))
234 swdev
= new_decode_dev(swap_area
.dev
);
235 offset
= swap_area
.offset
;
239 * User space encodes device types as two-byte values,
240 * so we need to recode them
242 data
->swap
= swap_type_of(swdev
, offset
);
244 return swdev
? -ENODEV
: -EINVAL
;
249 static long snapshot_ioctl(struct file
*filp
, unsigned int cmd
,
253 struct snapshot_data
*data
;
258 wait_for_device_probe();
262 if (_IOC_TYPE(cmd
) != SNAPSHOT_IOC_MAGIC
)
264 if (_IOC_NR(cmd
) > SNAPSHOT_IOC_MAXNR
)
266 if (!capable(CAP_SYS_ADMIN
))
269 if (!mutex_trylock(&system_transition_mutex
))
272 lock_device_hotplug();
273 data
= filp
->private_data
;
277 case SNAPSHOT_FREEZE
:
283 error
= freeze_processes();
287 error
= create_basic_memory_bitmaps();
295 case SNAPSHOT_UNFREEZE
:
296 if (!data
->frozen
|| data
->ready
)
298 pm_restore_gfp_mask();
299 free_basic_memory_bitmaps();
300 data
->free_bitmaps
= false;
302 data
->frozen
= false;
305 case SNAPSHOT_CREATE_IMAGE
:
306 if (data
->mode
!= O_RDONLY
|| !data
->frozen
|| data
->ready
) {
310 pm_restore_gfp_mask();
311 error
= hibernation_snapshot(data
->platform_support
);
313 error
= put_user(in_suspend
, (int __user
*)arg
);
314 data
->ready
= !freezer_test_done
&& !error
;
315 freezer_test_done
= false;
319 case SNAPSHOT_ATOMIC_RESTORE
:
320 error
= snapshot_write_finalize(&data
->handle
);
323 if (data
->mode
!= O_WRONLY
|| !data
->frozen
||
324 !snapshot_image_loaded(&data
->handle
)) {
328 error
= hibernation_restore(data
->platform_support
);
333 memset(&data
->handle
, 0, sizeof(struct snapshot_handle
));
336 * It is necessary to thaw kernel threads here, because
337 * SNAPSHOT_CREATE_IMAGE may be invoked directly after
338 * SNAPSHOT_FREE. In that case, if kernel threads were not
339 * thawed, the preallocation of memory carried out by
340 * hibernation_snapshot() might run into problems (i.e. it
341 * might fail or even deadlock).
343 thaw_kernel_threads();
346 case SNAPSHOT_PREF_IMAGE_SIZE
:
350 case SNAPSHOT_GET_IMAGE_SIZE
:
355 size
= snapshot_get_image_size();
357 error
= put_user(size
, (loff_t __user
*)arg
);
360 case SNAPSHOT_AVAIL_SWAP_SIZE
:
361 size
= count_swap_pages(data
->swap
, 1);
363 error
= put_user(size
, (loff_t __user
*)arg
);
366 case SNAPSHOT_ALLOC_SWAP_PAGE
:
367 if (data
->swap
< 0 || data
->swap
>= MAX_SWAPFILES
) {
371 offset
= alloc_swapdev_block(data
->swap
);
373 offset
<<= PAGE_SHIFT
;
374 error
= put_user(offset
, (loff_t __user
*)arg
);
380 case SNAPSHOT_FREE_SWAP_PAGES
:
381 if (data
->swap
< 0 || data
->swap
>= MAX_SWAPFILES
) {
385 free_all_swap_pages(data
->swap
);
394 * Tasks are frozen and the notifiers have been called with
395 * PM_HIBERNATION_PREPARE
397 error
= suspend_devices_and_enter(PM_SUSPEND_MEM
);
401 case SNAPSHOT_PLATFORM_SUPPORT
:
402 data
->platform_support
= !!arg
;
405 case SNAPSHOT_POWER_OFF
:
406 if (data
->platform_support
)
407 error
= hibernation_platform_enter();
410 case SNAPSHOT_SET_SWAP_AREA
:
411 error
= snapshot_set_swap_area(data
, (void __user
*)arg
);
419 unlock_device_hotplug();
420 mutex_unlock(&system_transition_mutex
);
427 snapshot_compat_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
429 BUILD_BUG_ON(sizeof(loff_t
) != sizeof(compat_loff_t
));
432 case SNAPSHOT_GET_IMAGE_SIZE
:
433 case SNAPSHOT_AVAIL_SWAP_SIZE
:
434 case SNAPSHOT_ALLOC_SWAP_PAGE
:
435 case SNAPSHOT_CREATE_IMAGE
:
436 case SNAPSHOT_SET_SWAP_AREA
:
437 return snapshot_ioctl(file
, cmd
,
438 (unsigned long) compat_ptr(arg
));
440 return snapshot_ioctl(file
, cmd
, arg
);
443 #endif /* CONFIG_COMPAT */
445 static const struct file_operations snapshot_fops
= {
446 .open
= snapshot_open
,
447 .release
= snapshot_release
,
448 .read
= snapshot_read
,
449 .write
= snapshot_write
,
450 .unlocked_ioctl
= snapshot_ioctl
,
452 .compat_ioctl
= snapshot_compat_ioctl
,
456 static struct miscdevice snapshot_device
= {
457 .minor
= SNAPSHOT_MINOR
,
459 .fops
= &snapshot_fops
,
462 static int __init
snapshot_device_init(void)
464 return misc_register(&snapshot_device
);
467 device_initcall(snapshot_device_init
);