Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f8581ef authored by Mario Limonciello's avatar Mario Limonciello Committed by Yimin Peng
Browse files

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.

Change-Id: Ied0be8062e6677e44acbfcb8cbf235e6bb8cf2ef
Signed-off-by: default avatarMario Limonciello <mario.limonciello@dell.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Git-commit: 35506467
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


Signed-off-by: default avatarYimin Peng <yiminp@codeaurora.org>
parent 39641649
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -24,8 +24,16 @@ Some warnings, first.
 * see the FAQ below for details.  (This is not true for more traditional
 * 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
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

+24 −0
Original line number Diff line number Diff line
@@ -1076,6 +1076,29 @@ static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,

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,
			       char *buf)
{
@@ -1121,6 +1144,7 @@ power_attr(reserved_size);

static struct attribute * g[] = {
	&disk_attr.attr,
	&resume_offset_attr.attr,
	&resume_attr.attr,
	&image_size_attr.attr,
	&reserved_size_attr.attr,