Commit 35506467 authored by Mario Limonciello's avatar Mario Limonciello Committed by Rafael J. Wysocki

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: default avatarMario Limonciello <mario.limonciello@dell.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent dbdd0f58
...@@ -287,3 +287,17 @@ Description: ...@@ -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.
\ No newline at end of file
...@@ -24,8 +24,16 @@ Some warnings, first. ...@@ -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, ...@@ -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); ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment