[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAJZ5v0gD8RkKG8+6MneaDkxndS-oAm8a1AswEDP1w8HVCGZDdw@mail.gmail.com>
Date: Tue, 26 Aug 2025 13:43:13 +0200
From: "Rafael J. Wysocki" <rafael@...nel.org>
To: Xueqin Luo <luoxueqin@...inos.cn>
Cc: rafael@...nel.org, pavel@...nel.org, lenb@...nel.org,
linux-pm@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] PM: hibernate: make compression threads configurable via
kernel parameter
On Tue, Aug 26, 2025 at 11:19 AM Xueqin Luo <luoxueqin@...inos.cn> wrote:
>
> A new kernel parameter 'cmp_threads=' is introduced to
> allow tuning the number of compression/decompression threads at boot.
And why is it useful/needed?
> Signed-off-by: Xueqin Luo <luoxueqin@...inos.cn>
> ---
> kernel/power/swap.c | 22 +++++++++++++++++-----
> 1 file changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/power/swap.c b/kernel/power/swap.c
> index ad13c461b657..43280e08a4ad 100644
> --- a/kernel/power/swap.c
> +++ b/kernel/power/swap.c
> @@ -520,7 +520,8 @@ static int swap_writer_finish(struct swap_map_handle *handle,
> #define CMP_SIZE (CMP_PAGES * PAGE_SIZE)
>
> /* Maximum number of threads for compression/decompression. */
> -#define CMP_THREADS 3
> +#define CMP_MAX_THREADS 12
> +static int cmp_threads = 3
>
> /* Minimum/maximum number of pages for read buffering. */
> #define CMP_MIN_RD_PAGES 1024
> @@ -585,8 +586,8 @@ struct crc_data {
> wait_queue_head_t go; /* start crc update */
> wait_queue_head_t done; /* crc update done */
> u32 *crc32; /* points to handle's crc32 */
> - size_t *unc_len[CMP_THREADS]; /* uncompressed lengths */
> - unsigned char *unc[CMP_THREADS]; /* uncompressed data */
> + size_t *unc_len[CMP_MAX_THREADS]; /* uncompressed lengths */
> + unsigned char *unc[CMP_MAX_THREADS]; /* uncompressed data */
> };
>
> /*
> @@ -703,7 +704,7 @@ static int save_compressed_image(struct swap_map_handle *handle,
> * footprint.
> */
> nr_threads = num_online_cpus() - 1;
> - nr_threads = clamp_val(nr_threads, 1, CMP_THREADS);
> + nr_threads = clamp_val(nr_threads, 1, cmp_threads);
>
> page = (void *)__get_free_page(GFP_NOIO | __GFP_HIGH);
> if (!page) {
> @@ -1223,7 +1224,7 @@ static int load_compressed_image(struct swap_map_handle *handle,
> * footprint.
> */
> nr_threads = num_online_cpus() - 1;
> - nr_threads = clamp_val(nr_threads, 1, CMP_THREADS);
> + nr_threads = clamp_val(nr_threads, 1, cmp_threads);
>
> page = vmalloc(array_size(CMP_MAX_RD_PAGES, sizeof(*page)));
> if (!page) {
> @@ -1667,3 +1668,14 @@ static int __init swsusp_header_init(void)
> }
>
> core_initcall(swsusp_header_init);
> +
> +static int __init cmp_threads_setup(char *str)
> +{
> + int rc = kstrtouint(str, 0, &cmp_threads);
> + if (rc)
> + return rc;
> + return 1;
> +
> +}
> +
> +__setup("cmp_threads=", cmp_threads_setup);
> --
> 2.43.0
>
Powered by blists - more mailing lists