]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PM: hibernate: add sysfs interface for hibernate_compression_threads
authorXueqin Luo <luoxueqin@kylinos.cn>
Tue, 21 Oct 2025 11:37:28 +0000 (19:37 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 30 Oct 2025 19:07:00 +0000 (20:07 +0100)
Add a sysfs attribute `/sys/power/hibernate_compression_threads` to
allow runtime configuration of the number of threads used for
compressing and decompressing hibernation images.

The new sysfs interface enables dynamic adjustment at runtime:

    # cat /sys/power/hibernate_compression_threads
    3
    # echo 4 > /sys/power/hibernate_compression_threads

This change provides greater flexibility for debugging and performance
tuning of hibernation without requiring a reboot.

Signed-off-by: Xueqin Luo <luoxueqin@kylinos.cn>
Link: https://patch.msgid.link/c68c62f97fabf32507b8794ad8c16cd22ee656ac.1761046167.git.luoxueqin@kylinos.cn
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/ABI/testing/sysfs-power
kernel/power/swap.c

index 4d8e1ad020f05b16bb7ba72f97c73c47e2485642..d38da077905a9d3c7c7025d32664158f63b15035 100644 (file)
@@ -454,3 +454,19 @@ Description:
                disables it.  Reads from the file return the current value.
                The default is "1" if the build-time "SUSPEND_SKIP_SYNC" config
                flag is unset, or "0" otherwise.
+
+What:           /sys/power/hibernate_compression_threads
+Date:           October 2025
+Contact:        <luoxueqin@kylinos.cn>
+Description:
+                Controls the number of threads used for compression
+                and decompression of hibernation images.
+
+                The value can be adjusted at runtime to balance
+                performance and CPU utilization.
+
+                The change takes effect on the next hibernation or
+                resume operation.
+
+                Minimum value: 1
+                Default value: 3
index aa11576e92a97442f1c353835f73f355c9d156e6..d173e276b494ee5dc05f2cb3c7d475dc54f60bb2 100644 (file)
@@ -1689,8 +1689,46 @@ int swsusp_unmark(void)
 }
 #endif
 
+static ssize_t hibernate_compression_threads_show(struct kobject *kobj,
+                               struct kobj_attribute *attr, char *buf)
+{
+       return sysfs_emit(buf, "%d\n", hibernate_compression_threads);
+}
+
+static ssize_t hibernate_compression_threads_store(struct kobject *kobj,
+                               struct kobj_attribute *attr,
+                               const char *buf, size_t n)
+{
+       unsigned long val;
+
+       if (kstrtoul(buf, 0, &val))
+               return -EINVAL;
+
+       if (val < 1)
+               return -EINVAL;
+
+       hibernate_compression_threads = val;
+       return n;
+}
+power_attr(hibernate_compression_threads);
+
+static struct attribute *g[] = {
+       &hibernate_compression_threads_attr.attr,
+       NULL,
+};
+
+static const struct attribute_group attr_group = {
+       .attrs = g,
+};
+
 static int __init swsusp_header_init(void)
 {
+       int error;
+
+       error = sysfs_create_group(power_kobj, &attr_group);
+       if (error)
+               return -ENOMEM;
+
        swsusp_header = (struct swsusp_header*) __get_free_page(GFP_KERNEL);
        if (!swsusp_header)
                panic("Could not allocate memory for swsusp_header\n");