PM / hibernate: Make passing hibernate offsets more friendly
Currently the only way to specify a hibernate offset for a swap file is on the kernel command line. Add a new /sys/power/resume_offset that lets userspace specify the offset and disk to use when initiating a hibernate cycle. Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
dbdd0f58fd
commit
355064675f
|
@ -287,3 +287,17 @@ Description:
|
||||||
Writing a "1" to this file enables the debug messages and
|
Writing a "1" to this file enables the debug messages and
|
||||||
writing a "0" (default) to it disables them. Reads from
|
writing a "0" (default) to it disables them. Reads from
|
||||||
this file return the current value.
|
this file return the current value.
|
||||||
|
|
||||||
|
What: /sys/power/resume_offset
|
||||||
|
Date: April 2018
|
||||||
|
Contact: Mario Limonciello <mario.limonciello@dell.com>
|
||||||
|
Description:
|
||||||
|
This file is used for telling the kernel an offset into a disk
|
||||||
|
to use when hibernating the system such as with a swap file.
|
||||||
|
|
||||||
|
Reads from this file will display the current offset
|
||||||
|
the kernel will be using on the next hibernation
|
||||||
|
attempt.
|
||||||
|
|
||||||
|
Using this sysfs file will override any values that were
|
||||||
|
set using the kernel command line for disk offset.
|
|
@ -24,8 +24,16 @@ Some warnings, first.
|
||||||
* see the FAQ below for details. (This is not true for more traditional
|
* see the FAQ below for details. (This is not true for more traditional
|
||||||
* power states like "standby", which normally don't turn USB off.)
|
* power states like "standby", which normally don't turn USB off.)
|
||||||
|
|
||||||
|
Swap partition:
|
||||||
You need to append resume=/dev/your_swap_partition to kernel command
|
You need to append resume=/dev/your_swap_partition to kernel command
|
||||||
line. Then you suspend by
|
line or specify it using /sys/power/resume.
|
||||||
|
|
||||||
|
Swap file:
|
||||||
|
If using a swapfile you can also specify a resume offset using
|
||||||
|
resume_offset=<number> on the kernel command line or specify it
|
||||||
|
in /sys/power/resume_offset.
|
||||||
|
|
||||||
|
After preparing then you suspend by
|
||||||
|
|
||||||
echo shutdown > /sys/power/disk; echo disk > /sys/power/state
|
echo shutdown > /sys/power/disk; echo disk > /sys/power/state
|
||||||
|
|
||||||
|
|
|
@ -1061,6 +1061,29 @@ static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,
|
||||||
|
|
||||||
power_attr(resume);
|
power_attr(resume);
|
||||||
|
|
||||||
|
static ssize_t resume_offset_show(struct kobject *kobj,
|
||||||
|
struct kobj_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
return sprintf(buf, "%llu\n", (unsigned long long)swsusp_resume_block);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t resume_offset_store(struct kobject *kobj,
|
||||||
|
struct kobj_attribute *attr, const char *buf,
|
||||||
|
size_t n)
|
||||||
|
{
|
||||||
|
unsigned long long offset;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = kstrtoull(buf, 0, &offset);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
swsusp_resume_block = offset;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
power_attr(resume_offset);
|
||||||
|
|
||||||
static ssize_t image_size_show(struct kobject *kobj, struct kobj_attribute *attr,
|
static ssize_t image_size_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
|
@ -1106,6 +1129,7 @@ power_attr(reserved_size);
|
||||||
|
|
||||||
static struct attribute * g[] = {
|
static struct attribute * g[] = {
|
||||||
&disk_attr.attr,
|
&disk_attr.attr,
|
||||||
|
&resume_offset_attr.attr,
|
||||||
&resume_attr.attr,
|
&resume_attr.attr,
|
||||||
&image_size_attr.attr,
|
&image_size_attr.attr,
|
||||||
&reserved_size_attr.attr,
|
&reserved_size_attr.attr,
|
||||||
|
|
Loading…
Reference in New Issue