Skip to content

Commit 090bf5a

Browse files
Xueqin Luorafaeljw
authored andcommitted
PM: hibernate: make compression threads configurable
The number of compression/decompression threads has a direct impact on hibernate image generation and resume latency. Using more threads can reduce overall resume time, but on systems with fewer CPU cores it may also introduce contention and reduce efficiency. Performance was evaluated on an 8-core ARM system, averaged over 10 runs: Threads Hibernate(s) Resume(s) -------------------------------- 3 12.14 18.86 4 12.28 17.48 5 11.09 16.77 6 11.08 16.44 With 5–6 threads, resume latency improves by approximately 12% compared to the default 3-thread configuration, with negligible impact on hibernate time. Introduce a new kernel parameter `hibernate_compression_threads=` that allows users and integrators to tune the number of compression/decompression threads at boot. This provides a way to balance performance and CPU utilization across a wide range of hardware without recompiling the kernel. Signed-off-by: Xueqin Luo <luoxueqin@kylinos.cn> Link: https://patch.msgid.link/f24b3ca6416e230a515a154ed4c121d72a7e05a6.1761046167.git.luoxueqin@kylinos.cn Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent e114e2e commit 090bf5a

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,16 @@
19071907
/sys/power/pm_test). Only available when CONFIG_PM_DEBUG
19081908
is set. Default value is 5.
19091909

1910+
hibernate_compression_threads=
1911+
[HIBERNATION]
1912+
Set the number of threads used for compressing or decompressing
1913+
hibernation images.
1914+
1915+
Format: <integer>
1916+
Default: 3
1917+
Minimum: 1
1918+
Example: hibernate_compression_threads=4
1919+
19101920
highmem=nn[KMG] [KNL,BOOT,EARLY] forces the highmem zone to have an exact
19111921
size of <nn>. This works even on boxes that have no
19121922
highmem otherwise. This also works to reduce highmem

kernel/power/swap.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,9 @@ static int swap_writer_finish(struct swap_map_handle *handle,
519519
CMP_HEADER, PAGE_SIZE)
520520
#define CMP_SIZE (CMP_PAGES * PAGE_SIZE)
521521

522-
/* Maximum number of threads for compression/decompression. */
523-
#define CMP_THREADS 3
522+
/* Default number of threads for compression/decompression. */
523+
#define CMP_THREADS 3
524+
static unsigned int hibernate_compression_threads = CMP_THREADS;
524525

525526
/* Minimum/maximum number of pages for read buffering. */
526527
#define CMP_MIN_RD_PAGES 1024
@@ -741,7 +742,7 @@ static int save_compressed_image(struct swap_map_handle *handle,
741742
* footprint.
742743
*/
743744
nr_threads = num_online_cpus() - 1;
744-
nr_threads = clamp_val(nr_threads, 1, CMP_THREADS);
745+
nr_threads = clamp_val(nr_threads, 1, hibernate_compression_threads);
745746

746747
page = (void *)__get_free_page(GFP_NOIO | __GFP_HIGH);
747748
if (!page) {
@@ -1257,7 +1258,7 @@ static int load_compressed_image(struct swap_map_handle *handle,
12571258
* footprint.
12581259
*/
12591260
nr_threads = num_online_cpus() - 1;
1260-
nr_threads = clamp_val(nr_threads, 1, CMP_THREADS);
1261+
nr_threads = clamp_val(nr_threads, 1, hibernate_compression_threads);
12611262

12621263
page = vmalloc_array(CMP_MAX_RD_PAGES, sizeof(*page));
12631264
if (!page) {
@@ -1697,3 +1698,19 @@ static int __init swsusp_header_init(void)
16971698
}
16981699

16991700
core_initcall(swsusp_header_init);
1701+
1702+
static int __init hibernate_compression_threads_setup(char *str)
1703+
{
1704+
int rc = kstrtouint(str, 0, &hibernate_compression_threads);
1705+
1706+
if (rc)
1707+
return rc;
1708+
1709+
if (hibernate_compression_threads < 1)
1710+
hibernate_compression_threads = CMP_THREADS;
1711+
1712+
return 1;
1713+
1714+
}
1715+
1716+
__setup("hibernate_compression_threads=", hibernate_compression_threads_setup);

0 commit comments

Comments
 (0)