From nobody Wed Dec 17 08:57:15 2025 Received: from mail-ot1-f50.google.com (mail-ot1-f50.google.com [209.85.210.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E3D5217D377 for ; Mon, 2 Sep 2024 10:57:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274627; cv=none; b=avibU6mzdyH7JNkg9b2RxKB0ZetC5mAFtnc+yF3zKC89n6J8yGIgBdAXv5J/Vo7saVdFREw/Ch620Fswi4zpcsBmaRoCB+AQv1NMNuRPGxglsnSY1dA0x5XZXkavNSwJL8KJZjjwmzN4y60HJzIC20s/1B8hriN6I08CnrZeeC0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274627; c=relaxed/simple; bh=UCuTJ3W17tR/k2lLF8j9d7zfbWvaVpdYHMwh5vQm3i8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EjFOmCfmmj62ZhO5xvK7mmnp95WERWFxtjt7RKX6tyKMYDGcXGWcb6h7UPHssZ1ag+n6hvDne9TF27Lg8rnn7M7IHqytIP3kJA32InpabUktomJD389hQC7b2mr4dP4oDkztW4TCx9NejYswa0lLngk+fpHc71DTcj4ICyQjcpg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=mQQ2Oi4N; arc=none smtp.client-ip=209.85.210.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="mQQ2Oi4N" Received: by mail-ot1-f50.google.com with SMTP id 46e09a7af769-70df4b5cdd8so2773257a34.1 for ; Mon, 02 Sep 2024 03:57:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274625; x=1725879425; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0ykiW8sIgPGAodK0jOXG/pemUjls0DsoyZf7zUnL9ME=; b=mQQ2Oi4NQheEZQm3UjQSt0Bw1kAwkIucLOP62LY74TnZUji7tsYVBiQobQEWAn3j/n HDbaIDHBK9ODekvPZJoSbKYp6T567ABEUvehF+iZoYXwsXGhcO1evcZxXKfEHxKOrb6R YQ0Xd/fkkNVmqw/JZyXDMB/Fy0tQfsUxEuAu4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274625; x=1725879425; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0ykiW8sIgPGAodK0jOXG/pemUjls0DsoyZf7zUnL9ME=; b=pFmB77Xlkp+Su1uDIX4q9u5ONBRQDkAbEEq9ClQ7bpPK/bebBuyU5Na9YhrB0BAtje B79AvyBY8zVQxCtaaOtGH3uBAZEnyoqhfVxjK+RPVffYT3Uq6OrJEXcHrudADAvFRsDm clBfOv90a2fuT6isUrB6Cu0E/8rK/vRyvIqSZAH92PzOB99ozIPe7vo9CulezMrzeud/ p7r2YBLvgMI9PRJcpE0/rfE/LY5km+okdWy5v8aaj7itG9JWDDBg1Puer7+Ya9a42TGl 0+7qrSpRM2TgNJJoLL4iIkVZaahQr4Lac3ldvQ+xranHTVcz4fMIHQgqQDva0DLxME+W CtWw== X-Forwarded-Encrypted: i=1; AJvYcCWdGitLiWAL54BA/pJZG7a8jmgW+sJA1P/+rRrT7CLQiy2xDs5ixxMMLxLRLVRuJg63wPzCDP0kc29z6K4=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0FnGmYItx0Sv21D8zHv/eadT+gzGsQlh6OXvJMOhiSQN2Fk7p CQEiXdYzuZ4vNumLMN/3q+eCGdUaJpNosI0nMhLMRhnfUkPQYoGkfzgq5xixvQ== X-Google-Smtp-Source: AGHT+IE/J4VzixubEq8s/Rq3uM/XwlQu9bFMvNf0OIsQiDyVGPGUz32ZC/Pp0WMhmYaM6AfVJRrAxQ== X-Received: by 2002:a05:6358:5918:b0:1ac:f144:2b16 with SMTP id e5c5f4694b2df-1b7ef7089d9mr911882755d.26.1725274624772; Mon, 02 Sep 2024 03:57:04 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:04 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv7 01/24] lib: zstd: export API needed for dictionary support Date: Mon, 2 Sep 2024 19:55:49 +0900 Message-ID: <20240902105656.1383858-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We need to export a number of API functions that enable advanced zstd usage - C/D dictionaries, dictionaries sharing between contexts, etc. Cc: Nick Terrell Signed-off-by: Sergey Senozhatsky --- include/linux/zstd.h | 167 ++++++++++++++++++++++++++++++ lib/zstd/zstd_compress_module.c | 49 +++++++++ lib/zstd/zstd_decompress_module.c | 36 +++++++ 3 files changed, 252 insertions(+) diff --git a/include/linux/zstd.h b/include/linux/zstd.h index f109d49f43f8..ac59ae9a18d7 100644 --- a/include/linux/zstd.h +++ b/include/linux/zstd.h @@ -77,6 +77,30 @@ int zstd_min_clevel(void); */ int zstd_max_clevel(void); =20 +/** + * zstd_default_clevel() - default compression level + * + * Return: Default compression level. + */ +int zstd_default_clevel(void); + +/** + * struct zstd_custom_mem - custom memory allocation + */ +typedef ZSTD_customMem zstd_custom_mem; + +/** + * struct zstd_dict_load_method - Dictionary load method. + * See zstd_lib.h. + */ +typedef ZSTD_dictLoadMethod_e zstd_dict_load_method; + +/** + * struct zstd_dict_content_type - Dictionary context type. + * See zstd_lib.h. + */ +typedef ZSTD_dictContentType_e zstd_dict_content_type; + /* =3D=3D=3D=3D=3D=3D Parameter Selection =3D=3D=3D=3D=3D=3D */ =20 /** @@ -136,6 +160,19 @@ typedef ZSTD_parameters zstd_parameters; zstd_parameters zstd_get_params(int level, unsigned long long estimated_src_size); =20 + +/** + * zstd_get_cparams() - returns zstd_compression_parameters for selected l= evel + * @level: The compression level + * @estimated_src_size: The estimated source size to compress or 0 + * if unknown. + * @dict_size: Dictionary size. + * + * Return: The selected zstd_compression_parameters. + */ +zstd_compression_parameters zstd_get_cparams(int level, + unsigned long long estimated_src_size, size_t dict_size); + /* =3D=3D=3D=3D=3D=3D Single-pass Compression =3D=3D=3D=3D=3D=3D */ =20 typedef ZSTD_CCtx zstd_cctx; @@ -180,6 +217,71 @@ zstd_cctx *zstd_init_cctx(void *workspace, size_t work= space_size); size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity, const void *src, size_t src_size, const zstd_parameters *parameters); =20 +/** + * zstd_create_cctx_advanced() - Create compression context + * @custom_mem: Custom allocator. + * + * Return: NULL on error, pointer to compression context otherwise. + */ +zstd_cctx *zstd_create_cctx_advanced(zstd_custom_mem custom_mem); + +/** + * zstd_free_cctx() - Free compression context + * @cdict: Pointer to compression context. + * + * Return: Always 0. + */ +size_t zstd_free_cctx(zstd_cctx* cctx); + +/** + * struct zstd_cdict - Compression dictionary. + * See zstd_lib.h. + */ +typedef ZSTD_CDict zstd_cdict; + +/** + * zstd_create_cdict_byreference() - Create compression dictionary + * @dict: Pointer to dictionary buffer. + * @dict_size: Size of the dictionary buffer. + * @dict_load_method: Dictionary load method. + * @dict_content_type: Dictionary content type. + * @custom_mem: Memory allocator. + * + * Note, this uses @dict by reference (ZSTD_dlm_byRef), so it should be + * free before zstd_cdict is destroyed. + * + * Return: NULL on error, pointer to compression dictionary + * otherwise. + */ +zstd_cdict *zstd_create_cdict_byreference(const void *dict, size_t dict_si= ze, + zstd_compression_parameters cparams, + zstd_custom_mem custom_mem); + +/** + * zstd_free_cdict() - Free compression dictionary + * @cdict: Pointer to compression dictionary. + * + * Return: Always 0. + */ +size_t zstd_free_cdict(zstd_cdict* cdict); + +/** + * zstd_compress_using_cdict() - compress src into dst using a dictionary + * @cctx: The context. Must have been initialized with zstd_init_c= ctx(). + * @dst: The buffer to compress src into. + * @dst_capacity: The size of the destination buffer. May be any size, but + * ZSTD_compressBound(srcSize) is guaranteed to be large en= ough. + * @src: The data to compress. + * @src_size: The size of the data to compress. + * @cdict: The dictionary to be used. + * + * Return: The compressed size or an error, which can be checked us= ing + * zstd_is_error(). + */ +size_t zstd_compress_using_cdict(zstd_cctx *cctx, void *dst, + size_t dst_capacity, const void *src, size_t src_size, + const zstd_cdict *cdict); + /* =3D=3D=3D=3D=3D=3D Single-pass Decompression =3D=3D=3D=3D=3D=3D */ =20 typedef ZSTD_DCtx zstd_dctx; @@ -220,6 +322,71 @@ zstd_dctx *zstd_init_dctx(void *workspace, size_t work= space_size); size_t zstd_decompress_dctx(zstd_dctx *dctx, void *dst, size_t dst_capacit= y, const void *src, size_t src_size); =20 +/** + * struct zstd_ddict - Decompression dictionary. + * See zstd_lib.h. + */ +typedef ZSTD_DDict zstd_ddict; + +/** + * zstd_create_ddict_byreference() - Create decompression dictionary + * @dict: Pointer to dictionary buffer. + * @dict_size: Size of the dictionary buffer. + * @dict_load_method: Dictionary load method. + * @dict_content_type: Dictionary content type. + * @custom_mem: Memory allocator. + * + * Note, this uses @dict by reference (ZSTD_dlm_byRef), so it should be + * free before zstd_ddict is destroyed. + * + * Return: NULL on error, pointer to decompression dictionary + * otherwise. + */ +zstd_ddict *zstd_create_ddict_byreference(const void *dict, size_t dict_si= ze, + zstd_custom_mem custom_mem); +/** + * zstd_free_ddict() - Free decompression dictionary + * @dict: Pointer to the dictionary. + * + * Return: Always 0. + */ +size_t zstd_free_ddict(zstd_ddict *ddict); + +/** + * zstd_create_dctx_advanced() - Create decompression context + * @custom_mem: Custom allocator. + * + * Return: NULL on error, pointer to decompression context otherwis= e. + */ +zstd_dctx *zstd_create_dctx_advanced(zstd_custom_mem custom_mem); + +/** + * zstd_free_dctx() -- Free decompression context + * @dctx: Pointer to decompression context. + * Return: Always 0. + */ +size_t zstd_free_dctx(zstd_dctx *dctx); + +/** + * zstd_decompress_using_ddict() - decompress src into dst using a diction= ary + * @dctx: The decompression context. + * @dst: The buffer to decompress src into. + * @dst_capacity: The size of the destination buffer. Must be at least as = large + * as the decompressed size. If the caller cannot upper bou= nd the + * decompressed size, then it's better to use the streaming= API. + * @src: The zstd compressed data to decompress. Multiple concate= nated + * frames and skippable frames are allowed. + * @src_size: The exact size of the data to decompress. + * @ddict: The dictionary to be used. + * + * Return: The decompressed size or an error, which can be checked = using + * zstd_is_error(). + */ +size_t zstd_decompress_using_ddict(zstd_dctx *dctx, + void *dst, size_t dst_capacity, const void *src, size_t src_size, + const zstd_ddict *ddict); + + /* =3D=3D=3D=3D=3D=3D Streaming Buffers =3D=3D=3D=3D=3D=3D */ =20 /** diff --git a/lib/zstd/zstd_compress_module.c b/lib/zstd/zstd_compress_modul= e.c index 8ecf43226af2..ceaf352d03e2 100644 --- a/lib/zstd/zstd_compress_module.c +++ b/lib/zstd/zstd_compress_module.c @@ -66,6 +66,12 @@ int zstd_max_clevel(void) } EXPORT_SYMBOL(zstd_max_clevel); =20 +int zstd_default_clevel(void) +{ + return ZSTD_defaultCLevel(); +} +EXPORT_SYMBOL(zstd_default_clevel); + size_t zstd_compress_bound(size_t src_size) { return ZSTD_compressBound(src_size); @@ -79,6 +85,13 @@ zstd_parameters zstd_get_params(int level, } EXPORT_SYMBOL(zstd_get_params); =20 +zstd_compression_parameters zstd_get_cparams(int level, + unsigned long long estimated_src_size, size_t dict_size) +{ + return ZSTD_getCParams(level, estimated_src_size, dict_size); +} +EXPORT_SYMBOL(zstd_get_cparams); + size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparam= s) { return ZSTD_estimateCCtxSize_usingCParams(*cparams); @@ -93,6 +106,33 @@ zstd_cctx *zstd_init_cctx(void *workspace, size_t works= pace_size) } EXPORT_SYMBOL(zstd_init_cctx); =20 +zstd_cctx *zstd_create_cctx_advanced(zstd_custom_mem custom_mem) +{ + return ZSTD_createCCtx_advanced(custom_mem); +} +EXPORT_SYMBOL(zstd_create_cctx_advanced); + +size_t zstd_free_cctx(zstd_cctx *cctx) +{ + return ZSTD_freeCCtx(cctx); +} +EXPORT_SYMBOL(zstd_free_cctx); + +zstd_cdict *zstd_create_cdict_byreference(const void *dict, size_t dict_si= ze, + zstd_compression_parameters cparams, + zstd_custom_mem custom_mem) +{ + return ZSTD_createCDict_advanced(dict, dict_size, ZSTD_dlm_byRef, + ZSTD_dct_auto, cparams, custom_mem); +} +EXPORT_SYMBOL(zstd_create_cdict_byreference); + +size_t zstd_free_cdict(zstd_cdict *cdict) +{ + return ZSTD_freeCDict(cdict); +} +EXPORT_SYMBOL(zstd_free_cdict); + size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity, const void *src, size_t src_size, const zstd_parameters *parameters) { @@ -101,6 +141,15 @@ size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, = size_t dst_capacity, } EXPORT_SYMBOL(zstd_compress_cctx); =20 +size_t zstd_compress_using_cdict(zstd_cctx *cctx, void *dst, + size_t dst_capacity, const void *src, size_t src_size, + const ZSTD_CDict *cdict) +{ + return ZSTD_compress_usingCDict(cctx, dst, dst_capacity, + src, src_size, cdict); +} +EXPORT_SYMBOL(zstd_compress_using_cdict); + size_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cpa= rams) { return ZSTD_estimateCStreamSize_usingCParams(*cparams); diff --git a/lib/zstd/zstd_decompress_module.c b/lib/zstd/zstd_decompress_m= odule.c index 7d31518e9d5a..0ae819f0c927 100644 --- a/lib/zstd/zstd_decompress_module.c +++ b/lib/zstd/zstd_decompress_module.c @@ -44,6 +44,33 @@ size_t zstd_dctx_workspace_bound(void) } EXPORT_SYMBOL(zstd_dctx_workspace_bound); =20 +zstd_dctx *zstd_create_dctx_advanced(zstd_custom_mem custom_mem) +{ + return ZSTD_createDCtx_advanced(custom_mem); +} +EXPORT_SYMBOL(zstd_create_dctx_advanced); + +size_t zstd_free_dctx(zstd_dctx *dctx) +{ + return ZSTD_freeDCtx(dctx); +} +EXPORT_SYMBOL(zstd_free_dctx); + +zstd_ddict *zstd_create_ddict_byreference(const void *dict, size_t dict_si= ze, + zstd_custom_mem custom_mem) +{ + return ZSTD_createDDict_advanced(dict, dict_size, ZSTD_dlm_byRef, + ZSTD_dct_auto, custom_mem); + +} +EXPORT_SYMBOL(zstd_create_ddict_byreference); + +size_t zstd_free_ddict(zstd_ddict *ddict) +{ + return ZSTD_freeDDict(ddict); +} +EXPORT_SYMBOL(zstd_free_ddict); + zstd_dctx *zstd_init_dctx(void *workspace, size_t workspace_size) { if (workspace =3D=3D NULL) @@ -59,6 +86,15 @@ size_t zstd_decompress_dctx(zstd_dctx *dctx, void *dst, = size_t dst_capacity, } EXPORT_SYMBOL(zstd_decompress_dctx); =20 +size_t zstd_decompress_using_ddict(zstd_dctx *dctx, + void *dst, size_t dst_capacity, const void* src, size_t src_size, + const zstd_ddict* ddict) +{ + return ZSTD_decompress_usingDDict(dctx, dst, dst_capacity, src, + src_size, ddict); +} +EXPORT_SYMBOL(zstd_decompress_using_ddict); + size_t zstd_dstream_workspace_bound(size_t max_window_size) { return ZSTD_estimateDStreamSize(max_window_size); --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F3F4183CBD for ; Mon, 2 Sep 2024 10:57:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274629; cv=none; b=IcH3t9XDreD69MLa8tA4UW8gyCk3OGYg9A9Pafdp3HceyCtOyAzX2bXvHQZYbaqPl9QgU3Km3Cg2cbPGnm/RCd2zR63U9M8ksa1DpQMjP853NG0YoIsyZNlZiXNzF4FB369kHc2wdZo77b2HvxXNQaEVzEO4rt9oF1+B5rI2trE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274629; c=relaxed/simple; bh=JxepjFnMtRuygEBDtjQvbjzq746vSN4HFi0W3wrSFXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FijHEhpPMwmZZumtm1wyMVU0SCcO6ARwXQS5PAUEOXBfkRNtb29rZYul7SnD+jM6r0ZudgLYVPRC37+J1UeDZNkDfBdLgvxUr1CKrrBh5mrlcxl9zx0xnrZsctQZDZgpIqrAjLzJ30XIoxvLipfXIVpzQKNNZXH8xyTweV+DlM8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Eww5u51a; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Eww5u51a" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7176645e440so108173b3a.1 for ; Mon, 02 Sep 2024 03:57:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274627; x=1725879427; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zeSoou3zgF2h9jQS3JrWUn4yreFPlJkSQIhQBpDBwWc=; b=Eww5u51apokEpoSIg2T8YcQXvntXOE/zBEjeIsB0IaoeBIJD0xNWOmrqeFwx7233Eu bdJzSZnxXULw+rHi5MhwqmyEeuBOit8yAYcTPaMPsA5kUB+LjTahZhiZgx0of8/VT0AL Xiuylnea1lqfs6w4rNSXppY+JxAPLAcJZTcvg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274627; x=1725879427; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zeSoou3zgF2h9jQS3JrWUn4yreFPlJkSQIhQBpDBwWc=; b=XBLsBmTxDSFCtW++H5yYo4UwVsbbeG7dY/1iyZMxO16ljTQiL5ZlUjEepCIdh3vIps 9c3gmbbq/W1JcNp++ooUL8Dmp7oikJ/Ff/VyFKhTXiGmsLL5kjH2qDCzQ9M4InmOQIS4 HOcXVlmF9EbsopXb9rtcpI6uXAMlgJDa9mjanLR0j6uQ4iyHhblxDQMKqkA5Ap5secmk 17a6jfksmWfZQdtBEVPu32hC5WyacHqcCIkB6q8+bTPwqiP+Q/4syMdd/4w8sdznAAjk emGRiOfx7vzbzN7LgAP2oxG5qX0iPnjHKF8y1R4qPLBG17oR1Y/odpQeZM53q9Vx8fNW vhFw== X-Forwarded-Encrypted: i=1; AJvYcCV+h4m4bcQyPP/Xf3yWYJkHF4RrCPlWaBstDMN5sGuJZY7Ref0BLV74pk8Nvrn4VmqwypqhkyQl1CjnUUg=@vger.kernel.org X-Gm-Message-State: AOJu0YyilvEgRsBYS2rMchol8BNaqKw0PuZ+MkMQzdJ7n5cww1E4pyBb +MeMw8PJbz5/YF1E8dpMT2VL7bcbdw2NRI1Jf3oEy80UMFNe47Um79DmJnoPug== X-Google-Smtp-Source: AGHT+IGj2j+PSGRCvDj8hb6UWgPVIXwbq44Io6Y9oDly4UdDJNLFucLbnheZ8LDbLRAJnwkUhm36lQ== X-Received: by 2002:a05:6a00:181a:b0:714:2922:7c6d with SMTP id d2e1a72fcca58-715e101f8d7mr25849320b3a.12.1725274627388; Mon, 02 Sep 2024 03:57:07 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:07 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv7 02/24] lib: lz4hc: export LZ4_resetStreamHC symbol Date: Mon, 2 Sep 2024 19:55:50 +0900 Message-ID: <20240902105656.1383858-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This symbol is needed to enable lz4hc dictionary support. Cc: Nick Terrell Signed-off-by: Sergey Senozhatsky --- lib/lz4/lz4hc_compress.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/lz4/lz4hc_compress.c b/lib/lz4/lz4hc_compress.c index e7ac8694b797..bc45594ad2a8 100644 --- a/lib/lz4/lz4hc_compress.c +++ b/lib/lz4/lz4hc_compress.c @@ -621,6 +621,7 @@ void LZ4_resetStreamHC(LZ4_streamHC_t *LZ4_streamHCPtr,= int compressionLevel) LZ4_streamHCPtr->internal_donotuse.base =3D NULL; LZ4_streamHCPtr->internal_donotuse.compressionLevel =3D (unsigned int)com= pressionLevel; } +EXPORT_SYMBOL(LZ4_resetStreamHC); =20 int LZ4_loadDictHC(LZ4_streamHC_t *LZ4_streamHCPtr, const char *dictionary, --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 462C518454E for ; Mon, 2 Sep 2024 10:57:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274631; cv=none; b=GAecza2qhuSbZfghsXRZfHy061w1lmr2yZJBYzm8CvWTRbOI+t9RE3Zzp39196j86mCYeFLirX8PPFYf5s6kJXkSQ11n/oSGCodzd41fd2hq95lNKNnBS7nAEBhprZABiQxuG6dSOLTtQCEOP/4HXSNWeUFqQRbpIPvSA9KEarM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274631; c=relaxed/simple; bh=KowW0rkixne512vm0Qy0iPWor7Pg9ob+bDapKE4dzkw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UF4Hmidjn/PfLV5AdeYdRud7J8bndBtlSXWbBFrnmClyTUDEiXQcl/kUqbQ9S20ZdFDnOlO109eKUKtvDPZy9QuzKXyzty6Q2RNr3CXhhzT14BEHuy4jJvD4hu8Q1B9HGWljPRPaneOz2oO6Dy3ubY3DVowz3y5ZwyxmsJvulpQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=hB731neu; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="hB731neu" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-7142e002aceso3219292b3a.2 for ; Mon, 02 Sep 2024 03:57:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274629; x=1725879429; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EaWScTZgQAfjVv5JZEhm3RyQE+cAh0ntRD2bN4eyTkw=; b=hB731neu09hl8jSVser5M9XjmayhucQLyumhk3tSghbEMed3datfPhCFHkYO26lT8E tmpTaFDK56aQXvN71ive4TUDc5iLgo7lvKmsmBX/RYe89+KR4GbC1FJi17cszn9h012J I7ZIacZsaO3qO7cY+hOPQ52/Mf+Yrxa1I5Cos= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274629; x=1725879429; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EaWScTZgQAfjVv5JZEhm3RyQE+cAh0ntRD2bN4eyTkw=; b=p63rkIqMkh+F5mvvh/oaHAKqHAHPFUfb+O8yiIT3flOHTnc+FkC7zkO4unZiixL85C r/9LstVO9L9j8nKYnZ5EuZ71twmT40glaWVCVVK+ps0dYQaqdyyi/jqfgNtjOLfxUipv iUrMs1H+VmLn6PsLJldLmL8ZeF3zCYYLraByDiUYsODVn6EFQ9gkR/HxwVGMhQIUx83R bfSwJ/Qhfdt0D87biiqUI1R7tW3HNV7rxqgMbfywlmOoaoWr1d8JMTg/2oDlZu03Dv7l jQNAX+uNigJ7q7mFE2ae/VhGqpMQKPocD71rAfN7PU5pZzahtAqHu+ea2Rb/sVLfTZTK aMKw== X-Forwarded-Encrypted: i=1; AJvYcCViFWKsClIfZuUBYbqM33CBj0gZItEUhfTq3dJB7C4Cufhys2vTRy4/qLUC7C5FgDHJGkQNL6JqDBPqE5Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwJ8y3JQGbSSIj4XulD9k5gpUWrncJaIKZtx1xzBvYhSFd8KXyY RTEndRR67qWe0NQsZB5VST9NDjC6k/qL6tvkvmzoUAZAkG2g4PpuOuVafvU5yw== X-Google-Smtp-Source: AGHT+IHwE0wSTERpJZdwvh6eItYkPP1B5yXZM49JR+Lef52b0nKpBdSmfS/gFmJcDxytI6quQHVxLQ== X-Received: by 2002:a05:6a21:1690:b0:1cc:d4a2:63d3 with SMTP id adf61e73a8af0-1cece4d816fmr6183116637.10.1725274629638; Mon, 02 Sep 2024 03:57:09 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:09 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv7 03/24] lib: zstd: fix null-deref in ZSTD_createCDict_advanced2() Date: Mon, 2 Sep 2024 19:55:51 +0900 Message-ID: <20240902105656.1383858-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ZSTD_createCDict_advanced2() must ensure that ZSTD_createCDict_advanced_internal() has successfully allocated cdict. customMalloc() may be called under low memory condition and may be unable to allocate workspace for cdict. Cc: Nick Terrell Signed-off-by: Sergey Senozhatsky --- lib/zstd/compress/zstd_compress.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/zstd/compress/zstd_compress.c b/lib/zstd/compress/zstd_com= press.c index c1c316e9e289..e48c73880477 100644 --- a/lib/zstd/compress/zstd_compress.c +++ b/lib/zstd/compress/zstd_compress.c @@ -5336,6 +5336,8 @@ ZSTD_CDict* ZSTD_createCDict_advanced2( dictLoadMethod, cctxParams.cParams, cctxParams.useRowMatchFinder, cctxParams.enableDed= icatedDictSearch, customMem); + if (!cdict) + return NULL; =20 if (ZSTD_isError( ZSTD_initCDict_internal(cdict, dict, dictSize, --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-ot1-f41.google.com (mail-ot1-f41.google.com [209.85.210.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF7931865F6 for ; Mon, 2 Sep 2024 10:57:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274634; cv=none; b=eO6RrdOL+YSyqSdgMPPP3zP92ncQ9yup5wAXD8qul4wn+e/mC5a2pvK9JlgeIBan3Rwxlfc3mCEIn77UFo4e+KChjrUeD2MQYZadOKOeZhIN+4qxuvNgT//BmaDtkodMeHgvpEEtIgifbNYi+q5M+/K6xoXF4YQz7Cas7HEt1t0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274634; c=relaxed/simple; bh=i5SGbb27ixq93Cin1OF1ul13vrKZTiDPTZGvt9XhNtA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F5cyhTOPtLBj+QrThnogLxDE+zTEPZP2YgCrJGVkqJQHfPKShJoywwCDDTsNTq1hSBcJ2VfXUTrEl++IrUiOrUaXJeDt56Y61q30iRr6Sy3eQi9bnEeAiYZMuSYkMX2wJox6B1YtR435tdpJviNv32vraWxr+2CoWOYKAiHjCAI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=ESQGvYZS; arc=none smtp.client-ip=209.85.210.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="ESQGvYZS" Received: by mail-ot1-f41.google.com with SMTP id 46e09a7af769-70f6e65d605so1436780a34.3 for ; Mon, 02 Sep 2024 03:57:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274632; x=1725879432; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mMLjKl00jE0A+L1e9EaxbGdOiKqbW3HdpeGcS+qXhAE=; b=ESQGvYZSwFKEn3jn5VfshDD+O/3YXuLa45W8iqD4q7GIBi/QOaugRL7G4AP9C7o1EB exi/4MxVKWZ0y+qKBaihlVn7U+OxzTorDNakdFFAQuCZ9gffKbyefKDsZJM9VOxAsIrB olgwFd2ii+XJ7OybJNLSycNJMv4yWmC5oRAqo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274632; x=1725879432; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mMLjKl00jE0A+L1e9EaxbGdOiKqbW3HdpeGcS+qXhAE=; b=kuLncDviZgyUgieDKH1nrqAxBgny0Ar+8jwVCCvBr4OFrcHoK5BuZXb0Z/xho3pKM1 M57wzyj0qx5wb+qgFd+0AurxmFox879XK0FBk9P93QpG4jD7oMfkqjz4VR1jihWNa5z/ qHpuHIRisJIvJ26NV0wQjpC0nUrU2Ih/FjdHsg5zhMof0ohxlL0SmYRjIR7VVY4330wz Iv8VjGUYovSBdm2lQS0pqSDOQIFJOubThzjDK8yaOnYgoAb+TstXpEhLWSK1nwHGg6UU IU70LMV/kSmfN80q9BNW3eD9oDKL1e3uAlG9JbshoPE9cnrJc5EfFivXto1Rp61JYZsL EKUA== X-Forwarded-Encrypted: i=1; AJvYcCUYpqbDgDrOZy9pnT2VN65lcrtk3+2NxwEYzPr2zKSzmLR7RZgVxu7iqYWG6cOx/DtREYcyk2GT813zkqQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywe7DQ2RcFCkomGoMLCH4ZlwjWiSwJ6B/JXTsqItsK9hBkJi9dV gWmg71DBRV43vAeQMB47WZDlwwvw1m424Q+rLnIwHEQvBkeI2/uVGVG/WClWPw== X-Google-Smtp-Source: AGHT+IEz2XqtIZvZotAF28uo/rjEi+n/LaR/diai5VuLyTP+flgjRSGtoWylJZbz61MpQOSlRNSLBg== X-Received: by 2002:a05:6358:998a:b0:1ac:671c:d424 with SMTP id e5c5f4694b2df-1b603c1f2bbmr1770058555d.8.1725274631681; Mon, 02 Sep 2024 03:57:11 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:11 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 04/24] zram: introduce custom comp backends API Date: Mon, 2 Sep 2024 19:55:52 +0900 Message-ID: <20240902105656.1383858-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Moving to custom backends implementation gives us ability to have our own minimalistic and extendable API, and algorithms tunings becomes possible. The list of compression backends is empty at this point, we will add backends in the followup patches. Signed-off-by: Sergey Senozhatsky --- Documentation/admin-guide/blockdev/zram.rst | 11 +- drivers/block/zram/Kconfig | 39 +---- drivers/block/zram/zcomp.c | 150 +++++++------------- drivers/block/zram/zcomp.h | 29 ++-- drivers/block/zram/zram_drv.c | 9 +- 5 files changed, 78 insertions(+), 160 deletions(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 091e8bb38887..181d55d64326 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -102,15 +102,8 @@ Examples:: #select lzo compression algorithm echo lzo > /sys/block/zram0/comp_algorithm =20 -For the time being, the `comp_algorithm` content does not necessarily -show every compression algorithm supported by the kernel. We keep this -list primarily to simplify device configuration and one can configure -a new device with a compression algorithm that is not listed in -`comp_algorithm`. The thing is that, internally, ZRAM uses Crypto API -and, if some of the algorithms were built as modules, it's impossible -to list all of them using, for instance, /proc/crypto or any other -method. This, however, has an advantage of permitting the usage of -custom crypto compression modules (implementing S/W or H/W compression). +For the time being, the `comp_algorithm` content shows only compression +algorithms that are supported by zram. =20 4) Set Disksize =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 7b29cce60ab2..8ecb74f83a5e 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -2,7 +2,6 @@ config ZRAM tristate "Compressed RAM block device support" depends on BLOCK && SYSFS && MMU - depends on CRYPTO_LZO || CRYPTO_ZSTD || CRYPTO_LZ4 || CRYPTO_LZ4HC || CRY= PTO_842 select ZSMALLOC help Creates virtual block devices called /dev/zramX (X =3D 0, 1, ...). @@ -15,45 +14,9 @@ config ZRAM =20 See Documentation/admin-guide/blockdev/zram.rst for more information. =20 -choice - prompt "Default zram compressor" - default ZRAM_DEF_COMP_LZORLE - depends on ZRAM - -config ZRAM_DEF_COMP_LZORLE - bool "lzo-rle" - depends on CRYPTO_LZO - -config ZRAM_DEF_COMP_ZSTD - bool "zstd" - depends on CRYPTO_ZSTD - -config ZRAM_DEF_COMP_LZ4 - bool "lz4" - depends on CRYPTO_LZ4 - -config ZRAM_DEF_COMP_LZO - bool "lzo" - depends on CRYPTO_LZO - -config ZRAM_DEF_COMP_LZ4HC - bool "lz4hc" - depends on CRYPTO_LZ4HC - -config ZRAM_DEF_COMP_842 - bool "842" - depends on CRYPTO_842 - -endchoice - config ZRAM_DEF_COMP string - default "lzo-rle" if ZRAM_DEF_COMP_LZORLE - default "zstd" if ZRAM_DEF_COMP_ZSTD - default "lz4" if ZRAM_DEF_COMP_LZ4 - default "lzo" if ZRAM_DEF_COMP_LZO - default "lz4hc" if ZRAM_DEF_COMP_LZ4HC - default "842" if ZRAM_DEF_COMP_842 + default "unset-value" =20 config ZRAM_WRITEBACK bool "Write back incompressible or idle page to backing device" diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 8237b08c49d8..fa31f1b91e0f 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -1,7 +1,4 @@ // SPDX-License-Identifier: GPL-2.0-or-later -/* - * Copyright (C) 2014 Sergey Senozhatsky. - */ =20 #include #include @@ -15,91 +12,68 @@ =20 #include "zcomp.h" =20 -static const char * const backends[] =3D { -#if IS_ENABLED(CONFIG_CRYPTO_LZO) - "lzo", - "lzo-rle", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_LZ4) - "lz4", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_LZ4HC) - "lz4hc", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_842) - "842", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_ZSTD) - "zstd", -#endif +static const struct zcomp_ops *backends[] =3D { + NULL }; =20 -static void zcomp_strm_free(struct zcomp_strm *zstrm) +static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) { - if (!IS_ERR_OR_NULL(zstrm->tfm)) - crypto_free_comp(zstrm->tfm); + if (zstrm->ctx) + comp->ops->destroy_ctx(zstrm->ctx); vfree(zstrm->buffer); - zstrm->tfm =3D NULL; + zstrm->ctx =3D NULL; zstrm->buffer =3D NULL; } =20 -/* - * Initialize zcomp_strm structure with ->tfm initialized by backend, and - * ->buffer. Return a negative value on error. - */ -static int zcomp_strm_init(struct zcomp_strm *zstrm, struct zcomp *comp) +static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) { - zstrm->tfm =3D crypto_alloc_comp(comp->name, 0, 0); + zstrm->ctx =3D comp->ops->create_ctx(); + /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ zstrm->buffer =3D vzalloc(2 * PAGE_SIZE); - if (IS_ERR_OR_NULL(zstrm->tfm) || !zstrm->buffer) { - zcomp_strm_free(zstrm); + if (!zstrm->ctx || !zstrm->buffer) { + zcomp_strm_free(comp, zstrm); return -ENOMEM; } return 0; } =20 +static const struct zcomp_ops *lookup_backend_ops(const char *comp) +{ + int i =3D 0; + + while (backends[i]) { + if (sysfs_streq(comp, backends[i]->name)) + break; + i++; + } + return backends[i]; +} + bool zcomp_available_algorithm(const char *comp) { - /* - * Crypto does not ignore a trailing new line symbol, - * so make sure you don't supply a string containing - * one. - * This also means that we permit zcomp initialisation - * with any compressing algorithm known to crypto api. - */ - return crypto_has_comp(comp, 0, 0) =3D=3D 1; + return lookup_backend_ops(comp) !=3D NULL; } =20 /* show available compressors */ ssize_t zcomp_available_show(const char *comp, char *buf) { - bool known_algorithm =3D false; ssize_t sz =3D 0; int i; =20 - for (i =3D 0; i < ARRAY_SIZE(backends); i++) { - if (!strcmp(comp, backends[i])) { - known_algorithm =3D true; + for (i =3D 0; i < ARRAY_SIZE(backends) - 1; i++) { + if (!strcmp(comp, backends[i]->name)) { sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz - 2, - "[%s] ", backends[i]); + "[%s] ", backends[i]->name); } else { sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz - 2, - "%s ", backends[i]); + "%s ", backends[i]->name); } } =20 - /* - * Out-of-tree module known to crypto api or a missing - * entry in `backends'. - */ - if (!known_algorithm && crypto_has_comp(comp, 0, 0) =3D=3D 1) - sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz - 2, - "[%s] ", comp); - sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz, "\n"); return sz; } @@ -115,38 +89,25 @@ void zcomp_stream_put(struct zcomp *comp) local_unlock(&comp->stream->lock); } =20 -int zcomp_compress(struct zcomp_strm *zstrm, - const void *src, unsigned int *dst_len) +int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm, + const void *src, unsigned int *dst_len) { - /* - * Our dst memory (zstrm->buffer) is always `2 * PAGE_SIZE' sized - * because sometimes we can endup having a bigger compressed data - * due to various reasons: for example compression algorithms tend - * to add some padding to the compressed buffer. Speaking of padding, - * comp algorithm `842' pads the compressed length to multiple of 8 - * and returns -ENOSP when the dst memory is not big enough, which - * is not something that ZRAM wants to see. We can handle the - * `compressed_size > PAGE_SIZE' case easily in ZRAM, but when we - * receive -ERRNO from the compressing backend we can't help it - * anymore. To make `842' happy we need to tell the exact size of - * the dst buffer, zram_drv will take care of the fact that - * compressed buffer is too big. - */ - *dst_len =3D PAGE_SIZE * 2; + /* The dst buffer should always be 2 * PAGE_SIZE */ + size_t dlen =3D 2 * PAGE_SIZE; + int ret; =20 - return crypto_comp_compress(zstrm->tfm, - src, PAGE_SIZE, - zstrm->buffer, dst_len); + ret =3D comp->ops->compress(zstrm->ctx, src, PAGE_SIZE, + zstrm->buffer, &dlen); + if (!ret) + *dst_len =3D dlen; + return ret; } =20 -int zcomp_decompress(struct zcomp_strm *zstrm, - const void *src, unsigned int src_len, void *dst) +int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm, + const void *src, unsigned int src_len, void *dst) { - unsigned int dst_len =3D PAGE_SIZE; - - return crypto_comp_decompress(zstrm->tfm, - src, src_len, - dst, &dst_len); + return comp->ops->decompress(zstrm->ctx, src, src_len, + dst, PAGE_SIZE); } =20 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) @@ -158,7 +119,7 @@ int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist= _node *node) zstrm =3D per_cpu_ptr(comp->stream, cpu); local_lock_init(&zstrm->lock); =20 - ret =3D zcomp_strm_init(zstrm, comp); + ret =3D zcomp_strm_init(comp, zstrm); if (ret) pr_err("Can't allocate a compression stream\n"); return ret; @@ -170,7 +131,7 @@ int zcomp_cpu_dead(unsigned int cpu, struct hlist_node = *node) struct zcomp_strm *zstrm; =20 zstrm =3D per_cpu_ptr(comp->stream, cpu); - zcomp_strm_free(zstrm); + zcomp_strm_free(comp, zstrm); return 0; } =20 @@ -199,32 +160,21 @@ void zcomp_destroy(struct zcomp *comp) kfree(comp); } =20 -/* - * search available compressors for requested algorithm. - * allocate new zcomp and initialize it. return compressing - * backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL) - * if requested algorithm is not supported, ERR_PTR(-ENOMEM) in - * case of allocation error, or any other error potentially - * returned by zcomp_init(). - */ struct zcomp *zcomp_create(const char *alg) { struct zcomp *comp; int error; =20 - /* - * Crypto API will execute /sbin/modprobe if the compression module - * is not loaded yet. We must do it here, otherwise we are about to - * call /sbin/modprobe under CPU hot-plug lock. - */ - if (!zcomp_available_algorithm(alg)) - return ERR_PTR(-EINVAL); - comp =3D kzalloc(sizeof(struct zcomp), GFP_KERNEL); if (!comp) return ERR_PTR(-ENOMEM); =20 - comp->name =3D alg; + comp->ops =3D lookup_backend_ops(alg); + if (!comp->ops) { + kfree(comp); + return ERR_PTR(-EINVAL); + } + error =3D zcomp_init(comp); if (error) { kfree(comp); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index e9fe63da0e9b..e5eb5ec4c645 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -1,7 +1,4 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (C) 2014 Sergey Senozhatsky. - */ =20 #ifndef _ZCOMP_H_ #define _ZCOMP_H_ @@ -12,13 +9,26 @@ struct zcomp_strm { local_lock_t lock; /* compression/decompression buffer */ void *buffer; - struct crypto_comp *tfm; + void *ctx; +}; + +struct zcomp_ops { + int (*compress)(void *ctx, const unsigned char *src, size_t src_len, + unsigned char *dst, size_t *dst_len); + + int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, + unsigned char *dst, size_t dst_len); + + void *(*create_ctx)(void); + void (*destroy_ctx)(void *ctx); + + const char *name; }; =20 /* dynamic per-device compression frontend */ struct zcomp { struct zcomp_strm __percpu *stream; - const char *name; + const struct zcomp_ops *ops; struct hlist_node node; }; =20 @@ -33,10 +43,9 @@ void zcomp_destroy(struct zcomp *comp); struct zcomp_strm *zcomp_stream_get(struct zcomp *comp); void zcomp_stream_put(struct zcomp *comp); =20 -int zcomp_compress(struct zcomp_strm *zstrm, - const void *src, unsigned int *dst_len); - -int zcomp_decompress(struct zcomp_strm *zstrm, - const void *src, unsigned int src_len, void *dst); +int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm, + const void *src, unsigned int *dst_len); +int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm, + const void *src, unsigned int src_len, void *dst); =20 #endif /* _ZCOMP_H_ */ diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index efcb8d9d274c..93042da8ccdf 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1327,7 +1327,8 @@ static int zram_read_from_zspool(struct zram *zram, s= truct page *page, ret =3D 0; } else { dst =3D kmap_local_page(page); - ret =3D zcomp_decompress(zstrm, src, size, dst); + ret =3D zcomp_decompress(zram->comps[prio], zstrm, + src, size, dst); kunmap_local(dst); zcomp_stream_put(zram->comps[prio]); } @@ -1414,7 +1415,8 @@ static int zram_write_page(struct zram *zram, struct = page *page, u32 index) compress_again: zstrm =3D zcomp_stream_get(zram->comps[ZRAM_PRIMARY_COMP]); src =3D kmap_local_page(page); - ret =3D zcomp_compress(zstrm, src, &comp_len); + ret =3D zcomp_compress(zram->comps[ZRAM_PRIMARY_COMP], zstrm, + src, &comp_len); kunmap_local(src); =20 if (unlikely(ret)) { @@ -1601,7 +1603,8 @@ static int zram_recompress(struct zram *zram, u32 ind= ex, struct page *page, num_recomps++; zstrm =3D zcomp_stream_get(zram->comps[prio]); src =3D kmap_local_page(page); - ret =3D zcomp_compress(zstrm, src, &comp_len_new); + ret =3D zcomp_compress(zram->comps[prio], zstrm, + src, &comp_len_new); kunmap_local(src); =20 if (ret) { --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62D5F187332 for ; Mon, 2 Sep 2024 10:57:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274635; cv=none; b=RUqgSrMlJm4xKYlWjG1rOBvlnRCz+bvUqlk/f34+lreVNiAN+wiiWOCl+PM3hYWFKuZ86QTyqS+PORQxekldwJTM1FqAzz00/aFe4ND4XA5ty5FT3/ZGCemHvfUAHx3h4M8ZUhyBaI+zLmTYJ+CKvIPJbAxlb3d5sjpDm4kOXBE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274635; c=relaxed/simple; bh=k6AU7Nrln7zXIosIrdTstNXi7PKn+BZzexft1EkXivU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G+l6HZxw5queZ7WErPpGiCajO2n/71tyetHukU16toX1CP89wbom8Ex8nb+iip0lB9z012ClOCNDnAJizc+Lcv14dwkM9Me7kO1bQuVEFa41SAMl77m28XOBLE5Hx11cnfUcO4S0b1ZyC0dMFBbjRe87vVooX6keI+Jp1pZCPSM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=HyGardt0; arc=none smtp.client-ip=209.85.210.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="HyGardt0" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-7176645e501so124356b3a.1 for ; Mon, 02 Sep 2024 03:57:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274634; x=1725879434; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bUv9/HrRh/qtn53d9V/19UhXQG2O6V6VbrZlUqPKFd8=; b=HyGardt0+i3GH1tEid/dL3BY3RuA9+epwCpwRemEBly2RvjGWcgxogf81u1psYA36S GjKZmwdAbwBs56y0WxnMrpMFiNLST9Y366MQQygzjklknMLaHvQ1wbwjnwUNa7ZseJdu HhrjWtoogoZjRTkB1p3CvsXjDuHhIwYBnB+Fk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274634; x=1725879434; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bUv9/HrRh/qtn53d9V/19UhXQG2O6V6VbrZlUqPKFd8=; b=aIG6uBETi5wIPQOytRnF7dsdNMHmfM74dhdQBmZe6rGdI3rEbQhybtbsTdmZkB8L+c bY54wdmH0UkUTNHHNlOYg/p+qmtI7zy5O/4cQWB6V5Br/i3dRVskbP37feGs44ZkOrys gzYw8qi03aDv3O9hEHNsn+i4DQO4U+bw3osG05PyWzVp2lD/sddSPPyQXPShzaR7fm9/ AL+T4mARCs/koe0oVB0h6E3T6kkobUU3qYT4llpecul0DqpW0Y3vTLG5LR7rdhbkWle5 Bi9zWWM8mO0a42/bpxXnXBTCWlp6d+WnPKYTaSPgdpV49OkvucTZ3AIEEaJjXsmNY+X0 y5eQ== X-Forwarded-Encrypted: i=1; AJvYcCVTV5e2Dr//yuiXMlnei1m8b/3C2ia2tS+0jJHc6wJ5Hu9XhguQCez2z17yHXJ3tlcO3ruMLsP6mZkibEg=@vger.kernel.org X-Gm-Message-State: AOJu0YyTSEmzgz87Z7nYQHOa24NYgL48YFYc69A1esGFnMaFy6yQ7Ho5 jKsyrQ7c7vvm0EFB88za3bzfnaBuA6DYest4BnWNl6B3hbnsFF2KJKQVeRM4jg== X-Google-Smtp-Source: AGHT+IG2yJm8Hb6Id4VFy83ViVeVopCM9BVgVxu9nz3E2UxxbuuSfVHEqFLqKKiICQIOi62r16cwgg== X-Received: by 2002:a05:6a00:2e90:b0:713:f127:ad5c with SMTP id d2e1a72fcca58-717449c68demr4349169b3a.28.1725274633660; Mon, 02 Sep 2024 03:57:13 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:13 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 05/24] zram: add lzo and lzorle compression backends support Date: Mon, 2 Sep 2024 19:55:53 +0900 Message-ID: <20240902105656.1383858-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w lzo/lzorle compression support. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 23 +++++++++++++++ drivers/block/zram/Makefile | 3 ++ drivers/block/zram/backend_lzo.c | 43 ++++++++++++++++++++++++++++ drivers/block/zram/backend_lzo.h | 10 +++++++ drivers/block/zram/backend_lzorle.c | 44 +++++++++++++++++++++++++++++ drivers/block/zram/backend_lzorle.h | 10 +++++++ drivers/block/zram/zcomp.c | 7 +++++ 7 files changed, 140 insertions(+) create mode 100644 drivers/block/zram/backend_lzo.c create mode 100644 drivers/block/zram/backend_lzo.h create mode 100644 drivers/block/zram/backend_lzorle.c create mode 100644 drivers/block/zram/backend_lzorle.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 8ecb74f83a5e..5d329a887b12 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -14,8 +14,31 @@ config ZRAM =20 See Documentation/admin-guide/blockdev/zram.rst for more information. =20 +config ZRAM_BACKEND_LZO + bool "lzo and lzo-rle compression support" + depends on ZRAM + select LZO_COMPRESS + select LZO_DECOMPRESS + +choice + prompt "Default zram compressor" + default ZRAM_DEF_COMP_LZORLE + depends on ZRAM + +config ZRAM_DEF_COMP_LZORLE + bool "lzo-rle" + depends on ZRAM_BACKEND_LZO + +config ZRAM_DEF_COMP_LZO + bool "lzo" + depends on ZRAM_BACKEND_LZO + +endchoice + config ZRAM_DEF_COMP string + default "lzo-rle" if ZRAM_DEF_COMP_LZORLE + default "lzo" if ZRAM_DEF_COMP_LZO default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index de9e457907b1..2a3db3368af9 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only + zram-y :=3D zcomp.o zram_drv.o =20 +zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o + obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c new file mode 100644 index 000000000000..4c9e611f6c03 --- /dev/null +++ b/drivers/block/zram/backend_lzo.c @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "backend_lzo.h" + +static void *lzo_create(void) +{ + return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); +} + +static void lzo_destroy(void *ctx) +{ + kfree(ctx); +} + +static int lzo_compress(void *ctx, const unsigned char *src, size_t src_le= n, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D lzo1x_1_compress(src, src_len, dst, dst_len, ctx); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +static int lzo_decompress(void *ctx, const unsigned char *src, size_t src_= len, + unsigned char *dst, size_t dst_len) +{ + int ret; + + ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +const struct zcomp_ops backend_lzo =3D { + .compress =3D lzo_compress, + .decompress =3D lzo_decompress, + .create_ctx =3D lzo_create, + .destroy_ctx =3D lzo_destroy, + .name =3D "lzo", +}; diff --git a/drivers/block/zram/backend_lzo.h b/drivers/block/zram/backend_= lzo.h new file mode 100644 index 000000000000..93d54749e63c --- /dev/null +++ b/drivers/block/zram/backend_lzo.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZO_H__ +#define __BACKEND_LZO_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lzo; + +#endif /* __BACKEND_LZO_H__ */ diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c new file mode 100644 index 000000000000..19a9ce132046 --- /dev/null +++ b/drivers/block/zram/backend_lzorle.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "backend_lzorle.h" + +static void *lzorle_create(void) +{ + return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); +} + +static void lzorle_destroy(void *ctx) +{ + kfree(ctx); +} + +static int lzorle_compress(void *ctx, const unsigned char *src, size_t src= _len, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D lzorle1x_1_compress(src, src_len, dst, dst_len, ctx); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +static int lzorle_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, + size_t dst_len) +{ + int ret; + + ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +const struct zcomp_ops backend_lzorle =3D { + .compress =3D lzorle_compress, + .decompress =3D lzorle_decompress, + .create_ctx =3D lzorle_create, + .destroy_ctx =3D lzorle_destroy, + .name =3D "lzo-rle", +}; diff --git a/drivers/block/zram/backend_lzorle.h b/drivers/block/zram/backe= nd_lzorle.h new file mode 100644 index 000000000000..6ecb163b09f1 --- /dev/null +++ b/drivers/block/zram/backend_lzorle.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZORLE_H__ +#define __BACKEND_LZORLE_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lzorle; + +#endif /* __BACKEND_LZORLE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index fa31f1b91e0f..a49d3e355c23 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -12,7 +12,14 @@ =20 #include "zcomp.h" =20 +#include "backend_lzo.h" +#include "backend_lzorle.h" + static const struct zcomp_ops *backends[] =3D { +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) + &backend_lzorle, + &backend_lzo, +#endif NULL }; =20 --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E34F187FE6 for ; Mon, 2 Sep 2024 10:57:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274637; cv=none; b=THtHLiEvjvT9jRcm+jgM9/rA+hSHcg66BoI9PS1xiYT5xbANevP3TFkvJ/RlWSpi0+McbwkIQ2FUGjid0OwDwxgU0EIRHpxpkC8stSMT05W5do8C4EotB/HxHJIzAAnbaU7lKQ/lPmFKqOa353VmlpKpYNitnAM7TLPOKBmxi0s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274637; c=relaxed/simple; bh=HVKbbsUahhVeMekRHiUNv/o7+sqVz5XWRuKPpJIOVUo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bdwu0Qe+7qhvYmosAYc/5G9PsIMb/D42JXFk/ccm/StwzGeKSYt3stfPbHvDpCtLoYjRIOnF+HP9yBdSxVMSFm16P3Ky/99vL+V9q++tXFB8XqopnVg/u41Sfwgqhuud+3L2pBUtOUvv0tPG18FS1gtvG59/ZWCt52Y8pcD6KXU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=RMg4LjPl; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="RMg4LjPl" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-7176645e440so108260b3a.1 for ; Mon, 02 Sep 2024 03:57:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274636; x=1725879436; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=umU5t5tUEGsQb+BawdLT2hqRrjwi3DIEVB/XFUHlN1U=; b=RMg4LjPl4rCdObJ0gVNvcpXXwRyN0VDEWqnSX8bv0QxOYTlbGdLSfYxunbeATArJSs 6seOP9VN/hVdEDxxynH7qcirOzrGsbFuQiJA9PbLoxdRMfI8N46fNfkocUz8QhfggsPy ET4F38Qa1PuZWYRt6Y3iJ+fYFhccV2FmVWFj4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274636; x=1725879436; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=umU5t5tUEGsQb+BawdLT2hqRrjwi3DIEVB/XFUHlN1U=; b=PA34XTXfauTjBaUWK/0/78XdAQoSm/YmFbD2SpRKucBocuX2PZzmzGzUO2x/WPAnSA YZxWPYb4IMJNZbrvr8Fz7t04X64kFDiZ7yBfQsJcBQnDLW29YkRAx54JvpIMalilmG6k Rk76gHXU4glq+B2g54b8xp2/Y5nq6OOwIBbl5MXKoaQKRx0ITyA9bOngtMvgtPLstyyg 33ANVnWuylcmW1kjcyyItaqEKyVDtlnyaZQT6+piLJ3+los8YrahsoDOHMs7P2oDvE/L iLRZG/uXyey6Ue2kCyfsJCVoxhIOmSbm4+TBkuYU1tflb2B3b3wmUrJ/K5IYZ/j+b5Sv +AJw== X-Forwarded-Encrypted: i=1; AJvYcCXikhETTZR29RqVKR8+Ne0PU48zAG/BjuodGTsYSda2xRONqjhljUPVtEkDzg3PM0E2ISCkE72bCFDAkLw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6Bj186aHtCNraeOpSHMFiZ5+VI/fR8XpoZz+ZEZOWC6hd496P erXKzJ3BZvnAyC1psVFeOKqNenYYdzJ/WSFAya4zrWUefzQ8NtAqsxlnMPF/AQ== X-Google-Smtp-Source: AGHT+IF9p7J5BZDv8ll8pm5VjYD16tAS3siICKagFPpCHIlyW3VizX10tsflv0dnZZ6WrxJbxZ+ngQ== X-Received: by 2002:a05:6a00:9160:b0:714:1a71:cb0a with SMTP id d2e1a72fcca58-715e101f8camr23121192b3a.10.1725274635675; Mon, 02 Sep 2024 03:57:15 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:15 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 06/24] zram: add lz4 compression backend support Date: Mon, 2 Sep 2024 19:55:54 +0900 Message-ID: <20240902105656.1383858-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w lz4 compression support. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 +++++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_lz4.c | 72 ++++++++++++++++++++++++++++++++ drivers/block/zram/backend_lz4.h | 10 +++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 98 insertions(+) create mode 100644 drivers/block/zram/backend_lz4.c create mode 100644 drivers/block/zram/backend_lz4.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 5d329a887b12..f1e76fc8431a 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -20,6 +20,12 @@ config ZRAM_BACKEND_LZO select LZO_COMPRESS select LZO_DECOMPRESS =20 +config ZRAM_BACKEND_LZ4 + bool "lz4 compression support" + depends on ZRAM + select LZ4_COMPRESS + select LZ4_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -33,12 +39,17 @@ config ZRAM_DEF_COMP_LZO bool "lzo" depends on ZRAM_BACKEND_LZO =20 +config ZRAM_DEF_COMP_LZ4 + bool "lz4" + depends on ZRAM_BACKEND_LZ4 + endchoice =20 config ZRAM_DEF_COMP string default "lzo-rle" if ZRAM_DEF_COMP_LZORLE default "lzo" if ZRAM_DEF_COMP_LZO + default "lz4" if ZRAM_DEF_COMP_LZ4 default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 2a3db3368af9..567f4434aee8 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -3,5 +3,6 @@ zram-y :=3D zcomp.o zram_drv.o =20 zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c new file mode 100644 index 000000000000..c1d19fed5af2 --- /dev/null +++ b/drivers/block/zram/backend_lz4.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "backend_lz4.h" + +struct lz4_ctx { + void *mem; + s32 level; +}; + +static void lz4_destroy(void *ctx) +{ + struct lz4_ctx *zctx =3D ctx; + + vfree(zctx->mem); + kfree(zctx); +} + +static void *lz4_create(void) +{ + struct lz4_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + /* @FIXME: using a hardcoded LZ4_ACCELERATION_DEFAULT for now */ + ctx->level =3D LZ4_ACCELERATION_DEFAULT; + ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!ctx->mem) + goto error; + + return ctx; +error: + lz4_destroy(ctx); + return NULL; +} + +static int lz4_compress(void *ctx, const unsigned char *src, size_t src_le= n, + unsigned char *dst, size_t *dst_len) +{ + struct lz4_ctx *zctx =3D ctx; + int ret; + + ret =3D LZ4_compress_fast(src, dst, src_len, *dst_len, + zctx->level, zctx->mem); + if (!ret) + return -EINVAL; + *dst_len =3D ret; + return 0; +} + +static int lz4_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, size_t dst_len) +{ + int ret; + + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (ret < 0) + return -EINVAL; + return 0; +} + +const struct zcomp_ops backend_lz4 =3D { + .compress =3D lz4_compress, + .decompress =3D lz4_decompress, + .create_ctx =3D lz4_create, + .destroy_ctx =3D lz4_destroy, + .name =3D "lz4", +}; diff --git a/drivers/block/zram/backend_lz4.h b/drivers/block/zram/backend_= lz4.h new file mode 100644 index 000000000000..c11fa602a703 --- /dev/null +++ b/drivers/block/zram/backend_lz4.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZ4_H__ +#define __BACKEND_LZ4_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lz4; + +#endif /* __BACKEND_LZ4_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index a49d3e355c23..5da64e8fc798 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -14,11 +14,15 @@ =20 #include "backend_lzo.h" #include "backend_lzorle.h" +#include "backend_lz4.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) &backend_lzorle, &backend_lzo, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4) + &backend_lz4, #endif NULL }; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-oi1-f171.google.com (mail-oi1-f171.google.com [209.85.167.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 964861D27A9 for ; Mon, 2 Sep 2024 10:57:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274640; cv=none; b=FvjLqaQrIPsn4C47Gm5p3c3VuIVmGLMOcL9n24fIW9oAYH8GV3/rqfQnvC5d3kiUgGdoPF6bYTGQKETcbVR+/ccYcO4MLSqUq+Fs/FTjzA+pJpE8AjxGPxq7FMV/Jtd2TIct7uJFPIjLtv1FvgLQs4jHNkc0p7vK6nZDL4atwiU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274640; c=relaxed/simple; bh=4YKpqE+2ih/uuhzC6ZcGyVoRvcjCC5J44XhaNaAOdbQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iMOoDOriFGzWHH38obaaGImqR4LDYyBR6xrgnl7blXg+HtCkd7C0G99QhhgmN9IXRxRYRPxsI/7pCjfsNyDfWh00CYWVmamLxwdFx0BMB7GqTwaIVeNU3IK2CVsi/OJydcfp0I/PsYojblzR/b0wTQOScPtx/cikm1S/TAHpYr8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=JovDaDib; arc=none smtp.client-ip=209.85.167.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="JovDaDib" Received: by mail-oi1-f171.google.com with SMTP id 5614622812f47-3df08d53820so2260602b6e.0 for ; Mon, 02 Sep 2024 03:57:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274638; x=1725879438; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3VU44Jwz/VEJm+kmZG1z/WLYNiw8d/JQb3gDJ5Cfi0I=; b=JovDaDibgVdcXuFzGZ+VKjlOs06aBYTRs818uO/oafSD79u9YxNKyGixoh2l1B2XUr IFkIXF+LWJeaPmwRlAsVTCM+ya/pC2g2omdlNyDok5ONBMwSrIGXbS0dvVqGMESv17Wo vJ6HSoptKuh23Oo8flSJ57jU4CQmBPWSBjZuA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274638; x=1725879438; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3VU44Jwz/VEJm+kmZG1z/WLYNiw8d/JQb3gDJ5Cfi0I=; b=AzRLFelDbxgdGOApMXKOCUT0mDo0RJ+FFCncSG4OFIpBj8aayX7ZPSsEdwP/GeQb2v UXjoMCdx+TOnvbMUiJF5H2IJOuQLsUvt6T/5U8n6MxBwuInvNOyCwgPQyummmVxNZb8R inWPiUYYOmhYBV1Wjymbo+csi8EfGZVhIUv/tB5fgiLe5DSv1SGDh30zeyGRYQgbATgY hMk9McEQOQPl5lVQSjpgE6HPM39jcLsSX67DF5ybQsv5Z0JwWpi38yH48llu/1OxcNFU bBABu4VeJv4XAkP9so2wZsFK20pErnGVwBT+8xHcivC4KGvJMni6ti30MRFIGw+5ea6+ pi4g== X-Forwarded-Encrypted: i=1; AJvYcCUcWxxpA44AKSTwwyDmS2E+b9dJS1X+LfQYqt+3HqQFQQGI+nXEzlqR9pQh3l74xxu+cFK0GVbbRHb1Bi4=@vger.kernel.org X-Gm-Message-State: AOJu0YwidGMJuAqUaQH4SjVe11ljYXe1OeV7ay7HE1BYExrSegQBUTSj 4jOTrK2frIn7JcaQxnjPh4f/f5bCpaoGP1HYdgqbdkhy5zBBzVgHXBRAMcdfHgj1M/28nkEEUXc 1hw== X-Google-Smtp-Source: AGHT+IFDcmn5rB7xa4Aose9bj5eDc+Tog9OzkwDNZVIHfU73hBt54+XHugYKcEDMzeb1aMkFJ89UBA== X-Received: by 2002:a05:6870:ac1e:b0:261:1046:66fc with SMTP id 586e51a60fabf-2779006e096mr16188905fac.4.1725274637759; Mon, 02 Sep 2024 03:57:17 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:17 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 07/24] zram: add lz4hc compression backend support Date: Mon, 2 Sep 2024 19:55:55 +0900 Message-ID: <20240902105656.1383858-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w lz4hc compression support. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 +++++ drivers/block/zram/Makefile | 5 ++- drivers/block/zram/backend_lz4hc.c | 72 ++++++++++++++++++++++++++++++ drivers/block/zram/backend_lz4hc.h | 10 +++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 drivers/block/zram/backend_lz4hc.c create mode 100644 drivers/block/zram/backend_lz4hc.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index f1e76fc8431a..0d890a8d2dc4 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -26,6 +26,12 @@ config ZRAM_BACKEND_LZ4 select LZ4_COMPRESS select LZ4_DECOMPRESS =20 +config ZRAM_BACKEND_LZ4HC + bool "lz4hc compression support" + depends on ZRAM + select LZ4HC_COMPRESS + select LZ4_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -43,6 +49,10 @@ config ZRAM_DEF_COMP_LZ4 bool "lz4" depends on ZRAM_BACKEND_LZ4 =20 +config ZRAM_DEF_COMP_LZ4HC + bool "lz4hc" + depends on ZRAM_BACKEND_LZ4HC + endchoice =20 config ZRAM_DEF_COMP @@ -50,6 +60,7 @@ config ZRAM_DEF_COMP default "lzo-rle" if ZRAM_DEF_COMP_LZORLE default "lzo" if ZRAM_DEF_COMP_LZO default "lz4" if ZRAM_DEF_COMP_LZ4 + default "lz4hc" if ZRAM_DEF_COMP_LZ4HC default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 567f4434aee8..727c9d68e3e3 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -2,7 +2,8 @@ =20 zram-y :=3D zcomp.o zram_drv.o =20 -zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o -zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c new file mode 100644 index 000000000000..536f7a0073c4 --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "backend_lz4hc.h" + +struct lz4hc_ctx { + void *mem; + s32 level; +}; + +static void lz4hc_destroy(void *ctx) +{ + struct lz4hc_ctx *zctx =3D ctx; + + vfree(zctx->mem); + kfree(zctx); +} + +static void *lz4hc_create(void) +{ + struct lz4hc_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ + ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!ctx->mem) + goto error; + + return ctx; +error: + lz4hc_destroy(ctx); + return NULL; +} + +static int lz4hc_compress(void *ctx, const unsigned char *src, size_t src_= len, + unsigned char *dst, size_t *dst_len) +{ + struct lz4hc_ctx *zctx =3D ctx; + int ret; + + ret =3D LZ4_compress_HC(src, dst, src_len, *dst_len, + zctx->level, zctx->mem); + if (!ret) + return -EINVAL; + *dst_len =3D ret; + return 0; +} + +static int lz4hc_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, size_t dst_len) +{ + int ret; + + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (ret < 0) + return -EINVAL; + return 0; +} + +const struct zcomp_ops backend_lz4hc =3D { + .compress =3D lz4hc_compress, + .decompress =3D lz4hc_decompress, + .create_ctx =3D lz4hc_create, + .destroy_ctx =3D lz4hc_destroy, + .name =3D "lz4hc", +}; diff --git a/drivers/block/zram/backend_lz4hc.h b/drivers/block/zram/backen= d_lz4hc.h new file mode 100644 index 000000000000..6de03551ed4d --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZ4HC_H__ +#define __BACKEND_LZ4HC_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lz4hc; + +#endif /* __BACKEND_LZ4HC_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 5da64e8fc798..a06cdb9aa567 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -15,6 +15,7 @@ #include "backend_lzo.h" #include "backend_lzorle.h" #include "backend_lz4.h" +#include "backend_lz4hc.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -23,6 +24,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4) &backend_lz4, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4HC) + &backend_lz4hc, #endif NULL }; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B5C91D45EC for ; Mon, 2 Sep 2024 10:57:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274642; cv=none; b=uJA/JlYC9nDMJYqLHpX+0t4M09foQL8YwV+pAXaiGUIbpiKzyQGpxojhfg4li/duEX9touMkQBpVwNQDAbtIzuJblL5PcsgpblUAFMHKgGmIXKgHdhurzoIzRVrOQiOrYqyU5Pfx/0tEW64cw29Ibb2lrfK1Hf87/rVI5nL1nOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274642; c=relaxed/simple; bh=3l8Oz9EeK/lkkijMSLIy4IoIEKzdqGllXBSaS6XDCuI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NiHefI2+x7o3b0WuEVtS0OKnigpOkjD0+8E2rpDGlELP9caEVWykD3AXNBo+9l/l6ispHQ9//Zw9hacxO3FgoeHW2Do6bIWRQ4PXymdjGDpUQ/TeA/eOlfd4WYHS6DJcwzJpcgMZOPxWgTbWuXcZI7OFh/FZ7sAJB3u319sDfcM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=ZYhoUv7S; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="ZYhoUv7S" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-7c3e1081804so2018368a12.3 for ; Mon, 02 Sep 2024 03:57:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274640; x=1725879440; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Gna0weqEgYLTwBl3b7l0kjPbCjYrVVl4LT6ZNOR8Mso=; b=ZYhoUv7S+3c4Y1iFDVT8C+X89W/yItOIm7ASL51AYQ7FQkwGM5ognC960axe+ANt+6 VS5ScftCVsi5XidSrRt2b0mtSaAOpDZTPNQ9sl9a+nE5VrWD6kF54vcucl7QGKbui19t VNrgjjw8XMiellXuBQt1YZfUenDiu2qnJiYhY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274640; x=1725879440; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Gna0weqEgYLTwBl3b7l0kjPbCjYrVVl4LT6ZNOR8Mso=; b=MTzvwZt+ObDxzWg7gRn8fhhdPn9RqChsUti7UShTjZp0TJqWKa+jc/LpW9eTiACFet eao6Llk00P0p6AMmJnJvFotAwU66le/yCgeFCBmZtTeuUTpi+pq2X0NFPomvGWEMF291 Y3AV8EvdL0p3yoGgsb7FOoXAXCUm/ckki/lb/p0DlaZwdaLVwj8rT1fN0rZ1SBkHwiBV RxC4eBWTxhigAqJoiyt1jBDWh4ykC4k5QB9nJViqTtFmMqEhG+eXS5yEj69Ef1wUMopC JDAscReJ5T9iT9KXjuYPobAlrha/hBvE5UWjkfOEo9yhaHXXaGWfqLQG3VIsJxypMlqO QKDA== X-Forwarded-Encrypted: i=1; AJvYcCVTqb4Yx989V3KiNjJuufHbqrffMFi7lVxhtzOR8QJ2SFi5nHMleJs/GKtR8UOdFyOw+gLDUv+QggHvFm8=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5rm9ZMLFe/UlW9wrNxJIKlTbya80psiVikihBttwLyh1OB/gQ 6WYfFnk/RxdrrCXM1q1jeYU96x709uc/ex9Mdo/sD8ermN8dn+mH6qB6Ul7WIw== X-Google-Smtp-Source: AGHT+IE4kkp//DMOtrsxO6qZWJyv+UsHDHGJhyzRNS/1gT4xwYj+GyYAW2U5lK33sZ9eTIaWvPSdAA== X-Received: by 2002:a05:6a21:1584:b0:1cc:da34:585e with SMTP id adf61e73a8af0-1cce10d92c8mr12740990637.46.1725274639620; Mon, 02 Sep 2024 03:57:19 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:19 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 08/24] zram: add zstd compression backend support Date: Mon, 2 Sep 2024 19:55:56 +0900 Message-ID: <20240902105656.1383858-9-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w zstd compression. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 ++++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_zstd.c | 97 +++++++++++++++++++++++++++++++ drivers/block/zram/backend_zstd.h | 10 ++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 123 insertions(+) create mode 100644 drivers/block/zram/backend_zstd.c create mode 100644 drivers/block/zram/backend_zstd.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 0d890a8d2dc4..71cd0d5d8f35 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -32,6 +32,12 @@ config ZRAM_BACKEND_LZ4HC select LZ4HC_COMPRESS select LZ4_DECOMPRESS =20 +config ZRAM_BACKEND_ZSTD + bool "zstd compression support" + depends on ZRAM + select ZSTD_COMPRESS + select ZSTD_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -53,6 +59,10 @@ config ZRAM_DEF_COMP_LZ4HC bool "lz4hc" depends on ZRAM_BACKEND_LZ4HC =20 +config ZRAM_DEF_COMP_ZSTD + bool "zstd" + depends on ZRAM_BACKEND_ZSTD + endchoice =20 config ZRAM_DEF_COMP @@ -61,6 +71,7 @@ config ZRAM_DEF_COMP default "lzo" if ZRAM_DEF_COMP_LZO default "lz4" if ZRAM_DEF_COMP_LZ4 default "lz4hc" if ZRAM_DEF_COMP_LZ4HC + default "zstd" if ZRAM_DEF_COMP_ZSTD default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 727c9d68e3e3..a2ca227e199c 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -5,5 +5,6 @@ zram-y :=3D zcomp.o zram_drv.o zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o +zram-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c new file mode 100644 index 000000000000..abec68d1104b --- /dev/null +++ b/drivers/block/zram/backend_zstd.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "backend_zstd.h" + +struct zstd_ctx { + zstd_cctx *cctx; + zstd_dctx *dctx; + void *cctx_mem; + void *dctx_mem; + s32 level; +}; + +static void zstd_destroy(void *ctx) +{ + struct zstd_ctx *zctx =3D ctx; + + vfree(zctx->cctx_mem); + vfree(zctx->dctx_mem); + kfree(zctx); +} + +static void *zstd_create(void) +{ + zstd_parameters params; + struct zstd_ctx *ctx; + size_t sz; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + ctx->level =3D zstd_default_clevel(); + params =3D zstd_get_params(ctx->level, 0); + sz =3D zstd_cctx_workspace_bound(¶ms.cParams); + ctx->cctx_mem =3D vzalloc(sz); + if (!ctx->cctx_mem) + goto error; + + ctx->cctx =3D zstd_init_cctx(ctx->cctx_mem, sz); + if (!ctx->cctx) + goto error; + + sz =3D zstd_dctx_workspace_bound(); + ctx->dctx_mem =3D vzalloc(sz); + if (!ctx->dctx_mem) + goto error; + + ctx->dctx =3D zstd_init_dctx(ctx->dctx_mem, sz); + if (!ctx->dctx) + goto error; + + return ctx; + +error: + zstd_destroy(ctx); + return NULL; +} + +static int zstd_compress(void *ctx, const unsigned char *src, size_t src_l= en, + unsigned char *dst, size_t *dst_len) +{ + struct zstd_ctx *zctx =3D ctx; + const zstd_parameters params =3D zstd_get_params(zctx->level, 0); + size_t ret; + + ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, + src, src_len, ¶ms); + if (zstd_is_error(ret)) + return -EINVAL; + *dst_len =3D ret; + return 0; +} + +static int zstd_decompress(void *ctx, const unsigned char *src, size_t src= _len, + unsigned char *dst, size_t dst_len) +{ + struct zstd_ctx *zctx =3D ctx; + size_t ret; + + ret =3D zstd_decompress_dctx(zctx->dctx, dst, dst_len, src, src_len); + if (zstd_is_error(ret)) + return -EINVAL; + return 0; +} + +const struct zcomp_ops backend_zstd =3D { + .compress =3D zstd_compress, + .decompress =3D zstd_decompress, + .create_ctx =3D zstd_create, + .destroy_ctx =3D zstd_destroy, + .name =3D "zstd", +}; diff --git a/drivers/block/zram/backend_zstd.h b/drivers/block/zram/backend= _zstd.h new file mode 100644 index 000000000000..10fdfff1ec1c --- /dev/null +++ b/drivers/block/zram/backend_zstd.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_ZSTD_H__ +#define __BACKEND_ZSTD_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_zstd; + +#endif /* __BACKEND_ZSTD_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index a06cdb9aa567..07147659f4a2 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -16,6 +16,7 @@ #include "backend_lzorle.h" #include "backend_lz4.h" #include "backend_lz4hc.h" +#include "backend_zstd.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -27,6 +28,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4HC) &backend_lz4hc, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_ZSTD) + &backend_zstd, #endif NULL }; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 582761D47D7 for ; Mon, 2 Sep 2024 10:57:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274643; cv=none; b=FdRrz5h4xDn10QwiKYkG9eYMBiRzOOMBK+ajfM7C9vCdDn6ufYSt1noh8rhj3y5KeCVMB/Za9lK0VTUTjy6EYrdq/im17RHKCezfAOVmsMx39Ik5oTZQdiUSWr+r1jew+MjHD4LOSqrW9LjUTfg1GJLgrchXdei4iVKxVR5Kv0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274643; c=relaxed/simple; bh=k1hyP2VcgihNcu/8Cs5MExmkREcNlz1Z67cQXyzpGQQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rseyr+R2YIFQAoPqd01zpy4W2ugg7IklcJjAqSmQF1Ly0EAbEq+NbiESA2VWAXZ3aktS9y+j9UWrVRYmA1AfUfJ33VJYltTzQ3g8VvqkWBWYob4RRiobwJtd8C9i8rvD/JzSx63cBLzauMIiPljDwdn4haptl/j0CZQpz9h6cq8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=SGdy8gyb; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="SGdy8gyb" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-7148912a1ebso2243341b3a.0 for ; Mon, 02 Sep 2024 03:57:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274642; x=1725879442; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gI8x6epz+lgpTG+C2h8Uwi64WQ1pyqGDN7uhkigo9X4=; b=SGdy8gybAqvMnB1uU/MlDWxdLWvVhrpeH+Xk+fZ389iB+kKDhyvAa7ns6/QWYBDrvt 6Nef6+8CTxkQqB3js97jFj8rKTp1yky6yr+888fPKh7XvcJ8C7h7zfHfT2qtTuAAT4k5 WGB4juZOnUZdi0GZwMGqUwfeTANn+fk+78Iw4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274642; x=1725879442; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gI8x6epz+lgpTG+C2h8Uwi64WQ1pyqGDN7uhkigo9X4=; b=XDe3QPGyGB8Qc21UidvgzbPr8w5BeB8k0CB0kC8CYk3aL2w+j4vnRIcAW8PKbhdsSt lm5HLZoGReCm5QRmimwcYSYoV9OlOdBKsA6nv4KOSMxN8bpMK7ILR9qdwFXWdb26ho8n jR7htNGVlJidG9iP51bipWo3uM6r1r54h6YrlVCCnQzuOfFupUKEpJXcJhpxDjsKdxrR tW8zQqe60Cm2Q08fWejk4Bm4ZFhX8V0ojYl6H9WaSEPCMjXmeGLoyAtMwpwvfyu5NAj3 DxI+ciWtAakjgwU8RES3bG/14VYO2bKZJPs/AHiv8F3SuOJojuHbFUkby2RbHWKARdJB CqTg== X-Forwarded-Encrypted: i=1; AJvYcCVm6qi/YWE6Q5Pe/Rlwz+Nmvb73tri4RJGCpgeMFc9Wzl2bKxCEKcPdyzidhosjHGC/gITnB7amUWwQ6y8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+TciKGkHB1x8EQcZ3z52KQhnlWM/vJlQO7XAiFv1YpYgHteJ/ iSak+hl6SRIkOwksQbinBlIzKJJwJejYl7vzuTAKKoJ9RKiOsFADBH6Oz2DNBQ== X-Google-Smtp-Source: AGHT+IGLwRMX44IKlGt+H5gt3hkRaMplRKOvJumSxUrofE28iE/4nKwpJmCvLJa/H6R9+h0WwNtHuQ== X-Received: by 2002:a05:6a00:1905:b0:714:157a:bfc7 with SMTP id d2e1a72fcca58-7173c30b357mr7393343b3a.15.1725274641533; Mon, 02 Sep 2024 03:57:21 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:21 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 09/24] zram: pass estimated src size hint to zstd Date: Mon, 2 Sep 2024 19:55:57 +0900 Message-ID: <20240902105656.1383858-10-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" zram works with PAGE_SIZE buffers, so we always know exact size of the source buffer and hence can pass estimated_src_size to zstd_get_params(). This hint on x86_64, for example, reduces the size of the work memory buffer from 1303520 bytes down to 90080 bytes. Given that compression streams are per-CPU that's quite some memory saving. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_zstd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index abec68d1104b..310d970078e2 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -35,7 +35,7 @@ static void *zstd_create(void) return NULL; =20 ctx->level =3D zstd_default_clevel(); - params =3D zstd_get_params(ctx->level, 0); + params =3D zstd_get_params(ctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(¶ms.cParams); ctx->cctx_mem =3D vzalloc(sz); if (!ctx->cctx_mem) @@ -65,7 +65,7 @@ static int zstd_compress(void *ctx, const unsigned char *= src, size_t src_len, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; - const zstd_parameters params =3D zstd_get_params(zctx->level, 0); + const zstd_parameters params =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-oi1-f177.google.com (mail-oi1-f177.google.com [209.85.167.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F17D1D54D7 for ; Mon, 2 Sep 2024 10:57:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274645; cv=none; b=mu5m9dXiBrWfnBYKPJFzSp0Bg2VK2OVQ5NtSneOMx7gNfsp5hEg5lD6DocpStRWT1z18jJXQ7ePsIfTFH2EP7ixaZk09rzjGjvZ4wWLK3bmFA4Op62Uu75nPxbOnnkm+juqqzikRXE8LtGDhj06PdPNd26liqk6UrcFWO2XOyF4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274645; c=relaxed/simple; bh=mY2ifO4bMSFLFmvAVO6HWbTZO3xYelQWSsJavYFlLG8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ibuqDy4qMJWRWrcry3BdXpXkPY86Nn4+oZzvyRB+ey4esmC8S21ZSTp7fS+PHtlsgZd8w3dAi+Eev9dyt3QPS6H3FOFIpMPT4wBdpDmusrk04BzbkN1363XAUl5HbJQbQT4AGvEwNFG0f/ISqLEpvx4Ykxipcjuw3D2C7kfftTY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Yy1c2o4g; arc=none smtp.client-ip=209.85.167.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Yy1c2o4g" Received: by mail-oi1-f177.google.com with SMTP id 5614622812f47-3df07543ed5so2595442b6e.0 for ; Mon, 02 Sep 2024 03:57:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274643; x=1725879443; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XwWX1Com85t7hRNnEHQftgCUyxNiTHKrdsKE+AasBNU=; b=Yy1c2o4gLytS6vowdat3QVfikUisd2XRpqMO6gXIzMpZjDV1fD93Yh8SUZxVFqNd/b 4+TPAFG3+T3easxBt7DFtQer0LYdsfrEGTn2BE6QfFpLIRpHoXrWc7K4HTRHbHA54+MO 37LkoMIMx0lct1EPFYXc7KLEm10v50/cqeFE0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274643; x=1725879443; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XwWX1Com85t7hRNnEHQftgCUyxNiTHKrdsKE+AasBNU=; b=MmTvD7bmmwaVGFcpSStoFZwCvVs/ZtH+gujHJa6Nf6SQk70Zefi/Ku0Pg6RuhxBA07 LvEgQnmtq1cVhOtWfGsdP+tI0SsZc88s+wCUKkC3SwQ5HNRwXfkXIRrqBZJZDV6pKzgx qGP+CNtdBnJkE6rxZjlpnnKKl/MMUPDEUrYrk42jbra3/bYtRut6uvOiPSMky7cWh0Y1 SJUZl6FHGi4m13cVb9X2f3GTdZ04xvxzDcPAb46vKnAzPBWJXwvdsDFy0JZCXOesr6wH pW9j5GfzGVNYfQDtQ8dTeh+In1ootbDSFidDg6QMEUJDIpH7zmc9sSW2Pv/W8bX5msas Uemw== X-Forwarded-Encrypted: i=1; AJvYcCXIJuSRrrIglcRFgUzUqCO0pI2oQKSX1/2BRhIJjCHp+U860IbQ9kCxdBfhhkeI0RNtXgpNXEW12lSvbmI=@vger.kernel.org X-Gm-Message-State: AOJu0Yygl4TQ8eAWTBtOR2pHj0jFBj3KwdGu44SjF1POa//qqJtUBZQx SiMRSAtDo6E479AkQB6X6VNfnPaf0QyjU+mT+kHuTs4BYSQ02fQb6VD268GEqQ== X-Google-Smtp-Source: AGHT+IGXaQfAckIa/lLq+Fx+mTzjYpYjvB1ibk/Oohbz96tK7bKt6e1yVHkLtScvrtSsHVdfraGExA== X-Received: by 2002:a05:6871:7508:b0:25e:2208:6c8a with SMTP id 586e51a60fabf-277d032f04bmr7776353fac.4.1725274643443; Mon, 02 Sep 2024 03:57:23 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:23 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 10/24] zram: add zlib compression backend support Date: Mon, 2 Sep 2024 19:55:58 +0900 Message-ID: <20240902105656.1383858-11-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w zlib (inflate/deflate) compression. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 +++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_deflate.c | 132 +++++++++++++++++++++++++++ drivers/block/zram/backend_deflate.h | 10 ++ drivers/block/zram/zcomp.c | 4 + 5 files changed, 158 insertions(+) create mode 100644 drivers/block/zram/backend_deflate.c create mode 100644 drivers/block/zram/backend_deflate.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 71cd0d5d8f35..9dedd2edfb28 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -38,6 +38,12 @@ config ZRAM_BACKEND_ZSTD select ZSTD_COMPRESS select ZSTD_DECOMPRESS =20 +config ZRAM_BACKEND_DEFLATE + bool "deflate compression support" + depends on ZRAM + select ZLIB_DEFLATE + select ZLIB_INFLATE + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -63,6 +69,10 @@ config ZRAM_DEF_COMP_ZSTD bool "zstd" depends on ZRAM_BACKEND_ZSTD =20 +config ZRAM_DEF_COMP_DEFLATE + bool "deflate" + depends on ZRAM_BACKEND_DEFLATE + endchoice =20 config ZRAM_DEF_COMP @@ -72,6 +82,7 @@ config ZRAM_DEF_COMP default "lz4" if ZRAM_DEF_COMP_LZ4 default "lz4hc" if ZRAM_DEF_COMP_LZ4HC default "zstd" if ZRAM_DEF_COMP_ZSTD + default "deflate" if ZRAM_DEF_COMP_DEFLATE default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index a2ca227e199c..266430548437 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -6,5 +6,6 @@ zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o back= end_lzo.o zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o zram-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o +zram-$(CONFIG_ZRAM_BACKEND_DEFLATE) +=3D backend_deflate.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c new file mode 100644 index 000000000000..acefb86701b9 --- /dev/null +++ b/drivers/block/zram/backend_deflate.c @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "backend_deflate.h" + +/* Use the same value as crypto API */ +#define DEFLATE_DEF_WINBITS 11 +#define DEFLATE_DEF_MEMLEVEL MAX_MEM_LEVEL + +struct deflate_ctx { + struct z_stream_s cctx; + struct z_stream_s dctx; + s32 level; +}; + +static void deflate_destroy(void *ctx) +{ + struct deflate_ctx *zctx =3D ctx; + + if (zctx->cctx.workspace) { + zlib_deflateEnd(&zctx->cctx); + vfree(zctx->cctx.workspace); + } + if (zctx->dctx.workspace) { + zlib_inflateEnd(&zctx->dctx); + vfree(zctx->dctx.workspace); + } + kfree(zctx); +} + +static void *deflate_create(void) +{ + struct deflate_ctx *ctx; + size_t sz; + int ret; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + /* @FIXME: using a hardcoded Z_DEFAULT_COMPRESSION for now */ + ctx->level =3D Z_DEFAULT_COMPRESSION; + sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); + ctx->cctx.workspace =3D vzalloc(sz); + if (!ctx->cctx.workspace) + goto error; + + ret =3D zlib_deflateInit2(&ctx->cctx, ctx->level, Z_DEFLATED, + -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, + Z_DEFAULT_STRATEGY); + if (ret !=3D Z_OK) + goto error; + + sz =3D zlib_inflate_workspacesize(); + ctx->dctx.workspace =3D vzalloc(sz); + if (!ctx->dctx.workspace) + goto error; + + ret =3D zlib_inflateInit2(&ctx->dctx, -DEFLATE_DEF_WINBITS); + if (ret !=3D Z_OK) + goto error; + + return ctx; + +error: + deflate_destroy(ctx); + return NULL; +} + +static int deflate_compress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, + size_t *dst_len) +{ + struct deflate_ctx *zctx =3D ctx; + struct z_stream_s *deflate; + int ret; + + deflate =3D &zctx->cctx; + ret =3D zlib_deflateReset(deflate); + if (ret !=3D Z_OK) + return -EINVAL; + + deflate->next_in =3D (u8 *)src; + deflate->avail_in =3D src_len; + deflate->next_out =3D (u8 *)dst; + deflate->avail_out =3D *dst_len; + + ret =3D zlib_deflate(deflate, Z_FINISH); + if (ret !=3D Z_STREAM_END) + return -EINVAL; + + *dst_len =3D deflate->total_out; + return 0; +} + +static int deflate_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, + size_t dst_len) +{ + struct deflate_ctx *zctx =3D ctx; + struct z_stream_s *inflate; + int ret; + + inflate =3D &zctx->dctx; + + ret =3D zlib_inflateReset(inflate); + if (ret !=3D Z_OK) + return -EINVAL; + + inflate->next_in =3D (u8 *)src; + inflate->avail_in =3D src_len; + inflate->next_out =3D (u8 *)dst; + inflate->avail_out =3D dst_len; + + ret =3D zlib_inflate(inflate, Z_SYNC_FLUSH); + if (ret !=3D Z_STREAM_END) + return -EINVAL; + + return 0; +} + +const struct zcomp_ops backend_deflate =3D { + .compress =3D deflate_compress, + .decompress =3D deflate_decompress, + .create_ctx =3D deflate_create, + .destroy_ctx =3D deflate_destroy, + .name =3D "deflate", +}; diff --git a/drivers/block/zram/backend_deflate.h b/drivers/block/zram/back= end_deflate.h new file mode 100644 index 000000000000..a39ac12b114c --- /dev/null +++ b/drivers/block/zram/backend_deflate.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_DEFLATE_H__ +#define __BACKEND_DEFLATE_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_deflate; + +#endif /* __BACKEND_DEFLATE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 07147659f4a2..d1396fe82b1d 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -17,6 +17,7 @@ #include "backend_lz4.h" #include "backend_lz4hc.h" #include "backend_zstd.h" +#include "backend_deflate.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -31,6 +32,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_ZSTD) &backend_zstd, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_DEFLATE) + &backend_deflate, #endif NULL }; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-oo1-f48.google.com (mail-oo1-f48.google.com [209.85.161.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 991C61D54FA for ; Mon, 2 Sep 2024 10:57:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274648; cv=none; b=pZQaMYjfwUHcLyGnFgUHenjwX0tPO+G9jd7W8O1J8gVZ+V3STHdQUDDfaJBFvQyoMAUb7ClDq7WUpvRhFeGjhhkA8bn3AcAzb/jTkYNtW3oONX1sSPzjr1ByaOxl6cR7Xn3jg86RWD2zXWHL3YvRWrra6Vs+NXpQpRzF9nBwPA4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274648; c=relaxed/simple; bh=DcIDIGTvrV2sGaSp3l4cLIo9oC4TVIH+5tu9pj4z4eU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dVLIyW/2c8clu1VCT12YD0BmYZSUf4khzbFQHbHTYRzrM2bAF9m74fIKC3glaO3c3CnGOH8thdF/u9ZgkiDcMXO6Xn1dWW137TqIxiieZOfmdjI81SINQTUYI/hTCsXB7lTausCM4iHHQWGe4m2Q4DBn53ZddmzIHBqAQ5gmpv4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=YGYbjkCg; arc=none smtp.client-ip=209.85.161.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="YGYbjkCg" Received: by mail-oo1-f48.google.com with SMTP id 006d021491bc7-5dc93fa5639so2487598eaf.1 for ; Mon, 02 Sep 2024 03:57:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274645; x=1725879445; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IsasNKWMCfc0i969DWSee/nvVtCDDH3930dmqSc3da0=; b=YGYbjkCggj7coEwJWNl2JZaQQBmhMLmsP2eB7AJIytur/y4wHQEXUYPgxRiENJ8V72 9zaJEX7xshO0tsJF7AbOBpJSoAIsGy1b/hxeSnZJjVhGBcsb+xw/ebaFXLvJYMlP5EJC pJuLOUxclDZJ/L6Rbp+2bEa0I09Poa6ztOP+U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274645; x=1725879445; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IsasNKWMCfc0i969DWSee/nvVtCDDH3930dmqSc3da0=; b=FiwI/BMqH97Ldrg3x6xv0Fjyhx96YHdxncLsL+mXAkB3i0k+owWJGmlgLQdBCAsx8X EF79VamPTF9COg792yIyQfu+1keuTymHxxO3JEfVji9r9gZbdIpkm6eQoJZfeXSXYZJf Ufp23XomZyzLz9sm/2lKlTxRbpApgQKdoH8NRWFaXDnqCBBHlvjFpIMEzf2YiLjpKY7I 9fxxf4LpbH+0l4EGoelzyMu1nCgcIID9DBvYE0dAtNUpSbFr1+afM9AjJy5XEQf3R9Mh 1OMakTrTW8NlTqjw4Bkqf57MK2UHUovHoHXQ2/CDP8Ja+ep/fScwSrSdGxhu26TfqrJW EP0A== X-Forwarded-Encrypted: i=1; AJvYcCVdoUo9k0AhV3AFXezMT0nWpOXQwjpXEZRkOGrorIJikAWKCFmWHztO9pH7Go7UhyvpQ6EOwKnnkthF9ts=@vger.kernel.org X-Gm-Message-State: AOJu0YyJcbPxqdfg+P4YlfI6YFLQm8ClbNxlXK1h5PcXO5fstMMEZ0l/ zdjcJkPihNATRhgdzsXZ83TeP6EGk3fC57Xm1tTREmSA7uMti0SSTBSKMmn7rQ== X-Google-Smtp-Source: AGHT+IGUGfPHU8GUEsPz7sLM0j5yQqFJ8DslmyX1UZJK4n2N1BoC4Assh8H+Giampv/RNDcavNMiYQ== X-Received: by 2002:a05:6358:7e90:b0:1b5:c544:23a8 with SMTP id e5c5f4694b2df-1b7edb4ae07mr1035428055d.11.1725274645511; Mon, 02 Sep 2024 03:57:25 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:25 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 11/24] zram: add 842 compression backend support Date: Mon, 2 Sep 2024 19:55:59 +0900 Message-ID: <20240902105656.1383858-12-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w 842 compression support. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 ++++++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_842.c | 68 ++++++++++++++++++++++++++++++++ drivers/block/zram/backend_842.h | 10 +++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 94 insertions(+) create mode 100644 drivers/block/zram/backend_842.c create mode 100644 drivers/block/zram/backend_842.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 9dedd2edfb28..1e0e7e5910b8 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -44,6 +44,12 @@ config ZRAM_BACKEND_DEFLATE select ZLIB_DEFLATE select ZLIB_INFLATE =20 +config ZRAM_BACKEND_842 + bool "842 compression support" + depends on ZRAM + select 842_COMPRESS + select 842_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -73,6 +79,10 @@ config ZRAM_DEF_COMP_DEFLATE bool "deflate" depends on ZRAM_BACKEND_DEFLATE =20 +config ZRAM_DEF_COMP_842 + bool "842" + depends on ZRAM_BACKEND_842 + endchoice =20 config ZRAM_DEF_COMP @@ -83,6 +93,7 @@ config ZRAM_DEF_COMP default "lz4hc" if ZRAM_DEF_COMP_LZ4HC default "zstd" if ZRAM_DEF_COMP_ZSTD default "deflate" if ZRAM_DEF_COMP_DEFLATE + default "842" if ZRAM_DEF_COMP_842 default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 266430548437..0fdefd576691 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -7,5 +7,6 @@ zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o zram-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o zram-$(CONFIG_ZRAM_BACKEND_DEFLATE) +=3D backend_deflate.o +zram-$(CONFIG_ZRAM_BACKEND_842) +=3D backend_842.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c new file mode 100644 index 000000000000..005f3fcb9024 --- /dev/null +++ b/drivers/block/zram/backend_842.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "backend_842.h" + +struct sw842_ctx { + void *mem; +}; + +static void destroy_842(void *ctx) +{ + struct sw842_ctx *zctx =3D ctx; + + kfree(zctx->mem); + kfree(zctx); +} + +static void *create_842(void) +{ + struct sw842_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + ctx->mem =3D kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->mem) + goto error; + + return ctx; + +error: + destroy_842(ctx); + return NULL; +} + +static int compress_842(void *ctx, const unsigned char *src, size_t src_le= n, + unsigned char *dst, size_t *dst_len) +{ + struct sw842_ctx *zctx =3D ctx; + unsigned int dlen =3D *dst_len; + int ret; + + ret =3D sw842_compress(src, src_len, dst, &dlen, zctx->mem); + if (ret =3D=3D 0) + *dst_len =3D dlen; + return ret; +} + +static int decompress_842(void *ctx, const unsigned char *src, size_t src_= len, + unsigned char *dst, size_t dst_len) +{ + unsigned int dlen =3D dst_len; + + return sw842_decompress(src, src_len, dst, &dlen); +} + +const struct zcomp_ops backend_842 =3D { + .compress =3D compress_842, + .decompress =3D decompress_842, + .create_ctx =3D create_842, + .destroy_ctx =3D destroy_842, + .name =3D "842", +}; diff --git a/drivers/block/zram/backend_842.h b/drivers/block/zram/backend_= 842.h new file mode 100644 index 000000000000..4dc85c188799 --- /dev/null +++ b/drivers/block/zram/backend_842.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_842_H__ +#define __BACKEND_842_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_842; + +#endif /* __BACKEND_842_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index d1396fe82b1d..94e1c9503267 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -18,6 +18,7 @@ #include "backend_lz4hc.h" #include "backend_zstd.h" #include "backend_deflate.h" +#include "backend_842.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -35,6 +36,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_DEFLATE) &backend_deflate, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_842) + &backend_842, #endif NULL }; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 345481D6183 for ; Mon, 2 Sep 2024 10:57:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274649; cv=none; b=msMVIJd/ZKuv4ld+P/l2bP9M3Cj2LEY+YJxLkxAaFobrDkJW6RXiHM5MIobkQXvboznofXbHdv0SlwwUwt0q/xHYuHnXIOKqfASph7PoBi0HngEva5KyXdXFv1JIXD/vYAbRFKuurznQH8fRbw0wcfKb49k/vOaQkuFgBQSA4dk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274649; c=relaxed/simple; bh=y6oVPY95hI6wp4VX9zDxwmcLDQba2r1t2gOhqRyalgI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZPJqkQyhHeE77Bw2a3jEpwA4/Yf7YRhrU09lgdKfjjOT1qat4XxN88bEvZ8xdeeezA5gfvXR7Htt9nb3cSdqhM4aVU/d7swpZi9tA/d1VPDRmlcfQqKuBSNUCuC2akGOHtoMaSNKDwgxRsCexsygjgBIKNO91qShPIdQ1XmRKRs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=OjU/pEHE; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="OjU/pEHE" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7142e4dddbfso3220134b3a.0 for ; Mon, 02 Sep 2024 03:57:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274647; x=1725879447; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VVkEtaUOd/P2C4s98tzJPKsbzfPdZ+JthmVGTD72tXY=; b=OjU/pEHE99ZNLJfBmniiZ0Rv8jGqd9cI65P2A8ov3iASGgkugkv6sjj4l/CIvbEN/M 2h2qiGPcR8UJP5e0uZWOJUvw11dhG+XIXt7keHFd5hgBiJfendYxP4KrsmtakdyInswu r3jfFnUgYJd+Kyf+a8r2mHHdjFwJnJEVX62LY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274647; x=1725879447; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VVkEtaUOd/P2C4s98tzJPKsbzfPdZ+JthmVGTD72tXY=; b=cppBoyoDm7ukcMtWrZW5w8kIr0Ol7MqFceV2Es225q/gcfJxzW3w8YI1aIG8lGHD2R tRf5gVCOLRi7kpSKl77v0XveSt65DlY3gEDmw+dXy5/nbidrboPJYybfqj+MJOqi1AWZ Y4G6qbgIfnK0QTgOVPU90ZdtHMibfaHgzCWJjlMKwrOj3FLzepOOma5FVASbSplX6JAy F74khGicy+WLEPEQXRTt3rf4YGcF+jgaRUriB6ZHAFmUIYV15BlnTERIJMBeXT+YtI2z /8OUCe9kNgKYfpEPTcGqgIcWSrUoj+cWpd11zVFa3GKWT8oIIdp3lMXkxttI1g4vUo5G O8Ng== X-Forwarded-Encrypted: i=1; AJvYcCWfIIPXe0jCyaOseSiXhFnkjRUzqAJrMHdcAimY/Bp0wKlR36cE3VK06FS+XMf9iGVVBMaTlZEBjZKQ3Rw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+FtXnuG0141RMAHah63ryOvQizCUTS2BJAE6EWTl7anpyuSS0 o1rtU3GPBuu3w9JW3jeFmPdk3PZ3hqw+7wiDpSd3lhhcCpBUKJbiXJqqdF2arw== X-Google-Smtp-Source: AGHT+IFNmfeHi1XlA7HPam38xO45YdgPVufNvpyIcGqlL7D9BOq5m7yQC7SM9L4RPus9T5UB2frDEQ== X-Received: by 2002:a05:6a00:853:b0:710:7efe:a870 with SMTP id d2e1a72fcca58-717449b2017mr5621187b3a.19.1725274647376; Mon, 02 Sep 2024 03:57:27 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:27 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 12/24] zram: check that backends array has at least one backend Date: Mon, 2 Sep 2024 19:56:00 +0900 Message-ID: <20240902105656.1383858-13-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make sure that backends array has anything apart from the sentinel NULL value. We also select LZO_BACKEND if none backends were selected. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 19 +++++++++++++------ drivers/block/zram/zcomp.c | 8 ++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 1e0e7e5910b8..6aea609b795c 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -14,12 +14,6 @@ config ZRAM =20 See Documentation/admin-guide/blockdev/zram.rst for more information. =20 -config ZRAM_BACKEND_LZO - bool "lzo and lzo-rle compression support" - depends on ZRAM - select LZO_COMPRESS - select LZO_DECOMPRESS - config ZRAM_BACKEND_LZ4 bool "lz4 compression support" depends on ZRAM @@ -50,6 +44,19 @@ config ZRAM_BACKEND_842 select 842_COMPRESS select 842_DECOMPRESS =20 +config ZRAM_BACKEND_FORCE_LZO + depends on ZRAM + def_bool !ZRAM_BACKEND_LZ4 && !ZRAM_BACKEND_LZ4HC && \ + !ZRAM_BACKEND_ZSTD && !ZRAM_BACKEND_DEFLATE && \ + !ZRAM_BACKEND_842 + +config ZRAM_BACKEND_LZO + bool "lzo and lzo-rle compression support" if !ZRAM_BACKEND_FORCE_LZO + depends on ZRAM + default ZRAM_BACKEND_FORCE_LZO + select LZO_COMPRESS + select LZO_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 94e1c9503267..76d21ee77067 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -192,6 +192,14 @@ struct zcomp *zcomp_create(const char *alg) struct zcomp *comp; int error; =20 + /* + * The backends array has a sentinel NULL value, so the minimum + * size is 1. In order to be valid the array, apart from the + * sentinel NULL element, should have at least one compression + * backend selected. + */ + BUILD_BUG_ON(ARRAY_SIZE(backends) <=3D 1); + comp =3D kzalloc(sizeof(struct zcomp), GFP_KERNEL); if (!comp) return ERR_PTR(-ENOMEM); --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D8731D61A9 for ; Mon, 2 Sep 2024 10:57:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274651; cv=none; b=nZ4ebo519rf7bq1BZ8u5KOcLAFBZmZUngxGna5jXCzhfAajAns13KtE7gP0ciHxq+u7PnD/fkQ0l6Oq1NJo+VNB/Yfz0OSVL7yFXMOKqQtPysDD/0nVmYwflqNqjF7w6i+9NK3ra3pb3Tw3WDuhjeo59uk/DfISWn/h+h/9y6i4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274651; c=relaxed/simple; bh=s3IVPfFMdkND1AEwLV0FaRuZwm3T0qKrhWFZCRM7XUU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B9ybUkAPM3U+wjmcgBMCmCXky07b+pjDsyRUjML1mb/LZSR7HZpHtYKV34sVmtae7HZ/DZrCb7ehtFAe3Trv+QOkIytCrq6TRgFPAyp9qjVYco0yFVSSd3sSE56a5jARUaTLXWfuJsp4TwmSsqqfVlE2kswiQGWZkdetTkdMrAM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Q8ocZP22; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Q8ocZP22" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-714187df604so2966894b3a.1 for ; Mon, 02 Sep 2024 03:57:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274649; x=1725879449; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FgAZg7cPu35vguBTSnm2Ya/QMkRWvLoDIJi9R3Xc2U4=; b=Q8ocZP229T08WuwQjTxWj1hs7JF7x5Lz18TH/8V1rZAFeaZCx/Yf6EDieg/rMPLvOC kLkSiQJ6rucDFsbusHUskirjVBjxG9IcA+5ptXvcvVPVMfkvymYdANSakAnRFYCFBKvc 0h3UsImcwYPEtZ0gGJHfNUgNaWut7hL/EFVFY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274649; x=1725879449; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FgAZg7cPu35vguBTSnm2Ya/QMkRWvLoDIJi9R3Xc2U4=; b=Md40UPdKfP6er3+nDGUNZKH4WZOaK7db6d24MaP8TZ2FmsI3aCfhBwdx0qjKtCNO5Z L71e9nn39pGjC051UhQaqRlwQbIhBu8hevWrUS2j2KF8m6f6zCn96OIY81V+i2LiKakt qwuzFDnLYAOZZxp+k3TrfvOwQX1axWufz4R+dPmzVi+rIuYWFsURviPRzmHRn5/DT4O8 32Ggd0bky5S1Tf2iboH+Vhp3aHd5scgk11jJG93AyUeSVLt3xyG5+OfoWPgqo04bRfMa 4LsW9kksA60KmzFfq6kpH+k8LADRvt9ih24imi3clLoxLG5LvSstH5WGYdXZ5ylKZQX3 Dupg== X-Forwarded-Encrypted: i=1; AJvYcCVD19t0XrANu/n0YbX3JiZ/FfyP9qKiRwkSMVcgLLk1TaKJX4lG0WPqFw/7U64/gokBmcwU+jCKliazob0=@vger.kernel.org X-Gm-Message-State: AOJu0YxKK3FtV7Ji8uUDNoNtnzQEQULhwM9ZstqlHnlyHFA7zQuV28VL npf91l4Hpdjoqoj5ny/UXqr57G64YDzNjCA3dlA2rsFilxvpAFEo28lU/fGL+GNfiIk8XlBbQtr DjA== X-Google-Smtp-Source: AGHT+IHN5SWs7BAEX+t81E5ioGZ+1VPkUOgR9yAh0+HINlcCBFsng6bXsKXaCBca1vLL6TstoTAXDw== X-Received: by 2002:a05:6a21:a247:b0:1ca:ccd0:1bdb with SMTP id adf61e73a8af0-1ccee864558mr17225269637.20.1725274649462; Mon, 02 Sep 2024 03:57:29 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:29 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 13/24] zram: introduce zcomp_params structure Date: Mon, 2 Sep 2024 19:56:01 +0900 Message-ID: <20240902105656.1383858-14-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We will store a per-algorithm parameters there (compression level, dictionary, dictionary size, etc.). Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 2 +- drivers/block/zram/backend_deflate.c | 9 ++++++--- drivers/block/zram/backend_lz4.c | 9 ++++++--- drivers/block/zram/backend_lz4hc.c | 9 ++++++--- drivers/block/zram/backend_lzo.c | 2 +- drivers/block/zram/backend_lzorle.c | 2 +- drivers/block/zram/backend_zstd.c | 18 +++++++++++------- drivers/block/zram/zcomp.c | 5 +++-- drivers/block/zram/zcomp.h | 14 ++++++++++++-- drivers/block/zram/zram_drv.c | 20 +++++++++++++++++++- drivers/block/zram/zram_drv.h | 1 + 11 files changed, 67 insertions(+), 24 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 005f3fcb9024..e14dba30b0a2 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -19,7 +19,7 @@ static void destroy_842(void *ctx) kfree(zctx); } =20 -static void *create_842(void) +static void *create_842(struct zcomp_params *params) { struct sw842_ctx *ctx; =20 diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index acefb86701b9..ec662ce46897 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -32,7 +32,7 @@ static void deflate_destroy(void *ctx) kfree(zctx); } =20 -static void *deflate_create(void) +static void *deflate_create(struct zcomp_params *params) { struct deflate_ctx *ctx; size_t sz; @@ -42,8 +42,11 @@ static void *deflate_create(void) if (!ctx) return NULL; =20 - /* @FIXME: using a hardcoded Z_DEFAULT_COMPRESSION for now */ - ctx->level =3D Z_DEFAULT_COMPRESSION; + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D Z_DEFAULT_COMPRESSION; + sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); ctx->cctx.workspace =3D vzalloc(sz); if (!ctx->cctx.workspace) diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index c1d19fed5af2..ec57b5acbd39 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -18,7 +18,7 @@ static void lz4_destroy(void *ctx) kfree(zctx); } =20 -static void *lz4_create(void) +static void *lz4_create(struct zcomp_params *params) { struct lz4_ctx *ctx; =20 @@ -26,8 +26,11 @@ static void *lz4_create(void) if (!ctx) return NULL; =20 - /* @FIXME: using a hardcoded LZ4_ACCELERATION_DEFAULT for now */ - ctx->level =3D LZ4_ACCELERATION_DEFAULT; + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D LZ4_ACCELERATION_DEFAULT; + ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); if (!ctx->mem) goto error; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 536f7a0073c4..80733fead595 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -18,7 +18,7 @@ static void lz4hc_destroy(void *ctx) kfree(zctx); } =20 -static void *lz4hc_create(void) +static void *lz4hc_create(struct zcomp_params *params) { struct lz4hc_ctx *ctx; =20 @@ -26,8 +26,11 @@ static void *lz4hc_create(void) if (!ctx) return NULL; =20 - /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ - ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); if (!ctx->mem) goto error; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 4c9e611f6c03..8e4aabd04bf3 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -6,7 +6,7 @@ =20 #include "backend_lzo.h" =20 -static void *lzo_create(void) +static void *lzo_create(struct zcomp_params *params) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); } diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index 19a9ce132046..cb01eb8b04f4 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -6,7 +6,7 @@ =20 #include "backend_lzorle.h" =20 -static void *lzorle_create(void) +static void *lzorle_create(struct zcomp_params *params) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); } diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 310d970078e2..c356c5e6e503 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -24,9 +24,9 @@ static void zstd_destroy(void *ctx) kfree(zctx); } =20 -static void *zstd_create(void) +static void *zstd_create(struct zcomp_params *params) { - zstd_parameters params; + zstd_parameters prm; struct zstd_ctx *ctx; size_t sz; =20 @@ -34,9 +34,13 @@ static void *zstd_create(void) if (!ctx) return NULL; =20 - ctx->level =3D zstd_default_clevel(); - params =3D zstd_get_params(ctx->level, PAGE_SIZE); - sz =3D zstd_cctx_workspace_bound(¶ms.cParams); + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D zstd_default_clevel(); + + prm =3D zstd_get_params(ctx->level, PAGE_SIZE); + sz =3D zstd_cctx_workspace_bound(&prm.cParams); ctx->cctx_mem =3D vzalloc(sz); if (!ctx->cctx_mem) goto error; @@ -65,11 +69,11 @@ static int zstd_compress(void *ctx, const unsigned char= *src, size_t src_len, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; - const zstd_parameters params =3D zstd_get_params(zctx->level, PAGE_SIZE); + const zstd_parameters prm =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, - src, src_len, ¶ms); + src, src_len, &prm); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 76d21ee77067..173ee2b79442 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -54,7 +54,7 @@ static void zcomp_strm_free(struct zcomp *comp, struct zc= omp_strm *zstrm) =20 static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) { - zstrm->ctx =3D comp->ops->create_ctx(); + zstrm->ctx =3D comp->ops->create_ctx(comp->params); =20 /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the @@ -187,7 +187,7 @@ void zcomp_destroy(struct zcomp *comp) kfree(comp); } =20 -struct zcomp *zcomp_create(const char *alg) +struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params) { struct zcomp *comp; int error; @@ -204,6 +204,7 @@ struct zcomp *zcomp_create(const char *alg) if (!comp) return ERR_PTR(-ENOMEM); =20 + comp->params =3D params; comp->ops =3D lookup_backend_ops(alg); if (!comp->ops) { kfree(comp); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index e5eb5ec4c645..217a750fa908 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -2,8 +2,17 @@ =20 #ifndef _ZCOMP_H_ #define _ZCOMP_H_ + #include =20 +#define ZCOMP_PARAM_NO_LEVEL INT_MIN + +struct zcomp_params { + void *dict; + size_t dict_sz; + s32 level; +}; + struct zcomp_strm { /* The members ->buffer and ->tfm are protected by ->lock. */ local_lock_t lock; @@ -19,7 +28,7 @@ struct zcomp_ops { int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, unsigned char *dst, size_t dst_len); =20 - void *(*create_ctx)(void); + void *(*create_ctx)(struct zcomp_params *params); void (*destroy_ctx)(void *ctx); =20 const char *name; @@ -29,6 +38,7 @@ struct zcomp_ops { struct zcomp { struct zcomp_strm __percpu *stream; const struct zcomp_ops *ops; + struct zcomp_params *params; struct hlist_node node; }; =20 @@ -37,7 +47,7 @@ int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *n= ode); ssize_t zcomp_available_show(const char *comp, char *buf); bool zcomp_available_algorithm(const char *comp); =20 -struct zcomp *zcomp_create(const char *alg); +struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params); void zcomp_destroy(struct zcomp *comp); =20 struct zcomp_strm *zcomp_stream_get(struct zcomp *comp); diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 93042da8ccdf..ff6724bbdf91 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1979,6 +1979,20 @@ static void zram_slot_free_notify(struct block_devic= e *bdev, zram_slot_unlock(zram, index); } =20 +static void zram_comp_params_reset(struct zram *zram) +{ + u32 prio; + + for (prio =3D ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++) { + struct zcomp_params *params =3D &zram->params[prio]; + + vfree(params->dict); + params->level =3D ZCOMP_PARAM_NO_LEVEL; + params->dict_sz =3D 0; + params->dict =3D NULL; + } +} + static void zram_destroy_comps(struct zram *zram) { u32 prio; @@ -1992,6 +2006,8 @@ static void zram_destroy_comps(struct zram *zram) zcomp_destroy(comp); zram->num_active_comps--; } + + zram_comp_params_reset(zram); } =20 static void zram_reset_device(struct zram *zram) @@ -2049,7 +2065,8 @@ static ssize_t disksize_store(struct device *dev, if (!zram->comp_algs[prio]) continue; =20 - comp =3D zcomp_create(zram->comp_algs[prio]); + comp =3D zcomp_create(zram->comp_algs[prio], + &zram->params[prio]); if (IS_ERR(comp)) { pr_err("Cannot initialise %s compressing backend\n", zram->comp_algs[prio]); @@ -2254,6 +2271,7 @@ static int zram_add(void) if (ret) goto out_cleanup_disk; =20 + zram_comp_params_reset(zram); comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor); =20 zram_debugfs_register(zram); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 35e322144629..b976824ead67 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -107,6 +107,7 @@ struct zram { struct zram_table_entry *table; struct zs_pool *mem_pool; struct zcomp *comps[ZRAM_MAX_COMPS]; + struct zcomp_params params[ZRAM_MAX_COMPS]; struct gendisk *disk; /* Prevent concurrent execution of device init */ struct rw_semaphore init_lock; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 340A11D6183 for ; Mon, 2 Sep 2024 10:57:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274654; cv=none; b=djbIHnMmBv5I7WY0Mmi1oKMtXNa324S/NEcuBIQuamtkWzg7TY2S78kgJx7yRl5bHnhZ6Q10bHJThQrgyR0AH8iphfgWsxaZuVZOPNPDpbSCo8onol7+2ycBXnQHhwHtp9yLxO6g5LfgvMgrrDwbOkhXXASnLC6jS6V6ndJpzvw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274654; c=relaxed/simple; bh=L/UuHbCK3F3NwpKzUUx6HZtiZwhVDs26MzzMCuiANow=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oRq4vtP1B/N/ExAt6ii7RFMZyG7Q8oq+A1C+7lwz4Ah6+mlLMQc0xIVGjIOc6cEpePZioGSUAq37rEy4H1MPUjuWOsj16YF8am/macLZiskc5lYVAh90pLt/kk719C44bpm5qswqvsU8eeYINerQ+1jI+KeYn0Dcdfdar8Jv7VA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=KEHGRYyS; arc=none smtp.client-ip=209.85.210.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="KEHGRYyS" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-7142a30e3bdso3680390b3a.0 for ; Mon, 02 Sep 2024 03:57:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274651; x=1725879451; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dcwfn8M4A82GSXxq9cNv/IUP8NdY2Oxfvj5IFWYeDkc=; b=KEHGRYySjw0De3FrZu/ouvxCG+CsBBb3HKKW7EFPVzisN2P+Ffzvf8IQFqH/yIU2/p AKVvVWuXK2G00GHzA2gseUYMNzfT+T6S8Z/1eu4ZWYAzUxySK+h+iZEEsdP8Tk60Q4sg RlN1lEXsC4b1c6NmD0wtelAw+jViej5l/Rr48= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274651; x=1725879451; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dcwfn8M4A82GSXxq9cNv/IUP8NdY2Oxfvj5IFWYeDkc=; b=lmI1GW1otqTjksSx7DOAu3qDjnu3ufRKzwrTotrkGC9c2rahzsXx92LqsSN8Tc1mDR ZKTESzobe8PtFNMy4kUh322n2gqAnwQGt3ddxvl1tFx/Syq+hjHWEeC+OeDuO7ydPC8E 1FvX/1pM1iEWTf5a6MhObtmyIh2+A6GRfL1n9aT7ZPjOaMHygMJ1sjYaorCNPnP4V0hY YRPjaFvMncV3Mv6XqVt/nOUgnZqxSfxU+TVEwR85wjfdbRhiEUoagcjIhnl5RIMsYyvZ EitNZbr4luMC+5zUxQkFzxiYJ1amnZEWjqmqIBoO1xtVZ0KSita02EBHmSyxSY0SpynO lc3Q== X-Forwarded-Encrypted: i=1; AJvYcCUczu0zrSzNn8NMCqcQiBCRDF1LsHnR9SzdTZoHxF+QSP63NhYr99VZ6GlfHhStgbfENfHEZzCMMGRMWkg=@vger.kernel.org X-Gm-Message-State: AOJu0YxrR33tesCJ3pK87zD4NwKSAS2fBy+y6LHyHWNC6uyvDPYWBV3C jMkDL+M4H2hPUwognH/NL60P22sBj2l1TAj15eGqXoInTFcFa9R0X7DcXyP/BA== X-Google-Smtp-Source: AGHT+IHeWtca78/mNUevUcUqEQ+cli22gJmFHjJFqPd1ZpmfdWezc7WEICHeiYI53M2UHfA+r97LqQ== X-Received: by 2002:a05:6a20:2d94:b0:1ce:e8ef:1d76 with SMTP id adf61e73a8af0-1cee8ef2019mr3684606637.2.1725274651568; Mon, 02 Sep 2024 03:57:31 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:31 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 14/24] zram: recalculate zstd compression params once Date: Mon, 2 Sep 2024 19:56:02 +0900 Message-ID: <20240902105656.1383858-15-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" zstd compression params depends on level, but are constant for a given instance of zstd compression backend. Calculate once (during ctx creation). Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_zstd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index c356c5e6e503..7c6798f0c912 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -10,6 +10,7 @@ struct zstd_ctx { zstd_cctx *cctx; zstd_dctx *dctx; + zstd_parameters cprm; void *cctx_mem; void *dctx_mem; s32 level; @@ -40,6 +41,7 @@ static void *zstd_create(struct zcomp_params *params) ctx->level =3D zstd_default_clevel(); =20 prm =3D zstd_get_params(ctx->level, PAGE_SIZE); + ctx->cprm =3D zstd_get_params(ctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(&prm.cParams); ctx->cctx_mem =3D vzalloc(sz); if (!ctx->cctx_mem) @@ -69,11 +71,10 @@ static int zstd_compress(void *ctx, const unsigned char= *src, size_t src_len, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; - const zstd_parameters prm =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, - src, src_len, &prm); + src, src_len, &zctx->cprm); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-oa1-f53.google.com (mail-oa1-f53.google.com [209.85.160.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 901CF1D6791 for ; Mon, 2 Sep 2024 10:57:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274656; cv=none; b=kgW62aVrJoWyjRr26uZLPBCaeZMIj9Ln049AGA8O7d67spYmaXpgBDOIT53gVOy9T8F8SEAhTPTL4nph2/KadWVC5C7lmgjEqrlfTAOFGHMly/GSxkE5R47qwXuRwVQeHqc1tyGYJoM+umwYKPnzMwRjc8btLfLbSFVMBhChi/E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274656; c=relaxed/simple; bh=vkW6uTgUYKV+aE/4isDqR5FvHAChmg3UGNULzA70Qus=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Pmc92vy8Ea6B9EEiboi67LI2J4wKgQnhDVQZG2Z1lUGa6oHbt6R5aHEbvp9T56MVqUSJi1AKu2x2/F/SkabXS//WptstJj1ZLm6pN5y6PVyvSEwhwRwuga7n6VhBPHVICSFHYwrvDjv5GxgXZ8I4L+368XQDEIGwkCz82HTSYMU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=GSsXqGY8; arc=none smtp.client-ip=209.85.160.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="GSsXqGY8" Received: by mail-oa1-f53.google.com with SMTP id 586e51a60fabf-277f35c01f5so409130fac.0 for ; Mon, 02 Sep 2024 03:57:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274653; x=1725879453; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=P8WuMXTJ73w4rlQxvTYXaVgMatgUypxFNO55TkDJ0XM=; b=GSsXqGY8Y/HqEBD/rnuY4nu8nD8TTkUASs2bBBHdcgUy3501PG7ocemhElG0HpcMRv jhWOtKGufZwZE4u1Q++2wE6nHgco6je7Kzr9rG9TrMMsgmAV1cSrKxcNDovM8THTm6gb MO7xplnWD4RiMFfhhBZ5u2Z8wG2VzDYL53VQc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274653; x=1725879453; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P8WuMXTJ73w4rlQxvTYXaVgMatgUypxFNO55TkDJ0XM=; b=dpMkFnva1XjLkJAcbujR8e2qvDIpJpmmrl+dme5Z+uQJzXbkY9wfgALAo5WKSBjmJB P8KGFN4VdedUy8vINnQ0I4wJoLV29OhGMdprUmLYi9QMYpIGVLQi/RghiOg11v/B3pIw ncjgWZV7i30vJQqBIcwHAiTnxjcLn7WEkTrb4alWQDThJsID24e28ebGyZhCN4uxOoeG 52kAONSrw/dSkiuilXNH2WujFE1NQHB1FVkxT2wahhlCN02In9ykrh072XTTf8tW9i+2 ctpx+cAgbnJI5jXhgI9bv42J0dbODGUFax/GiOhpGx+uF/s+Ws2w599HYccLk5DqwyFi LRKg== X-Forwarded-Encrypted: i=1; AJvYcCXb/nSQeHG+VXBsILztCM3CQapwOGdj35EZC+4U1OdHn3jfn4T4XtFT/Sf4S1pYszb1Cvml8vsbdXvDyw0=@vger.kernel.org X-Gm-Message-State: AOJu0YxlA0einNayE2RrD5adt+ZTorTPcc2/3lfrkL+4Jy3056cTA4RZ dRGd32eICXFAFem0qXEnhf2yh+nrebiT3SI7dn6hRLHTOQbFY0Lpy5JQmHex8MifA8VYYaTgqMB IuA== X-Google-Smtp-Source: AGHT+IHSd6z/TgqX8/BSy59Q22d2r4sVfXIcr4hZ42pK33ZLW6K3laAbvyHjVWmUIX2KgYdEeJknFA== X-Received: by 2002:a05:6871:e485:b0:278:747:a449 with SMTP id 586e51a60fabf-2780747a5famr784970fac.19.1725274653641; Mon, 02 Sep 2024 03:57:33 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:33 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 15/24] zram: introduce algorithm_params device attribute Date: Mon, 2 Sep 2024 19:56:03 +0900 Message-ID: <20240902105656.1383858-16-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This attribute is used to setup compression algorithms' parameters, so we can tweak algorithms' characteristics. At this point only 'level' is supported (to be extended in the future). Each call sets up parameters for one particular algorithm, which should be specified either by the algorithm's priority or algo name. This is expected to be called after corresponding algorithm is selected via comp_algorithm or recomp_algorithm. echo "priority=3D0 level=3D1" > /sys/block/zram0/algorithm_params or echo "algo=3Dzstd level=3D1" > /sys/block/zram0/algorithm_params Signed-off-by: Sergey Senozhatsky --- Documentation/ABI/testing/sysfs-block-zram | 7 +++ Documentation/admin-guide/blockdev/zram.rst | 1 + drivers/block/zram/zram_drv.c | 68 +++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block-zram b/Documentation/ABI= /testing/sysfs-block-zram index 628a00fb20a9..1ef69e0271f9 100644 --- a/Documentation/ABI/testing/sysfs-block-zram +++ b/Documentation/ABI/testing/sysfs-block-zram @@ -151,3 +151,10 @@ Contact: Sergey Senozhatsky Description: The recompress file is write-only and triggers re-compression with secondary compression algorithms. + +What: /sys/block/zram/algorithm_params +Date: August 2024 +Contact: Sergey Senozhatsky +Description: + The algorithm_params file is write-only and is used to setup + compression algorithm parameters. diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 181d55d64326..96d81dc12528 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -198,6 +198,7 @@ writeback_limit_enable RW show and set writeback_limit= feature max_comp_streams RW the number of possible concurrent compress operations comp_algorithm RW show and change the compression algorithm +algorithm_params WO setup compression algorithm parameters compact WO trigger memory compaction debug_stat RO this file is used for zram debugging purposes backing_dev RW set up backend storage for zram to write out diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index ff6724bbdf91..e29e952b99c3 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -998,6 +998,72 @@ static int __comp_algorithm_store(struct zram *zram, u= 32 prio, const char *buf) return 0; } =20 +static int comp_params_store(struct zram *zram, u32 prio, s32 level) +{ + zram->params[prio].level =3D level; + return 0; +} + +static ssize_t algorithm_params_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + s32 prio =3D ZRAM_PRIMARY_COMP, level =3D ZCOMP_PARAM_NO_LEVEL; + char *args, *param, *val, *algo =3D NULL; + struct zram *zram =3D dev_to_zram(dev); + int ret; + + args =3D skip_spaces(buf); + while (*args) { + args =3D next_arg(args, ¶m, &val); + + if (!val || !*val) + return -EINVAL; + + if (!strcmp(param, "priority")) { + ret =3D kstrtoint(val, 10, &prio); + if (ret) + return ret; + continue; + } + + if (!strcmp(param, "level")) { + ret =3D kstrtoint(val, 10, &level); + if (ret) + return ret; + continue; + } + + if (!strcmp(param, "algo")) { + algo =3D val; + continue; + } + } + + /* Lookup priority by algorithm name */ + if (algo) { + s32 p; + + prio =3D -EINVAL; + for (p =3D ZRAM_PRIMARY_COMP; p < ZRAM_MAX_COMPS; p++) { + if (!zram->comp_algs[p]) + continue; + + if (!strcmp(zram->comp_algs[p], algo)) { + prio =3D p; + break; + } + } + } + + if (prio < ZRAM_PRIMARY_COMP || prio >=3D ZRAM_MAX_COMPS) + return -EINVAL; + + ret =3D comp_params_store(zram, prio, level); + return ret ? ret : len; +} + static ssize_t comp_algorithm_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -2169,6 +2235,7 @@ static DEVICE_ATTR_RW(writeback_limit_enable); static DEVICE_ATTR_RW(recomp_algorithm); static DEVICE_ATTR_WO(recompress); #endif +static DEVICE_ATTR_WO(algorithm_params); =20 static struct attribute *zram_disk_attrs[] =3D { &dev_attr_disksize.attr, @@ -2196,6 +2263,7 @@ static struct attribute *zram_disk_attrs[] =3D { &dev_attr_recomp_algorithm.attr, &dev_attr_recompress.attr, #endif + &dev_attr_algorithm_params.attr, NULL, }; =20 --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B3901D67AB for ; Mon, 2 Sep 2024 10:57:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274658; cv=none; b=WYkSIxgaFIhMh2sA78lwAkdvQvV/pWA18hvQdhuINen57/Gn3dvw6dLTBw6mYE4Vlf27CZiunD/3SavX+7U+WMC1pqs8y/M7K6ARYVtqs4vNtkK8bElc09Dmwu71OPQmYOVc5kF9iznOhYui9K692zVVwUqr5v8YdC1c9QSkdHw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274658; c=relaxed/simple; bh=8WtHrsnbFQmPWFujXtrgyDTDVYrmx4nurcHWm7bU060=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DhWvT65KYv4h3b6rU2kxkX9hd4WaVSoPCuZXjvS8zTDWOn+4XKkUYu+GNRo/Jp+E8ZRvAoEU6v9NNrgXKa73pXKBfNfoKo1tCDB+Z7iCXvxFDjx1uvHvqOirTJRt6Jeeav9ryq+oz35ZrRIA2jDhOM3K9NqdO+D1ewJh7krWi4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=EwFE8vwH; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="EwFE8vwH" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-715c160e231so3535092b3a.0 for ; Mon, 02 Sep 2024 03:57:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274656; x=1725879456; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nfEDHPmZ2pcmwcESiSv53E6iZyI1iE5jEnAbodimKt0=; b=EwFE8vwHY9LpWUOX1WPUrl3IuH1DoC4HoIYTvL1rHH1LABIOJE3yvLk6/TBbUAPDDG AM1eBNP0N7o1NB+mDX25qLkevWF7mC4He6yuQJngscqSNaKHwv2csFeOTXmtI7x7azNW gyU71cNMqUg8dj6mS6f6sxy8nNstUnYqNWlhs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274656; x=1725879456; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nfEDHPmZ2pcmwcESiSv53E6iZyI1iE5jEnAbodimKt0=; b=Zy7cZFRw7POryCc0uDcM8O0WpYWfUkl4G7vabmrA7/SG3/wXyBhVF5JBri3ywxg/L4 sOdR0mSzHz+BcR4wcEosKEyggC8EeWPjjZ8HX0aYOtrzYO7jEqOyNskr0NLenIF8L8SH hl+SvWrb3q4fcjelwt4Cv91V7JtWPBmcvah/euX6OJb8EsUgnbPB92lZCHEGSMSsHx4j PG8M6LumxWyF6V/U1KgeTWnRkSyTwZtztXAUQaU9Bu9GFqg5M2qs/l5ficcWxr7tZk5s IQx3gIB5prSsdWZKT7n1Mt4LkK2QDfU7B1hTPfb6QicX+ZSnAwzez9JtWTPAKDspcx+r 7Hbg== X-Forwarded-Encrypted: i=1; AJvYcCWxVFq6RCiDLkazZ9xiISZ9L8V2hCk+VNq9wT4uXeclggEJ7Ko7Ut+RlQvf0mMlWRlI/L/mlDFvbl4HHz0=@vger.kernel.org X-Gm-Message-State: AOJu0Yx1Vp+jWFRkDx+68dHAEGBCAVd+j7P33BiQg0iKAE5x+NyIDw6w 4Qlivux3Hvq/fpeWKF6rgFwW7gcyyj6Bc5vSU4QTYpdLOOEsnBpMz+4dlvkSEg== X-Google-Smtp-Source: AGHT+IEodxeI5lCTvNlwudlkSGJXz7KlF2dLLOF7bAhwq+hvT95QArnZQ5SklUf9vLr62qvKFS5VLg== X-Received: by 2002:a05:6a00:9444:b0:70d:2a88:a486 with SMTP id d2e1a72fcca58-715dfcf40a7mr13805376b3a.29.1725274655871; Mon, 02 Sep 2024 03:57:35 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:35 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 16/24] zram: add support for dict comp config Date: Mon, 2 Sep 2024 19:56:04 +0900 Message-ID: <20240902105656.1383858-17-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Handle dict=3Dpath algorithm param so that we can read a pre-trained compression algorithm dictionary which we then pass to the backend configuration. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 45 ++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index e29e952b99c3..9b29f9e6cb50 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -33,6 +33,7 @@ #include #include #include +#include =20 #include "zram_drv.h" =20 @@ -998,8 +999,34 @@ static int __comp_algorithm_store(struct zram *zram, u= 32 prio, const char *buf) return 0; } =20 -static int comp_params_store(struct zram *zram, u32 prio, s32 level) +static void comp_params_reset(struct zram *zram, u32 prio) { + struct zcomp_params *params =3D &zram->params[prio]; + + vfree(params->dict); + params->level =3D ZCOMP_PARAM_NO_LEVEL; + params->dict_sz =3D 0; + params->dict =3D NULL; +} + +static int comp_params_store(struct zram *zram, u32 prio, s32 level, + const char *dict_path) +{ + ssize_t sz =3D 0; + + comp_params_reset(zram, prio); + + if (dict_path) { + sz =3D kernel_read_file_from_path(dict_path, 0, + &zram->params[prio].dict, + INT_MAX, + NULL, + READING_POLICY); + if (sz < 0) + return -EINVAL; + } + + zram->params[prio].dict_sz =3D sz; zram->params[prio].level =3D level; return 0; } @@ -1010,7 +1037,7 @@ static ssize_t algorithm_params_store(struct device *= dev, size_t len) { s32 prio =3D ZRAM_PRIMARY_COMP, level =3D ZCOMP_PARAM_NO_LEVEL; - char *args, *param, *val, *algo =3D NULL; + char *args, *param, *val, *algo =3D NULL, *dict_path =3D NULL; struct zram *zram =3D dev_to_zram(dev); int ret; =20 @@ -1039,6 +1066,11 @@ static ssize_t algorithm_params_store(struct device = *dev, algo =3D val; continue; } + + if (!strcmp(param, "dict")) { + dict_path =3D val; + continue; + } } =20 /* Lookup priority by algorithm name */ @@ -1060,7 +1092,7 @@ static ssize_t algorithm_params_store(struct device *= dev, if (prio < ZRAM_PRIMARY_COMP || prio >=3D ZRAM_MAX_COMPS) return -EINVAL; =20 - ret =3D comp_params_store(zram, prio, level); + ret =3D comp_params_store(zram, prio, level, dict_path); return ret ? ret : len; } =20 @@ -2050,12 +2082,7 @@ static void zram_comp_params_reset(struct zram *zram) u32 prio; =20 for (prio =3D ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++) { - struct zcomp_params *params =3D &zram->params[prio]; - - vfree(params->dict); - params->level =3D ZCOMP_PARAM_NO_LEVEL; - params->dict_sz =3D 0; - params->dict =3D NULL; + comp_params_reset(zram, prio); } } =20 --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E73781D67B3 for ; Mon, 2 Sep 2024 10:57:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274660; cv=none; b=b5TBs7aS4KVnsi51Ww0lrT061s+VYmkqiDSUesn8MCd4zNeBXYI/mFZF47EpNTUjwNWd7gFlxqj8KKdxzC4UKB4fbfTs6zFQJH9xyM/sPzhxxgI0wBz2WMqDAZhBIs2qA8Z6DE3euxUmBcBdZnf5FoX9zXZwII0wXCmqWPhbF0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274660; c=relaxed/simple; bh=AMLuxwGrYJLl+K2wHrLBN5zBzUO8j4CgRKZqp7moKLA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=teL1c5nLhj+CbUOp6Xl+L12iARseJUzuKwgD8YeOOqHe8qh5yaES2O+CX0NNXrMAolz9GFlRU14fOd98edz+9t59EaxVvlps+kl2vPe+m7YpVNupI3lv3bmIIvitK7dWxRNH3+rtnI+w3qEA/mQH7XraekWfydphaGuXac7opA8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=GlypeYvG; arc=none smtp.client-ip=209.85.210.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="GlypeYvG" Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-70f5cd2fa39so2827025a34.0 for ; Mon, 02 Sep 2024 03:57:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274658; x=1725879458; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MWkPMrLpdFdhk1/nVs/HoG4G7wjyRFcEFptGzfIH6eA=; b=GlypeYvGULSpBfHWCz0b14FbPc3pM71ngzAGO1BE+x+G0YsYHbDGga/M34fmeuaqtP hcsUvp5ghIZPFzAlRp8x2ToXYmHn2iPRyK/RVqMNZIWxqWEq+QtGIarRSifmjTGsnzHC wHZVOCHow6nhOCtpc14NYf2/L0Q4PckHMt4Is= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274658; x=1725879458; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MWkPMrLpdFdhk1/nVs/HoG4G7wjyRFcEFptGzfIH6eA=; b=Ju5WFsymgjamjImKtEh1Ip0r8ja/eD80Ouj/7TTTCGpO7lBeG9LoeJ2cs7arfJoUV+ 4dVt6S9XJQf6FOgO+8X/c2EZogKE0O8yirTKcEBBZlLX88VM4rWmqQJuIRBTVzksJLac q77NMmTpd2GzP65UStje1v+KlmUf8Au+keHQj688N+dewekOA5lfl0Wuraa35fWQUxt4 suCftobV8MX9OoPKVJ7NFcT6uANiv1swFlRuGS3V5tYaDrVPsA2duQhnG2619xA02txg sn9U/19USJuHTbi+V/vzeyMPwD1sKiamcv0TzUokagplueTvpj3mkoBuMW3DXuFduLa6 ldDA== X-Forwarded-Encrypted: i=1; AJvYcCX4fqOoRIxJVwA5Lnd1einDSHMSWkgtWsYkYF68pWzKwnac6O9pw7+A7vpEBxr/WAZnShtU4X7bI8tf+FE=@vger.kernel.org X-Gm-Message-State: AOJu0Yyx2IKz8w2+K046EIaGfanGtESM5E2aum+fuhEjdOpaUpNg+3b/ PAtPL1X3VvWLoPL8UP+eiRgLZdTL0YZvGWxD2GHTYpC6FTPckMHe28cxBczziA== X-Google-Smtp-Source: AGHT+IGS+S1Bs7kfMXcdhbjXm7m4yabXVFSAb7CIJyC87qlYSFyQdEBwSdCpJKuyjaYqI3uKygJBDw== X-Received: by 2002:a05:6358:93a5:b0:1b5:a157:27c9 with SMTP id e5c5f4694b2df-1b7ef691d23mr962033755d.15.1725274657960; Mon, 02 Sep 2024 03:57:37 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:37 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 17/24] zram: introduce zcomp_req structure Date: Mon, 2 Sep 2024 19:56:05 +0900 Message-ID: <20240902105656.1383858-18-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Encapsulate compression/decompression data in zcomp_req structure. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 17 ++++++++--------- drivers/block/zram/backend_deflate.c | 26 +++++++++++--------------- drivers/block/zram/backend_lz4.c | 15 +++++++-------- drivers/block/zram/backend_lz4hc.c | 13 ++++++------- drivers/block/zram/backend_lzo.c | 12 ++++++------ drivers/block/zram/backend_lzorle.c | 13 ++++++------- drivers/block/zram/backend_zstd.c | 15 +++++++-------- drivers/block/zram/zcomp.c | 23 ++++++++++++++++------- drivers/block/zram/zcomp.h | 15 ++++++++++----- 9 files changed, 77 insertions(+), 72 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index e14dba30b0a2..1597dc4d4f1c 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -38,25 +38,24 @@ static void *create_842(struct zcomp_params *params) return NULL; } =20 -static int compress_842(void *ctx, const unsigned char *src, size_t src_le= n, - unsigned char *dst, size_t *dst_len) +static int compress_842(void *ctx, struct zcomp_req *req) { struct sw842_ctx *zctx =3D ctx; - unsigned int dlen =3D *dst_len; + unsigned int dlen =3D req->dst_len; int ret; =20 - ret =3D sw842_compress(src, src_len, dst, &dlen, zctx->mem); + ret =3D sw842_compress(req->src, req->src_len, req->dst, &dlen, + zctx->mem); if (ret =3D=3D 0) - *dst_len =3D dlen; + req->dst_len =3D dlen; return ret; } =20 -static int decompress_842(void *ctx, const unsigned char *src, size_t src_= len, - unsigned char *dst, size_t dst_len) +static int decompress_842(void *ctx, struct zcomp_req *req) { - unsigned int dlen =3D dst_len; + unsigned int dlen =3D req->dst_len; =20 - return sw842_decompress(src, src_len, dst, &dlen); + return sw842_decompress(req->src, req->src_len, req->dst, &dlen); } =20 const struct zcomp_ops backend_842 =3D { diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index ec662ce46897..117852d45aa4 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -74,9 +74,7 @@ static void *deflate_create(struct zcomp_params *params) return NULL; } =20 -static int deflate_compress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, - size_t *dst_len) +static int deflate_compress(void *ctx, struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx; struct z_stream_s *deflate; @@ -87,22 +85,20 @@ static int deflate_compress(void *ctx, const unsigned c= har *src, if (ret !=3D Z_OK) return -EINVAL; =20 - deflate->next_in =3D (u8 *)src; - deflate->avail_in =3D src_len; - deflate->next_out =3D (u8 *)dst; - deflate->avail_out =3D *dst_len; + deflate->next_in =3D (u8 *)req->src; + deflate->avail_in =3D req->src_len; + deflate->next_out =3D (u8 *)req->dst; + deflate->avail_out =3D req->dst_len; =20 ret =3D zlib_deflate(deflate, Z_FINISH); if (ret !=3D Z_STREAM_END) return -EINVAL; =20 - *dst_len =3D deflate->total_out; + req->dst_len =3D deflate->total_out; return 0; } =20 -static int deflate_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, - size_t dst_len) +static int deflate_decompress(void *ctx, struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx; struct z_stream_s *inflate; @@ -114,10 +110,10 @@ static int deflate_decompress(void *ctx, const unsign= ed char *src, if (ret !=3D Z_OK) return -EINVAL; =20 - inflate->next_in =3D (u8 *)src; - inflate->avail_in =3D src_len; - inflate->next_out =3D (u8 *)dst; - inflate->avail_out =3D dst_len; + inflate->next_in =3D (u8 *)req->src; + inflate->avail_in =3D req->src_len; + inflate->next_out =3D (u8 *)req->dst; + inflate->avail_out =3D req->dst_len; =20 ret =3D zlib_inflate(inflate, Z_SYNC_FLUSH); if (ret !=3D Z_STREAM_END) diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index ec57b5acbd39..cc4ae4097870 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -41,26 +41,25 @@ static void *lz4_create(struct zcomp_params *params) return NULL; } =20 -static int lz4_compress(void *ctx, const unsigned char *src, size_t src_le= n, - unsigned char *dst, size_t *dst_len) +static int lz4_compress(void *ctx, struct zcomp_req *req) { struct lz4_ctx *zctx =3D ctx; int ret; =20 - ret =3D LZ4_compress_fast(src, dst, src_len, *dst_len, - zctx->level, zctx->mem); + ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, + req->dst_len, zctx->level, zctx->mem); if (!ret) return -EINVAL; - *dst_len =3D ret; + req->dst_len =3D ret; return 0; } =20 -static int lz4_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, size_t dst_len) +static int lz4_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); if (ret < 0) return -EINVAL; return 0; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 80733fead595..610dadc09751 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -41,26 +41,25 @@ static void *lz4hc_create(struct zcomp_params *params) return NULL; } =20 -static int lz4hc_compress(void *ctx, const unsigned char *src, size_t src_= len, - unsigned char *dst, size_t *dst_len) +static int lz4hc_compress(void *ctx, struct zcomp_req *req) { struct lz4hc_ctx *zctx =3D ctx; int ret; =20 - ret =3D LZ4_compress_HC(src, dst, src_len, *dst_len, + ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, zctx->level, zctx->mem); if (!ret) return -EINVAL; - *dst_len =3D ret; + req->dst_len =3D ret; return 0; } =20 -static int lz4hc_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, size_t dst_len) +static int lz4hc_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); if (ret < 0) return -EINVAL; return 0; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 8e4aabd04bf3..88f1aa5683f3 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -16,21 +16,21 @@ static void lzo_destroy(void *ctx) kfree(ctx); } =20 -static int lzo_compress(void *ctx, const unsigned char *src, size_t src_le= n, - unsigned char *dst, size_t *dst_len) +static int lzo_compress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzo1x_1_compress(src, src_len, dst, dst_len, ctx); + ret =3D lzo1x_1_compress(req->src, req->src_len, req->dst, + &req->dst_len, ctx); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzo_decompress(void *ctx, const unsigned char *src, size_t src_= len, - unsigned char *dst, size_t dst_len) +static int lzo_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + ret =3D lzo1x_decompress_safe(req->src, req->src_len, + req->dst, &req->dst_len); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index cb01eb8b04f4..f05820929a74 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -16,22 +16,21 @@ static void lzorle_destroy(void *ctx) kfree(ctx); } =20 -static int lzorle_compress(void *ctx, const unsigned char *src, size_t src= _len, - unsigned char *dst, size_t *dst_len) +static int lzorle_compress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzorle1x_1_compress(src, src_len, dst, dst_len, ctx); + ret =3D lzorle1x_1_compress(req->src, req->src_len, req->dst, + &req->dst_len, ctx); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzorle_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, - size_t dst_len) +static int lzorle_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + ret =3D lzo1x_decompress_safe(req->src, req->src_len, + req->dst, &req->dst_len); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 7c6798f0c912..19eba65f44c9 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -67,27 +67,26 @@ static void *zstd_create(struct zcomp_params *params) return NULL; } =20 -static int zstd_compress(void *ctx, const unsigned char *src, size_t src_l= en, - unsigned char *dst, size_t *dst_len) +static int zstd_compress(void *ctx, struct zcomp_req *req) { struct zstd_ctx *zctx =3D ctx; size_t ret; =20 - ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, - src, src_len, &zctx->cprm); + ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, + req->src, req->src_len, &zctx->cprm); if (zstd_is_error(ret)) return -EINVAL; - *dst_len =3D ret; + req->dst_len =3D ret; return 0; } =20 -static int zstd_decompress(void *ctx, const unsigned char *src, size_t src= _len, - unsigned char *dst, size_t dst_len) +static int zstd_decompress(void *ctx, struct zcomp_req *req) { struct zstd_ctx *zctx =3D ctx; size_t ret; =20 - ret =3D zstd_decompress_dctx(zctx->dctx, dst, dst_len, src, src_len); + ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, + req->src, req->src_len); if (zstd_is_error(ret)) return -EINVAL; return 0; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 173ee2b79442..20ad7b6fe62f 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -119,22 +119,31 @@ void zcomp_stream_put(struct zcomp *comp) int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm, const void *src, unsigned int *dst_len) { - /* The dst buffer should always be 2 * PAGE_SIZE */ - size_t dlen =3D 2 * PAGE_SIZE; + struct zcomp_req req =3D { + .src =3D src, + .dst =3D zstrm->buffer, + .src_len =3D PAGE_SIZE, + .dst_len =3D 2 * PAGE_SIZE, + }; int ret; =20 - ret =3D comp->ops->compress(zstrm->ctx, src, PAGE_SIZE, - zstrm->buffer, &dlen); + ret =3D comp->ops->compress(zstrm->ctx, &req); if (!ret) - *dst_len =3D dlen; + *dst_len =3D req.dst_len; return ret; } =20 int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm, const void *src, unsigned int src_len, void *dst) { - return comp->ops->decompress(zstrm->ctx, src, src_len, - dst, PAGE_SIZE); + struct zcomp_req req =3D { + .src =3D src, + .dst =3D dst, + .src_len =3D src_len, + .dst_len =3D PAGE_SIZE, + }; + + return comp->ops->decompress(zstrm->ctx, &req); } =20 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 217a750fa908..bbc48094f826 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -21,12 +21,17 @@ struct zcomp_strm { void *ctx; }; =20 -struct zcomp_ops { - int (*compress)(void *ctx, const unsigned char *src, size_t src_len, - unsigned char *dst, size_t *dst_len); +struct zcomp_req { + const unsigned char *src; + const size_t src_len; + + unsigned char *dst; + size_t dst_len; +}; =20 - int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, - unsigned char *dst, size_t dst_len); +struct zcomp_ops { + int (*compress)(void *ctx, struct zcomp_req *req); + int (*decompress)(void *ctx, struct zcomp_req *req); =20 void *(*create_ctx)(struct zcomp_params *params); void (*destroy_ctx)(void *ctx); --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 453D01D6C6C for ; Mon, 2 Sep 2024 10:57:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274663; cv=none; b=NJiz29/ljS0OQb2PT7fMFrg3QsXFlX2m3lRwlEXlC5Zw9OZH3VeSXKSxLlSjA0DGUMUzRr1Pf24Xo0rh4bwMWL5O7k4ic/W+GwYEQa4N52WUeU2gqro6eDpp8uTVVSGG2FAQPA3uMNuVGN043N5HalZX6Gdsdet5Md5Gs3mR1Zg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274663; c=relaxed/simple; bh=8dLzG8l91BXy2CyCVGP/Ke8mbVG2osCScAc58lvsqJ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jCwj/2/O5kFwvZHyP8qWEE+6bIwzL5/CsaF2AiWLYbrswsQ91gIpxq8lyLOf8Bv1leYDOfII7MB7iFNdMKQnWqXRRTS2T2+DYQokpMsBltBQ8nXum1QsPB8XcwpkvV02Ir8oPzctjKW3s86JUZQXzjEztsrr29LDK69+HnHr2to= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=gubkTGDY; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="gubkTGDY" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-71423273c62so3088715b3a.0 for ; Mon, 02 Sep 2024 03:57:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274661; x=1725879461; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=X1fh9EznfrieeGu0htuITkaSxE7ubtlH6gRGWJ9AXsU=; b=gubkTGDYd05xV9mB8Xb7HnzOw1bv0sIbbD0edMx2rn9t/rlnYF20KpVMUnz1m81JaJ 2u3r7z05i5Nj5KFQE1mJmRc0wOYFBq5EJKTIGZeoLfBkFVWGkDZGRXQ6n8Xzmy9n98V8 d7RiGFZHbrR/SMhuW7H7nGylWNYxUJarzzaBk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274661; x=1725879461; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=X1fh9EznfrieeGu0htuITkaSxE7ubtlH6gRGWJ9AXsU=; b=uiy7b9RWdTdyraVktu4W8b98ejqM3amV83NtNjqH3upWTn9DlFmK1Bo3OlmvBwqlWF oF6wLP1FqCgDpXVYqbKJMX/kFMyKatocHw7q6xZKlyZJ5fKBkXNA0WMDAxWYl8YG5DIG C6XLBvqYsKRv7UYkULqbQxJ7xsKzmGwXQAsYHQq65s/jwbnsgL6/lS2F4cxet+cxou00 2v/Pdm4Dmn/30JoOL5HZovRASH6dvmvEGn4tkyshM9YlrqC0Tq2adV2Mi/qIYo2e9lLN IqkViZQTfSqPgquWH8ra+C6mAj6/1lhD7KIHDblxKxIU2MktK4Yq3wgZx7WKRS7fNRxk SW/Q== X-Forwarded-Encrypted: i=1; AJvYcCWIXPsKP451IGtvt6gwJaN2x0yB9uKIjPT0N1s9RPXyQ22EyC8Up0s/y6MJeONVL5DeEE9fhtctMw9LEKc=@vger.kernel.org X-Gm-Message-State: AOJu0YwCXCVpPBTPZ8jZCvB3jYpGKjOJRK8Pm78UrbJJ24L0W1dGtosV jNlDaAi3UMLnt3uhxyIow/8jQZVGtbj77gYPig5jdGeM8698LSyFgUPx8E0foQ== X-Google-Smtp-Source: AGHT+IGSLMIQRt+Nbfc8RzpnjsYei99YOh5o/2046mFKlQ6DNRDdW8RhS7kKuYGtCuDXjnx7b0UDGQ== X-Received: by 2002:a05:6a00:2316:b0:70d:2ac8:c838 with SMTP id d2e1a72fcca58-7173fa0ac34mr5592892b3a.4.1725274660468; Mon, 02 Sep 2024 03:57:40 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:39 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 18/24] zram: introduce zcomp_ctx structure Date: Mon, 2 Sep 2024 19:56:06 +0900 Message-ID: <20240902105656.1383858-19-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Keep run-time driver data (scratch buffers, etc.) in zcomp_ctx structure. This structure is allocated per-CPU because drivers (backends) need to modify its content during requests execution. We will split mutable and immutable driver data, this is a preparation path. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 39 ++++++-------------- drivers/block/zram/backend_deflate.c | 46 +++++++++++++----------- drivers/block/zram/backend_lz4.c | 36 ++++++++++--------- drivers/block/zram/backend_lz4hc.c | 36 ++++++++++--------- drivers/block/zram/backend_lzo.c | 17 +++++---- drivers/block/zram/backend_lzorle.c | 17 +++++---- drivers/block/zram/backend_zstd.c | 54 +++++++++++++++------------- drivers/block/zram/zcomp.c | 16 +++++---- drivers/block/zram/zcomp.h | 23 ++++++++---- 9 files changed, 149 insertions(+), 135 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 1597dc4d4f1c..2f1202322264 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -7,51 +7,32 @@ =20 #include "backend_842.h" =20 -struct sw842_ctx { - void *mem; -}; - -static void destroy_842(void *ctx) +static void destroy_842(struct zcomp_ctx *ctx) { - struct sw842_ctx *zctx =3D ctx; - - kfree(zctx->mem); - kfree(zctx); + kfree(ctx->context); } =20 -static void *create_842(struct zcomp_params *params) +static int create_842(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct sw842_ctx *ctx; - - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; - - ctx->mem =3D kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL); - if (!ctx->mem) - goto error; - - return ctx; - -error: - destroy_842(ctx); - return NULL; + ctx->context =3D kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->context) + return -ENOMEM; + return 0; } =20 -static int compress_842(void *ctx, struct zcomp_req *req) +static int compress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct sw842_ctx *zctx =3D ctx; unsigned int dlen =3D req->dst_len; int ret; =20 ret =3D sw842_compress(req->src, req->src_len, req->dst, &dlen, - zctx->mem); + ctx->context); if (ret =3D=3D 0) req->dst_len =3D dlen; return ret; } =20 -static int decompress_842(void *ctx, struct zcomp_req *req) +static int decompress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) { unsigned int dlen =3D req->dst_len; =20 diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index 117852d45aa4..eae4ee35c1df 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -17,9 +17,12 @@ struct deflate_ctx { s32 level; }; =20 -static void deflate_destroy(void *ctx) +static void deflate_destroy(struct zcomp_ctx *ctx) { - struct deflate_ctx *zctx =3D ctx; + struct deflate_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 if (zctx->cctx.workspace) { zlib_deflateEnd(&zctx->cctx); @@ -32,51 +35,52 @@ static void deflate_destroy(void *ctx) kfree(zctx); } =20 -static void *deflate_create(struct zcomp_params *params) +static int deflate_create(struct zcomp_params *params, struct zcomp_ctx *c= tx) { - struct deflate_ctx *ctx; + struct deflate_ctx *zctx; size_t sz; int ret; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D Z_DEFAULT_COMPRESSION; + zctx->level =3D Z_DEFAULT_COMPRESSION; =20 sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); - ctx->cctx.workspace =3D vzalloc(sz); - if (!ctx->cctx.workspace) + zctx->cctx.workspace =3D vzalloc(sz); + if (!zctx->cctx.workspace) goto error; =20 - ret =3D zlib_deflateInit2(&ctx->cctx, ctx->level, Z_DEFLATED, + ret =3D zlib_deflateInit2(&zctx->cctx, zctx->level, Z_DEFLATED, -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, Z_DEFAULT_STRATEGY); if (ret !=3D Z_OK) goto error; =20 sz =3D zlib_inflate_workspacesize(); - ctx->dctx.workspace =3D vzalloc(sz); - if (!ctx->dctx.workspace) + zctx->dctx.workspace =3D vzalloc(sz); + if (!zctx->dctx.workspace) goto error; =20 - ret =3D zlib_inflateInit2(&ctx->dctx, -DEFLATE_DEF_WINBITS); + ret =3D zlib_inflateInit2(&zctx->dctx, -DEFLATE_DEF_WINBITS); if (ret !=3D Z_OK) goto error; =20 - return ctx; + return 0; =20 error: deflate_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int deflate_compress(void *ctx, struct zcomp_req *req) +static int deflate_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct deflate_ctx *zctx =3D ctx; + struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *deflate; int ret; =20 @@ -98,9 +102,9 @@ static int deflate_compress(void *ctx, struct zcomp_req = *req) return 0; } =20 -static int deflate_decompress(void *ctx, struct zcomp_req *req) +static int deflate_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct deflate_ctx *zctx =3D ctx; + struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *inflate; int ret; =20 diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index cc4ae4097870..e2d951e62746 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -10,40 +10,44 @@ struct lz4_ctx { s32 level; }; =20 -static void lz4_destroy(void *ctx) +static void lz4_destroy(struct zcomp_ctx *ctx) { - struct lz4_ctx *zctx =3D ctx; + struct lz4_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 vfree(zctx->mem); kfree(zctx); } =20 -static void *lz4_create(struct zcomp_params *params) +static int lz4_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4_ctx *ctx; + struct lz4_ctx *zctx; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D LZ4_ACCELERATION_DEFAULT; + zctx->level =3D LZ4_ACCELERATION_DEFAULT; =20 - ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); - if (!ctx->mem) + zctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!zctx->mem) goto error; =20 - return ctx; + return 0; error: lz4_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int lz4_compress(void *ctx, struct zcomp_req *req) +static int lz4_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct lz4_ctx *zctx =3D ctx; + struct lz4_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, @@ -54,7 +58,7 @@ static int lz4_compress(void *ctx, struct zcomp_req *req) return 0; } =20 -static int lz4_decompress(void *ctx, struct zcomp_req *req) +static int lz4_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 610dadc09751..6da71ec5fc05 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -10,40 +10,44 @@ struct lz4hc_ctx { s32 level; }; =20 -static void lz4hc_destroy(void *ctx) +static void lz4hc_destroy(struct zcomp_ctx *ctx) { - struct lz4hc_ctx *zctx =3D ctx; + struct lz4hc_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 vfree(zctx->mem); kfree(zctx); } =20 -static void *lz4hc_create(struct zcomp_params *params) +static int lz4hc_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4hc_ctx *ctx; + struct lz4hc_ctx *zctx; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + zctx->level =3D LZ4HC_DEFAULT_CLEVEL; =20 - ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!ctx->mem) + zctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!zctx->mem) goto error; =20 - return ctx; + return 0; error: lz4hc_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int lz4hc_compress(void *ctx, struct zcomp_req *req) +static int lz4hc_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct lz4hc_ctx *zctx =3D ctx; + struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, @@ -54,7 +58,7 @@ static int lz4hc_compress(void *ctx, struct zcomp_req *re= q) return 0; } =20 -static int lz4hc_decompress(void *ctx, struct zcomp_req *req) +static int lz4hc_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 88f1aa5683f3..81fbad286092 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -6,26 +6,29 @@ =20 #include "backend_lzo.h" =20 -static void *lzo_create(struct zcomp_params *params) +static int lzo_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->context) + return -ENOMEM; + return 0; } =20 -static void lzo_destroy(void *ctx) +static void lzo_destroy(struct zcomp_ctx *ctx) { - kfree(ctx); + kfree(ctx->context); } =20 -static int lzo_compress(void *ctx, struct zcomp_req *req) +static int lzo_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 ret =3D lzo1x_1_compress(req->src, req->src_len, req->dst, - &req->dst_len, ctx); + &req->dst_len, ctx->context); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzo_decompress(void *ctx, struct zcomp_req *req) +static int lzo_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index f05820929a74..99c9da8f116e 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -6,26 +6,29 @@ =20 #include "backend_lzorle.h" =20 -static void *lzorle_create(struct zcomp_params *params) +static int lzorle_create(struct zcomp_params *params, struct zcomp_ctx *ct= x) { - return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->context) + return -ENOMEM; + return 0; } =20 -static void lzorle_destroy(void *ctx) +static void lzorle_destroy(struct zcomp_ctx *ctx) { - kfree(ctx); + kfree(ctx->context); } =20 -static int lzorle_compress(void *ctx, struct zcomp_req *req) +static int lzorle_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 ret =3D lzorle1x_1_compress(req->src, req->src_len, req->dst, - &req->dst_len, ctx); + &req->dst_len, ctx->context); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzorle_decompress(void *ctx, struct zcomp_req *req) +static int lzorle_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 19eba65f44c9..9f000dedf1ad 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -16,60 +16,64 @@ struct zstd_ctx { s32 level; }; =20 -static void zstd_destroy(void *ctx) +static void zstd_destroy(struct zcomp_ctx *ctx) { - struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 vfree(zctx->cctx_mem); vfree(zctx->dctx_mem); kfree(zctx); } =20 -static void *zstd_create(struct zcomp_params *params) +static int zstd_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { + struct zstd_ctx *zctx; zstd_parameters prm; - struct zstd_ctx *ctx; size_t sz; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D zstd_default_clevel(); + zctx->level =3D zstd_default_clevel(); =20 - prm =3D zstd_get_params(ctx->level, PAGE_SIZE); - ctx->cprm =3D zstd_get_params(ctx->level, PAGE_SIZE); + prm =3D zstd_get_params(zctx->level, PAGE_SIZE); + zctx->cprm =3D zstd_get_params(zctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(&prm.cParams); - ctx->cctx_mem =3D vzalloc(sz); - if (!ctx->cctx_mem) + zctx->cctx_mem =3D vzalloc(sz); + if (!zctx->cctx_mem) goto error; =20 - ctx->cctx =3D zstd_init_cctx(ctx->cctx_mem, sz); - if (!ctx->cctx) + zctx->cctx =3D zstd_init_cctx(zctx->cctx_mem, sz); + if (!zctx->cctx) goto error; =20 sz =3D zstd_dctx_workspace_bound(); - ctx->dctx_mem =3D vzalloc(sz); - if (!ctx->dctx_mem) + zctx->dctx_mem =3D vzalloc(sz); + if (!zctx->dctx_mem) goto error; =20 - ctx->dctx =3D zstd_init_dctx(ctx->dctx_mem, sz); - if (!ctx->dctx) + zctx->dctx =3D zstd_init_dctx(zctx->dctx_mem, sz); + if (!zctx->dctx) goto error; =20 - return ctx; + return 0; =20 error: zstd_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int zstd_compress(void *ctx, struct zcomp_req *req) +static int zstd_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, @@ -80,9 +84,9 @@ static int zstd_compress(void *ctx, struct zcomp_req *req) return 0; } =20 -static int zstd_decompress(void *ctx, struct zcomp_req *req) +static int zstd_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 20ad7b6fe62f..96f07287e571 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -45,23 +45,25 @@ static const struct zcomp_ops *backends[] =3D { =20 static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) { - if (zstrm->ctx) - comp->ops->destroy_ctx(zstrm->ctx); + comp->ops->destroy_ctx(&zstrm->ctx); vfree(zstrm->buffer); - zstrm->ctx =3D NULL; zstrm->buffer =3D NULL; } =20 static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) { - zstrm->ctx =3D comp->ops->create_ctx(comp->params); + int ret; + + ret =3D comp->ops->create_ctx(comp->params, &zstrm->ctx); + if (ret) + return ret; =20 /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ zstrm->buffer =3D vzalloc(2 * PAGE_SIZE); - if (!zstrm->ctx || !zstrm->buffer) { + if (!zstrm->buffer) { zcomp_strm_free(comp, zstrm); return -ENOMEM; } @@ -127,7 +129,7 @@ int zcomp_compress(struct zcomp *comp, struct zcomp_str= m *zstrm, }; int ret; =20 - ret =3D comp->ops->compress(zstrm->ctx, &req); + ret =3D comp->ops->compress(&zstrm->ctx, &req); if (!ret) *dst_len =3D req.dst_len; return ret; @@ -143,7 +145,7 @@ int zcomp_decompress(struct zcomp *comp, struct zcomp_s= trm *zstrm, .dst_len =3D PAGE_SIZE, }; =20 - return comp->ops->decompress(zstrm->ctx, &req); + return comp->ops->decompress(&zstrm->ctx, &req); } =20 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index bbc48094f826..1d8920c2d449 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -13,12 +13,20 @@ struct zcomp_params { s32 level; }; =20 +/* + * Run-time driver context - scratch buffers, etc. It is modified during + * request execution (compression/decompression), cannot be shared, so + * it's in per-CPU area. + */ +struct zcomp_ctx { + void *context; +}; + struct zcomp_strm { - /* The members ->buffer and ->tfm are protected by ->lock. */ local_lock_t lock; - /* compression/decompression buffer */ + /* compression buffer */ void *buffer; - void *ctx; + struct zcomp_ctx ctx; }; =20 struct zcomp_req { @@ -30,11 +38,12 @@ struct zcomp_req { }; =20 struct zcomp_ops { - int (*compress)(void *ctx, struct zcomp_req *req); - int (*decompress)(void *ctx, struct zcomp_req *req); + int (*compress)(struct zcomp_ctx *ctx, struct zcomp_req *req); + int (*decompress)(struct zcomp_ctx *ctx, struct zcomp_req *req); =20 - void *(*create_ctx)(struct zcomp_params *params); - void (*destroy_ctx)(void *ctx); + int (*create_ctx)(struct zcomp_params *params, + struct zcomp_ctx *ctx); + void (*destroy_ctx)(struct zcomp_ctx *ctx); =20 const char *name; }; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EEFA1D6C7B for ; Mon, 2 Sep 2024 10:57:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274666; cv=none; b=ujzjOx+aIUK9bYD5C6Ea5aQImRF//qLsWSNfq1U/XJI1AgFCipwjFNeeTQNIRCas2j7yqZBqLMFBnRNmkWMI6ziQ94JIHRg4zCVc7hv+V1AUauv6LKKF4ZNB+d9JwTAfTbRFmsvPMKt55MbL6a+kaULDoE13QP+kJdpwAEdNZJk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274666; c=relaxed/simple; bh=6wDmiA/1DNw14BiJHRLhtfn5Te6bsazC30KPNRXGg4U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DMFBvlQ+kKYpVcEmS+6qm+W9rCcvehmQu02wXf+1JqJiosVLAOkrEM1rzPlAO7V/tOfwCQLZe80uGyUm0tkM4ksl6bIXmHB1PNWWb86nJ6rcA+RVmzpt8JmG4I0bjBqaJ4PECyFlNb/j1PmLn8SwkX7YOaGD12id1mYOwf1/jEY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=SBx/ypH7; arc=none smtp.client-ip=209.85.210.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="SBx/ypH7" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-70f6e65d605so1436997a34.3 for ; Mon, 02 Sep 2024 03:57:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274663; x=1725879463; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wa9gt9P63HqtxVceMMegteqbOblgUbcJgE0EOgrEC+M=; b=SBx/ypH7EhZHGtaqvdZhTQZImnk4Iyq0XPolefXIH66I6FeV231z6pXmCI2loagULW p42t3A1DcfbPt+K5CXp5r0Dxe30G3+7B8+L8q1RYaINVHhTsJYccEiRVaMsB+K5/blo4 50VbfZlQPyTfs33obGgzhsCEr/72b9eq7MCB8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274663; x=1725879463; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wa9gt9P63HqtxVceMMegteqbOblgUbcJgE0EOgrEC+M=; b=xFpop0MDqFgoS5d8INIKAqvvuQbHj507QimLZJfS/CRBPNbqyqR2VT/cix4B0CtU0W /xXZWYAoMTLk+0cX9dez6aWWMo3y+MDXljcdAaZ2MjT90tGxGXHEcITnY4/p3Oe5xAJJ /xOrgF0f5GkZNMxBGF99K6pk8O6+9XKYT1UoASKIf8yNedTCLH82WdvsW+2+04TWX4T9 Yy9PbWwomzYgtja/d5oU79rw5lugaICbC1sWc23iLV/9MDWA0NQ8FiJxoGabjLjSlUP2 zj41Jk4LIG73FwVl3Ik2lg1dhwOEzDYjB3yQ7okg8VCIUmt7EhSF0jCyWpjsjTpA5nlM 69zw== X-Forwarded-Encrypted: i=1; AJvYcCVlmYm1AG8jy9Y9KcXt5bR6Gv/5Hh230a96uu4If5WydG+ToYUK5xiptvoeCkfSHTIq6GnQXRViwg6hD9Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2W5Wyl+TQjKo4mq9ywt9YIV7V0kviK/7A5mouhAAMgoKmq9p/ mzL8RCZDPqpDW1557NrW7I/DwuQwdiDVHZ5dksjs57axPAqpmvIbaR5EPWZrTg== X-Google-Smtp-Source: AGHT+IEgJChzjtURHRzUBqV3J8lewoUgqu5Sor/qbfO4ihneuL9Tit6l4FjdCewmsL+VGCMlf5psVQ== X-Received: by 2002:a05:6358:590a:b0:1ad:14ec:a002 with SMTP id e5c5f4694b2df-1b603cce8admr1723917755d.26.1725274663364; Mon, 02 Sep 2024 03:57:43 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:43 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 19/24] zram: move immutable comp params away from per-CPU context Date: Mon, 2 Sep 2024 19:56:07 +0900 Message-ID: <20240902105656.1383858-20-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Immutable params never change once comp has been allocated and setup, so we don't need to store multiple copies of them in each per-CPU backend context. Move those to per-comp zcomp_params and pass it to backends callbacks for requests execution. Basically, this means parameters sharing between different contexts. Also introduce two new backends callbacks: setup_params() and release_params(). First, we need to validate params in a driver-specific way; second, driver may want to allocate its specific representation of the params which is needed to execute requests. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 17 ++++++++-- drivers/block/zram/backend_deflate.c | 29 +++++++++++----- drivers/block/zram/backend_lz4.c | 51 +++++++++++----------------- drivers/block/zram/backend_lz4hc.c | 51 +++++++++++----------------- drivers/block/zram/backend_lzo.c | 17 ++++++++-- drivers/block/zram/backend_lzorle.c | 17 ++++++++-- drivers/block/zram/backend_zstd.c | 47 ++++++++++++++++++------- drivers/block/zram/zcomp.c | 17 +++++++--- drivers/block/zram/zcomp.h | 20 ++++++++--- 9 files changed, 168 insertions(+), 98 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 2f1202322264..10d9d5c60f53 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -7,6 +7,15 @@ =20 #include "backend_842.h" =20 +static void release_params_842(struct zcomp_params *params) +{ +} + +static int setup_params_842(struct zcomp_params *params) +{ + return 0; +} + static void destroy_842(struct zcomp_ctx *ctx) { kfree(ctx->context); @@ -20,7 +29,8 @@ static int create_842(struct zcomp_params *params, struct= zcomp_ctx *ctx) return 0; } =20 -static int compress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int compress_842(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req) { unsigned int dlen =3D req->dst_len; int ret; @@ -32,7 +42,8 @@ static int compress_842(struct zcomp_ctx *ctx, struct zco= mp_req *req) return ret; } =20 -static int decompress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int decompress_842(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { unsigned int dlen =3D req->dst_len; =20 @@ -44,5 +55,7 @@ const struct zcomp_ops backend_842 =3D { .decompress =3D decompress_842, .create_ctx =3D create_842, .destroy_ctx =3D destroy_842, + .setup_params =3D setup_params_842, + .release_params =3D release_params_842, .name =3D "842", }; diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index eae4ee35c1df..0f7f252c12f4 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -14,9 +14,20 @@ struct deflate_ctx { struct z_stream_s cctx; struct z_stream_s dctx; - s32 level; }; =20 +static void deflate_release_params(struct zcomp_params *params) +{ +} + +static int deflate_setup_params(struct zcomp_params *params) +{ + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D Z_DEFAULT_COMPRESSION; + + return 0; +} + static void deflate_destroy(struct zcomp_ctx *ctx) { struct deflate_ctx *zctx =3D ctx->context; @@ -46,17 +57,12 @@ static int deflate_create(struct zcomp_params *params, = struct zcomp_ctx *ctx) return -ENOMEM; =20 ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D Z_DEFAULT_COMPRESSION; - sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); zctx->cctx.workspace =3D vzalloc(sz); if (!zctx->cctx.workspace) goto error; =20 - ret =3D zlib_deflateInit2(&zctx->cctx, zctx->level, Z_DEFLATED, + ret =3D zlib_deflateInit2(&zctx->cctx, params->level, Z_DEFLATED, -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, Z_DEFAULT_STRATEGY); if (ret !=3D Z_OK) @@ -78,7 +84,8 @@ static int deflate_create(struct zcomp_params *params, st= ruct zcomp_ctx *ctx) return -EINVAL; } =20 -static int deflate_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int deflate_compress(struct zcomp_params *params, struct zcomp_ctx = *ctx, + struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *deflate; @@ -102,7 +109,9 @@ static int deflate_compress(struct zcomp_ctx *ctx, stru= ct zcomp_req *req) return 0; } =20 -static int deflate_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int deflate_decompress(struct zcomp_params *params, + struct zcomp_ctx *ctx, + struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *inflate; @@ -131,5 +140,7 @@ const struct zcomp_ops backend_deflate =3D { .decompress =3D deflate_decompress, .create_ctx =3D deflate_create, .destroy_ctx =3D deflate_destroy, + .setup_params =3D deflate_setup_params, + .release_params =3D deflate_release_params, .name =3D "deflate", }; diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index e2d951e62746..cf3c029bd5ad 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -5,60 +5,47 @@ =20 #include "backend_lz4.h" =20 -struct lz4_ctx { - void *mem; - s32 level; -}; +static void lz4_release_params(struct zcomp_params *params) +{ +} =20 -static void lz4_destroy(struct zcomp_ctx *ctx) +static int lz4_setup_params(struct zcomp_params *params) { - struct lz4_ctx *zctx =3D ctx->context; + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D LZ4_ACCELERATION_DEFAULT; =20 - if (!zctx) - return; + return 0; +} =20 - vfree(zctx->mem); - kfree(zctx); +static void lz4_destroy(struct zcomp_ctx *ctx) +{ + vfree(ctx->context); } =20 static int lz4_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4_ctx *zctx; - - zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); - if (!zctx) + ctx->context =3D vmalloc(LZ4_MEM_COMPRESS); + if (!ctx->context) return -ENOMEM; =20 - ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D LZ4_ACCELERATION_DEFAULT; - - zctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); - if (!zctx->mem) - goto error; - return 0; -error: - lz4_destroy(ctx); - return -EINVAL; } =20 -static int lz4_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req) { - struct lz4_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, - req->dst_len, zctx->level, zctx->mem); + req->dst_len, params->level, ctx->context); if (!ret) return -EINVAL; req->dst_len =3D ret; return 0; } =20 -static int lz4_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4_decompress(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { int ret; =20 @@ -74,5 +61,7 @@ const struct zcomp_ops backend_lz4 =3D { .decompress =3D lz4_decompress, .create_ctx =3D lz4_create, .destroy_ctx =3D lz4_destroy, + .setup_params =3D lz4_setup_params, + .release_params =3D lz4_release_params, .name =3D "lz4", }; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 6da71ec5fc05..928a6ea78668 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -5,60 +5,47 @@ =20 #include "backend_lz4hc.h" =20 -struct lz4hc_ctx { - void *mem; - s32 level; -}; +static void lz4hc_release_params(struct zcomp_params *params) +{ +} =20 -static void lz4hc_destroy(struct zcomp_ctx *ctx) +static int lz4hc_setup_params(struct zcomp_params *params) { - struct lz4hc_ctx *zctx =3D ctx->context; + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D LZ4HC_DEFAULT_CLEVEL; =20 - if (!zctx) - return; + return 0; +} =20 - vfree(zctx->mem); - kfree(zctx); +static void lz4hc_destroy(struct zcomp_ctx *ctx) +{ + vfree(ctx->context); } =20 static int lz4hc_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4hc_ctx *zctx; - - zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); - if (!zctx) + ctx->context =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!ctx->context) return -ENOMEM; =20 - ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D LZ4HC_DEFAULT_CLEVEL; - - zctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!zctx->mem) - goto error; - return 0; -error: - lz4hc_destroy(ctx); - return -EINVAL; } =20 -static int lz4hc_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4hc_compress(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { - struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, - zctx->level, zctx->mem); + params->level, ctx->context); if (!ret) return -EINVAL; req->dst_len =3D ret; return 0; } =20 -static int lz4hc_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4hc_decompress(struct zcomp_params *params, struct zcomp_ctx = *ctx, + struct zcomp_req *req) { int ret; =20 @@ -74,5 +61,7 @@ const struct zcomp_ops backend_lz4hc =3D { .decompress =3D lz4hc_decompress, .create_ctx =3D lz4hc_create, .destroy_ctx =3D lz4hc_destroy, + .setup_params =3D lz4hc_setup_params, + .release_params =3D lz4hc_release_params, .name =3D "lz4hc", }; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 81fbad286092..4c906beaae6b 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -6,6 +6,15 @@ =20 #include "backend_lzo.h" =20 +static void lzo_release_params(struct zcomp_params *params) +{ +} + +static int lzo_setup_params(struct zcomp_params *params) +{ + return 0; +} + static int lzo_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); @@ -19,7 +28,8 @@ static void lzo_destroy(struct zcomp_ctx *ctx) kfree(ctx->context); } =20 -static int lzo_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzo_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req) { int ret; =20 @@ -28,7 +38,8 @@ static int lzo_compress(struct zcomp_ctx *ctx, struct zco= mp_req *req) return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzo_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzo_decompress(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { int ret; =20 @@ -42,5 +53,7 @@ const struct zcomp_ops backend_lzo =3D { .decompress =3D lzo_decompress, .create_ctx =3D lzo_create, .destroy_ctx =3D lzo_destroy, + .setup_params =3D lzo_setup_params, + .release_params =3D lzo_release_params, .name =3D "lzo", }; diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index 99c9da8f116e..10640c96cbfc 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -6,6 +6,15 @@ =20 #include "backend_lzorle.h" =20 +static void lzorle_release_params(struct zcomp_params *params) +{ +} + +static int lzorle_setup_params(struct zcomp_params *params) +{ + return 0; +} + static int lzorle_create(struct zcomp_params *params, struct zcomp_ctx *ct= x) { ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); @@ -19,7 +28,8 @@ static void lzorle_destroy(struct zcomp_ctx *ctx) kfree(ctx->context); } =20 -static int lzorle_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzorle_compress(struct zcomp_params *params, struct zcomp_ctx *= ctx, + struct zcomp_req *req) { int ret; =20 @@ -28,7 +38,8 @@ static int lzorle_compress(struct zcomp_ctx *ctx, struct = zcomp_req *req) return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzorle_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzorle_decompress(struct zcomp_params *params, struct zcomp_ctx= *ctx, + struct zcomp_req *req) { int ret; =20 @@ -42,5 +53,7 @@ const struct zcomp_ops backend_lzorle =3D { .decompress =3D lzorle_decompress, .create_ctx =3D lzorle_create, .destroy_ctx =3D lzorle_destroy, + .setup_params =3D lzorle_setup_params, + .release_params =3D lzorle_release_params, .name =3D "lzo-rle", }; diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 9f000dedf1ad..5b33daf4f645 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -10,12 +10,36 @@ struct zstd_ctx { zstd_cctx *cctx; zstd_dctx *dctx; - zstd_parameters cprm; void *cctx_mem; void *dctx_mem; - s32 level; }; =20 +struct zstd_params { + zstd_parameters cprm; +}; + +static void zstd_release_params(struct zcomp_params *params) +{ + kfree(params->drv_data); +} + +static int zstd_setup_params(struct zcomp_params *params) +{ + struct zstd_params *zp; + + zp =3D kzalloc(sizeof(*zp), GFP_KERNEL); + if (!zp) + return -ENOMEM; + + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D zstd_default_clevel(); + + zp->cprm =3D zstd_get_params(params->level, PAGE_SIZE); + params->drv_data =3D zp; + + return 0; +} + static void zstd_destroy(struct zcomp_ctx *ctx) { struct zstd_ctx *zctx =3D ctx->context; @@ -39,13 +63,7 @@ static int zstd_create(struct zcomp_params *params, stru= ct zcomp_ctx *ctx) return -ENOMEM; =20 ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D zstd_default_clevel(); - - prm =3D zstd_get_params(zctx->level, PAGE_SIZE); - zctx->cprm =3D zstd_get_params(zctx->level, PAGE_SIZE); + prm =3D zstd_get_params(params->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(&prm.cParams); zctx->cctx_mem =3D vzalloc(sz); if (!zctx->cctx_mem) @@ -71,20 +89,23 @@ static int zstd_create(struct zcomp_params *params, str= uct zcomp_ctx *ctx) return -EINVAL; } =20 -static int zstd_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int zstd_compress(struct zcomp_params *params, struct zcomp_ctx *ct= x, + struct zcomp_req *req) { + struct zstd_params *zp =3D params->drv_data; struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, - req->src, req->src_len, &zctx->cprm); + req->src, req->src_len, &zp->cprm); if (zstd_is_error(ret)) return -EINVAL; req->dst_len =3D ret; return 0; } =20 -static int zstd_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int zstd_decompress(struct zcomp_params *params, struct zcomp_ctx *= ctx, + struct zcomp_req *req) { struct zstd_ctx *zctx =3D ctx->context; size_t ret; @@ -101,5 +122,7 @@ const struct zcomp_ops backend_zstd =3D { .decompress =3D zstd_decompress, .create_ctx =3D zstd_create, .destroy_ctx =3D zstd_destroy, + .setup_params =3D zstd_setup_params, + .release_params =3D zstd_release_params, .name =3D "zstd", }; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 96f07287e571..bb514403e305 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -129,7 +129,7 @@ int zcomp_compress(struct zcomp *comp, struct zcomp_str= m *zstrm, }; int ret; =20 - ret =3D comp->ops->compress(&zstrm->ctx, &req); + ret =3D comp->ops->compress(comp->params, &zstrm->ctx, &req); if (!ret) *dst_len =3D req.dst_len; return ret; @@ -145,7 +145,7 @@ int zcomp_decompress(struct zcomp *comp, struct zcomp_s= trm *zstrm, .dst_len =3D PAGE_SIZE, }; =20 - return comp->ops->decompress(&zstrm->ctx, &req); + return comp->ops->decompress(comp->params, &zstrm->ctx, &req); } =20 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) @@ -173,7 +173,7 @@ int zcomp_cpu_dead(unsigned int cpu, struct hlist_node = *node) return 0; } =20 -static int zcomp_init(struct zcomp *comp) +static int zcomp_init(struct zcomp *comp, struct zcomp_params *params) { int ret; =20 @@ -181,12 +181,19 @@ static int zcomp_init(struct zcomp *comp) if (!comp->stream) return -ENOMEM; =20 + comp->params =3D params; + ret =3D comp->ops->setup_params(comp->params); + if (ret) + goto cleanup; + ret =3D cpuhp_state_add_instance(CPUHP_ZCOMP_PREPARE, &comp->node); if (ret < 0) goto cleanup; + return 0; =20 cleanup: + comp->ops->release_params(comp->params); free_percpu(comp->stream); return ret; } @@ -194,6 +201,7 @@ static int zcomp_init(struct zcomp *comp) void zcomp_destroy(struct zcomp *comp) { cpuhp_state_remove_instance(CPUHP_ZCOMP_PREPARE, &comp->node); + comp->ops->release_params(comp->params); free_percpu(comp->stream); kfree(comp); } @@ -215,14 +223,13 @@ struct zcomp *zcomp_create(const char *alg, struct zc= omp_params *params) if (!comp) return ERR_PTR(-ENOMEM); =20 - comp->params =3D params; comp->ops =3D lookup_backend_ops(alg); if (!comp->ops) { kfree(comp); return ERR_PTR(-EINVAL); } =20 - error =3D zcomp_init(comp); + error =3D zcomp_init(comp, params); if (error) { kfree(comp); return ERR_PTR(error); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 1d8920c2d449..ad5762813842 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -7,10 +7,18 @@ =20 #define ZCOMP_PARAM_NO_LEVEL INT_MIN =20 +/* + * Immutable driver (backend) parameters. The driver may attach private + * data to it (e.g. driver representation of the dictionary, etc.). + * + * This data is kept per-comp and is shared among execution contexts. + */ struct zcomp_params { void *dict; size_t dict_sz; s32 level; + + void *drv_data; }; =20 /* @@ -38,13 +46,17 @@ struct zcomp_req { }; =20 struct zcomp_ops { - int (*compress)(struct zcomp_ctx *ctx, struct zcomp_req *req); - int (*decompress)(struct zcomp_ctx *ctx, struct zcomp_req *req); + int (*compress)(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req); + int (*decompress)(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req); =20 - int (*create_ctx)(struct zcomp_params *params, - struct zcomp_ctx *ctx); + int (*create_ctx)(struct zcomp_params *params, struct zcomp_ctx *ctx); void (*destroy_ctx)(struct zcomp_ctx *ctx); =20 + int (*setup_params)(struct zcomp_params *params); + void (*release_params)(struct zcomp_params *params); + const char *name; }; =20 --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49CEA1D6DA8 for ; Mon, 2 Sep 2024 10:57:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274667; cv=none; b=pa/ZosRRIPds7qIP+QWhPPZ23UL8XasGnoMw/lrUmsh2IQ/E4vrGk+yIqOKAMEe6jEOZijc5IoidGqlQj2cfnaCcNI6x5nFRtW99Zca17mngEWhEiVkDqlAkPmURAc2gqvbuqWRor/RZoGkWUOw6l7n+KIVGT7M9nJtkRviwldc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274667; c=relaxed/simple; bh=+Jy+8wr2DxVIihczOaNP9pGnWterRMIyCCr5QXgdYm0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wo1cp8zYsIWflAAfodKchgjwpfeyCyYSnPvx9gixwDnINWuCw2TIbmCBYHhAJKZXDKxJ3i/WXeqkekYwGcDUm2GJKd7M57qb8IkhMDBjSLI96DmuGgx6YC1eZ2YrscVH++fRYrUltYMxmRDklMEwz3slEB/sjrjC1K7tlXtB4/M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Jw+TIj0I; arc=none smtp.client-ip=209.85.210.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Jw+TIj0I" Received: by mail-pf1-f195.google.com with SMTP id d2e1a72fcca58-7176645e501so124665b3a.1 for ; Mon, 02 Sep 2024 03:57:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274665; x=1725879465; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oihThJTx7u5jJd0CAqfMRPhRFwU+I2vie2k3NMx4+Dg=; b=Jw+TIj0Id4Jk38sM/o7EGj0DzeTEM4kErFOqwJFKi4OvBkNek4nerleDbp/8D61kpc p9SNHXK9GoMnP5rNT966sJVFdUacXkzq5PH3mplP497/2WxD9tRwjQ53UiAG1FnOx7Pv 8iMKvgjR7CfvnY/sJyKBhwCgdstWHzdL+CZ0o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274665; x=1725879465; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oihThJTx7u5jJd0CAqfMRPhRFwU+I2vie2k3NMx4+Dg=; b=U5VgbrjaLIUC9LfNQ7CGiatO6ZN2tKEihlgznW6znJ7Uvl8kDDrm/cYFLGEQQ+nzIv cJFdJrLM4wGuoRiURMxZPTXYseM+JVr7fpIy4YoNdwBBtH7u2XLA+sTo/0XVtGEOn5be HVmWuUkjulnzm1hrg4/sBYYLnQOm5c6hVTC4d8pxTRBdsRTuiWpTNN9kH1a8gNmY89Ik u09lCeywlyEScHmalOnR+tD410aknEWd75VrGCTdehQPxzRU/53EFareLT64s7u4t3EY II6+5sUwsy/wUpXslzTx4SBzhrSRLTiSAoslnJxkVCOfYaF+7Ion4lVp6ha7Pz0HKtoR 9LQQ== X-Forwarded-Encrypted: i=1; AJvYcCWBGQZK/3aAxO+6Yo6iJc0VSrc+5iddhhSIsyRfhe+a5jwhThvHe/IZjYBVHPMoc12S6HAYnQCdNYAMk/M=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8X8mJMdLxAocgLpZqQeDkdRhldQ6XmD2mrCP37Dx7ug94S5Fk SRnaKhJhr1IiZIBGes3BE2m6YEOVX76W6dx96oDraFmt2cc74VC9qa7J0HNUwQ4YGSByxlj9GSz tMcHf X-Google-Smtp-Source: AGHT+IH3sHXReDQEa8RxtpqbZcZDB+/yVQA1cTTF2J3vmcFQjEhRGWaZDAjf6dGNFzi6A5L8Oa/pFQ== X-Received: by 2002:a05:6a00:1786:b0:706:284f:6a68 with SMTP id d2e1a72fcca58-717449b1d09mr3399540b3a.23.1725274665565; Mon, 02 Sep 2024 03:57:45 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:45 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 20/24] zram: add dictionary support to lz4 Date: Mon, 2 Sep 2024 19:56:08 +0900 Message-ID: <20240902105656.1383858-21-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Support pre-trained dictionary param. lz4 doesn't mandate specific format of the dictionary and even zstd --train can be used to train a dictionary for lz4, according to [1]. TEST =3D=3D=3D=3D *** lz4 /sys/block/zram0/mm_stat 1750654976 664188565 676864000 0 676864000 1 0 3428= 8 34288 *** lz4 dict=3D/etc/lz4-dict-amd64 /sys/block/zram0/mm_stat 1750638592 619891141 632053760 0 632053760 1 0 3427= 8 34278 *** lz4 level=3D5 dict=3D/etc/lz4-dict-amd64 /sys/block/zram0/mm_stat 1750638592 727174243 740810752 0 740810752 1 0 3443= 7 34437 [1] https://github.com/lz4/lz4/issues/557 Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_lz4.c | 74 +++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index cf3c029bd5ad..847f3334eb38 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -5,6 +5,13 @@ =20 #include "backend_lz4.h" =20 +struct lz4_ctx { + void *mem; + + LZ4_streamDecode_t *dstrm; + LZ4_stream_t *cstrm; +}; + static void lz4_release_params(struct zcomp_params *params) { } @@ -19,25 +26,66 @@ static int lz4_setup_params(struct zcomp_params *params) =20 static void lz4_destroy(struct zcomp_ctx *ctx) { - vfree(ctx->context); + struct lz4_ctx *zctx =3D ctx->context; + + if (!zctx) + return; + + vfree(zctx->mem); + kfree(zctx->dstrm); + kfree(zctx->cstrm); + kfree(zctx); } =20 static int lz4_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - ctx->context =3D vmalloc(LZ4_MEM_COMPRESS); - if (!ctx->context) + struct lz4_ctx *zctx; + + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) return -ENOMEM; =20 + ctx->context =3D zctx; + if (params->dict_sz =3D=3D 0) { + zctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!zctx->mem) + goto error; + } else { + zctx->dstrm =3D kzalloc(sizeof(*zctx->dstrm), GFP_KERNEL); + if (!zctx->dstrm) + goto error; + + zctx->cstrm =3D kzalloc(sizeof(*zctx->cstrm), GFP_KERNEL); + if (!zctx->cstrm) + goto error; + } + return 0; + +error: + lz4_destroy(ctx); + return -ENOMEM; } =20 static int lz4_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, struct zcomp_req *req) { + struct lz4_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, - req->dst_len, params->level, ctx->context); + if (!zctx->cstrm) { + ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, + req->dst_len, params->level, + zctx->mem); + } else { + /* Cstrm needs to be reset */ + ret =3D LZ4_loadDict(zctx->cstrm, params->dict, params->dict_sz); + if (ret !=3D params->dict_sz) + return -EINVAL; + ret =3D LZ4_compress_fast_continue(zctx->cstrm, req->src, + req->dst, req->src_len, + req->dst_len, params->level); + } if (!ret) return -EINVAL; req->dst_len =3D ret; @@ -47,10 +95,22 @@ static int lz4_compress(struct zcomp_params *params, st= ruct zcomp_ctx *ctx, static int lz4_decompress(struct zcomp_params *params, struct zcomp_ctx *c= tx, struct zcomp_req *req) { + struct lz4_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, - req->dst_len); + if (!zctx->dstrm) { + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); + } else { + /* Dstrm needs to be reset */ + ret =3D LZ4_setStreamDecode(zctx->dstrm, params->dict, + params->dict_sz); + if (!ret) + return -EINVAL; + ret =3D LZ4_decompress_safe_continue(zctx->dstrm, req->src, + req->dst, req->src_len, + req->dst_len); + } if (ret < 0) return -EINVAL; return 0; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AAB71D6DB6 for ; Mon, 2 Sep 2024 10:57:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274670; cv=none; b=YDfH9fwZrfKkJ4hKSc5+2TsX5qZdeb44VEN33S0pRRJcCnN73xqWO7cpI19w7ZegRE7rSplDSnHAVPUYhLiLWASMUbYRxsdWPvsAwd8cnp33nV87OUu94OyJAp27N6j4+9pHPoRTXARBzq8U15rgaJtZyphNwxWJTRcjXKmP0GA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274670; c=relaxed/simple; bh=5U0E18nkV4Yhlpww2UvI6j2fl9z+rbeoT5KvCZOo/oo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kXCOQfEHV/wxZvJzdR4SIN/iL2M64+EM/D0Q8T5NRH+jAiQCvRSwd4yvsn0GE9gSL61LsYbgmvxSjaRUqgLwU4omZgoSsoVWt+AcaD37JwttV/p67Zl4+Q+GOrshNy6p7I/AAj6VAoyOmOigbrbNjR88g6ppwcKRzl2Me9Hvrd4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=E9Xl7NIO; arc=none smtp.client-ip=209.85.210.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="E9Xl7NIO" Received: by mail-pf1-f193.google.com with SMTP id d2e1a72fcca58-71431524f33so3278007b3a.1 for ; Mon, 02 Sep 2024 03:57:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274668; x=1725879468; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=arugtM5mAIC8413+HPBKV/ihvuKi7FYGcgiYWwmxOOE=; b=E9Xl7NIOdK6dWQ1mHGbdyhDsMBpliquscjZu/rGByNIb/8/jfRtFgn3n9CSs9xVWDl 39pf8/YfhyAhe+5vRVhrQTY2AWAum/q6sHoZ4rbuG/zbidhJp5hbq8RuznBict+5qF7x lQUgUEEHAwzW2zWR1o1EiGsquQwiRoNSK2mU0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274668; x=1725879468; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=arugtM5mAIC8413+HPBKV/ihvuKi7FYGcgiYWwmxOOE=; b=MOpLI3neCYP4GvwpS7yV5yet3d5gnyLxNRcAIAK30mU4Hz5oDOqlEM+An8MvdP0VBp eZZ6XXereszunjVdWya+irXsybny09PDXiBMcxf96gi90+rMbuTgQXHmvOX1T2vxAn8E s/nK9QAxgF7R+g2bnIYqmRdRu38v2sfsDDEC1pKDfAPSbVQrHlBfYH44ftwBu2YtbXNl G9O+U5SWcPX9yGbkRY+rI7ClNE55Iw48EAuoity2AqAjKzD2yQUhv9gXy9GtLo/+BnPX fUQB13JQfA+kOzyIdM2dbX2JmBh/bm/1FFbcxSwW2Pr7i9okyUt17P2f8KuOiA6iA1WD Rhkg== X-Forwarded-Encrypted: i=1; AJvYcCVeUGBvIVAafLL3sXvXoHyzaLrM7XlwSUPesljOWi5+3F83Vrp4p/js62cQLtegLe5jdFDBIZcg2Dss5As=@vger.kernel.org X-Gm-Message-State: AOJu0Yzq94xjz+u1eMUpaNvCzDtSnbAqe3gGxpbUOTO2mR9UEdGPXLc7 qhiAZDITIvqsOZc2u5xUviX8ao9NWYUjIBUW3JNhuqS//eS7YWLSumxQ2ZK0/g== X-Google-Smtp-Source: AGHT+IHkSIr+ID5DA893Zb06oXTXbnZ6kIEcmCL3EbIXlV8jTq88r2L2CholVmK2hiWFrNIiQM9rlA== X-Received: by 2002:a05:6a21:670f:b0:1cc:d61a:1e37 with SMTP id adf61e73a8af0-1cecf758703mr9448638637.33.1725274667733; Mon, 02 Sep 2024 03:57:47 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:47 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 21/24] zram: add dictionary support to lz4hc Date: Mon, 2 Sep 2024 19:56:09 +0900 Message-ID: <20240902105656.1383858-22-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Support pre-trained dictionary param. Just like lz4, lz4hc doesn't mandate specific format of the dictionary and zstd --train can be used to train a dictionary for lz4, according to [1]. TEST =3D=3D=3D=3D *** lz4hc /sys/block/zram0/mm_stat 1750638592 608954620 621031424 0 621031424 1 0 3428= 8 34288 *** lz4hc dict=3D/etc/lz4-dict-amd64 /sys/block/zram0/mm_stat 1750671360 505068582 514994176 0 514994176 1 0 3427= 8 34278 [1] https://github.com/lz4/lz4/issues/557 Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_lz4hc.c | 75 +++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 928a6ea78668..5f37d5abcaeb 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -5,6 +5,13 @@ =20 #include "backend_lz4hc.h" =20 +struct lz4hc_ctx { + void *mem; + + LZ4_streamDecode_t *dstrm; + LZ4_streamHC_t *cstrm; +}; + static void lz4hc_release_params(struct zcomp_params *params) { } @@ -19,25 +26,67 @@ static int lz4hc_setup_params(struct zcomp_params *para= ms) =20 static void lz4hc_destroy(struct zcomp_ctx *ctx) { - vfree(ctx->context); + struct lz4hc_ctx *zctx =3D ctx->context; + + if (!zctx) + return; + + kfree(zctx->dstrm); + kfree(zctx->cstrm); + vfree(zctx->mem); + kfree(zctx); } =20 static int lz4hc_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - ctx->context =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!ctx->context) + struct lz4hc_ctx *zctx; + + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) return -ENOMEM; =20 + ctx->context =3D zctx; + if (params->dict_sz =3D=3D 0) { + zctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!zctx->mem) + goto error; + } else { + zctx->dstrm =3D kzalloc(sizeof(*zctx->dstrm), GFP_KERNEL); + if (!zctx->dstrm) + goto error; + + zctx->cstrm =3D kzalloc(sizeof(*zctx->cstrm), GFP_KERNEL); + if (!zctx->cstrm) + goto error; + } + return 0; + +error: + lz4hc_destroy(ctx); + return -EINVAL; } =20 static int lz4hc_compress(struct zcomp_params *params, struct zcomp_ctx *c= tx, struct zcomp_req *req) { + struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, - params->level, ctx->context); + if (!zctx->cstrm) { + ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, + req->dst_len, params->level, + zctx->mem); + } else { + /* Cstrm needs to be reset */ + LZ4_resetStreamHC(zctx->cstrm, params->level); + ret =3D LZ4_loadDictHC(zctx->cstrm, params->dict, + params->dict_sz); + if (ret !=3D params->dict_sz) + return -EINVAL; + ret =3D LZ4_compress_HC_continue(zctx->cstrm, req->src, req->dst, + req->src_len, req->dst_len); + } if (!ret) return -EINVAL; req->dst_len =3D ret; @@ -47,10 +96,22 @@ static int lz4hc_compress(struct zcomp_params *params, = struct zcomp_ctx *ctx, static int lz4hc_decompress(struct zcomp_params *params, struct zcomp_ctx = *ctx, struct zcomp_req *req) { + struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, - req->dst_len); + if (!zctx->dstrm) { + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); + } else { + /* Dstrm needs to be reset */ + ret =3D LZ4_setStreamDecode(zctx->dstrm, params->dict, + params->dict_sz); + if (!ret) + return -EINVAL; + ret =3D LZ4_decompress_safe_continue(zctx->dstrm, req->src, + req->dst, req->src_len, + req->dst_len); + } if (ret < 0) return -EINVAL; return 0; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7CE211D6DD4 for ; Mon, 2 Sep 2024 10:57:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274672; cv=none; b=PBmbKpz/bHuv+5X5Wy3qs5OSL4LNTtmPPa5qG2R8RodddfKU6ZVdj7VOitqo9Grx7O2N56Pn1uUkO+5OI5ZOKjyjdmodSJLBs+FNtTrAaBV4NMNQFoy5OYyzLTe+OC9dHQ1kPDJdy9SV5ai0U6tILXHiUa/jorUuuO+cpKT3ycc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274672; c=relaxed/simple; bh=LxK7yxVOuU/Mf7+dft522QNvM0qcckmP8rj7nOwAApM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=osObUw71EjJpM8cD9aCLl3dIpDXa23R5zP9inlATYyZra8uHRR/Lcn7K2751KII/sWuFusSMn/WdMdxZH3GxX6+O+H2dsNP2aKFM+90DoyzGvDSSu1LDOS9FzD7XP3DNDYXwxKIf8EYUMvOAiEfBWyTM3D/DGoWWYmF/yBBHEgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=QYw+kCS/; arc=none smtp.client-ip=209.85.215.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="QYw+kCS/" Received: by mail-pg1-f193.google.com with SMTP id 41be03b00d2f7-7cda0453766so1297775a12.2 for ; Mon, 02 Sep 2024 03:57:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274670; x=1725879470; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cbR1gFo0yq5XvwmrFtnpkMRAOk31bpE/Kw6nP8TwsWk=; b=QYw+kCS/twM1soIvTM8zf+jEQuFYosUPLpI2tUwHtZ8arinyPZ1Z3LbJbHJwtyoE6d G2cZqU6ZolMTLfrB9fDhas5LHobhwJ5yIq/xdllMyAPrrtdTkIOU0XOmw+Royn4Z6MuT aDGhVCjGmbonkk0nUxw23GxoCWszqQ73B/Oa8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274670; x=1725879470; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cbR1gFo0yq5XvwmrFtnpkMRAOk31bpE/Kw6nP8TwsWk=; b=U1OOjhg9YWFBW0ATC6vNFyT7b/LIsKpDYusIfnzZjAa42QyKVsdZ7Zd3UDTIiRu8TM 4TPlG5WBwmwulA1eCHpTypQ7XUibfwgguBB6doL6aGAix4xPn2jZoE66eU+fEMMPXUxJ UChAHEWuGCRDnUfgLFskr04bh2fWZmTFZS9fwRr0Z5vmeV4f2I63yTMKi2ymr5FJI28z sGLSKaUi2Yt/8uXpuRQxUXOlEXEQHX3QuNjZT81ELySimC/45N/GN5JYAbdrjsDeO4re aV78Eo0eq8Nba7LCOkr47vPs/3aQswlMjPwyI82lsIS59+dG5Ipak9SIkYhiFUt95b77 XEzQ== X-Forwarded-Encrypted: i=1; AJvYcCXlVuMUZ8SyIRCEqg4VMftdkHcAryMeDiGdLmyxMQyJNPIqzyHBdewugdgC2ti4ZyeeD8c4LE/38kAcXMo=@vger.kernel.org X-Gm-Message-State: AOJu0YzEOMyY6rqQ7A0t2B47sRBg2NJsYrDs234/WMLItLOOsBqbtPuX Iit0rK0NibghmBmo1XZ6s51x0AqoyiVb+XZ4jnooak0xqkcwLdDrKapDkhXu5WEyMol03D0oV3v eWbXn X-Google-Smtp-Source: AGHT+IFwfHrqJ2bHzNS/FwApFbvO9Bo6qKdoRwnyVi41LA71Z2a0ug42iBISEEf2FYdsuSJN+d+54A== X-Received: by 2002:a05:6a21:151a:b0:1c6:ae03:6882 with SMTP id adf61e73a8af0-1cce10038ebmr14285361637.9.1725274669771; Mon, 02 Sep 2024 03:57:49 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:49 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 22/24] zram: add dictionary support to zstd backend Date: Mon, 2 Sep 2024 19:56:10 +0900 Message-ID: <20240902105656.1383858-23-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This adds support for pre-trained zstd dictionaries [1] Dictionary is setup in params once (per-comp) and loaded to Cctx and Dctx by reference, so we don't allocate extra memory. TEST =3D=3D=3D=3D *** zstd /sys/block/zram0/mm_stat 1750654976 504565092 514203648 0 514203648 1 0 3420= 4 34204 *** zstd dict=3D/etc/zstd-dict-amd64 /sys/block/zram0/mm_stat 1750638592 465851259 475373568 0 475373568 1 0 3418= 5 34185 *** zstd level=3D8 dict=3D/etc/zstd-dict-amd64 /sys/block/zram0/mm_stat 1750642688 430765171 439955456 0 439955456 1 0 3418= 5 34185 [1] https://github.com/facebook/zstd/blob/dev/programs/zstd.1.md#dictionary= -builder Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_zstd.c | 150 ++++++++++++++++++++++++------ 1 file changed, 124 insertions(+), 26 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 5b33daf4f645..1184c0036f44 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -15,29 +15,87 @@ struct zstd_ctx { }; =20 struct zstd_params { + zstd_custom_mem custom_mem; + zstd_cdict *cdict; + zstd_ddict *ddict; zstd_parameters cprm; }; =20 +/* + * For C/D dictionaries we need to provide zstd with zstd_custom_mem, + * which zstd uses internally to allocate/free memory when needed. + * + * This means that allocator.customAlloc() can be called from zcomp_compre= ss() + * under local-lock (per-CPU compression stream), in which case we must use + * GFP_ATOMIC. + * + * Another complication here is that we can be configured as a swap device. + */ +static void *zstd_custom_alloc(void *opaque, size_t size) +{ + if (!preemptible()) + return kvzalloc(size, GFP_ATOMIC); + + return kvzalloc(size, __GFP_KSWAPD_RECLAIM | __GFP_NOWARN); +} + +static void zstd_custom_free(void *opaque, void *address) +{ + kvfree(address); +} + static void zstd_release_params(struct zcomp_params *params) { - kfree(params->drv_data); + struct zstd_params *zp =3D params->drv_data; + + params->drv_data =3D NULL; + if (!zp) + return; + + zstd_free_cdict(zp->cdict); + zstd_free_ddict(zp->ddict); + kfree(zp); } =20 static int zstd_setup_params(struct zcomp_params *params) { + zstd_compression_parameters prm; struct zstd_params *zp; =20 zp =3D kzalloc(sizeof(*zp), GFP_KERNEL); if (!zp) return -ENOMEM; =20 + params->drv_data =3D zp; if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) params->level =3D zstd_default_clevel(); =20 zp->cprm =3D zstd_get_params(params->level, PAGE_SIZE); - params->drv_data =3D zp; + + zp->custom_mem.customAlloc =3D zstd_custom_alloc; + zp->custom_mem.customFree =3D zstd_custom_free; + + prm =3D zstd_get_cparams(params->level, PAGE_SIZE, + params->dict_sz); + + zp->cdict =3D zstd_create_cdict_byreference(params->dict, + params->dict_sz, + prm, + zp->custom_mem); + if (!zp->cdict) + goto error; + + zp->ddict =3D zstd_create_ddict_byreference(params->dict, + params->dict_sz, + zp->custom_mem); + if (!zp->ddict) + goto error; =20 return 0; + +error: + zstd_release_params(params); + return -EINVAL; } =20 static void zstd_destroy(struct zcomp_ctx *ctx) @@ -47,8 +105,23 @@ static void zstd_destroy(struct zcomp_ctx *ctx) if (!zctx) return; =20 - vfree(zctx->cctx_mem); - vfree(zctx->dctx_mem); + /* + * If ->cctx_mem and ->dctx_mem were allocated then we didn't use + * C/D dictionary and ->cctx / ->dctx were "embedded" into these + * buffers. + * + * If otherwise then we need to explicitly release ->cctx / ->dctx. + */ + if (zctx->cctx_mem) + vfree(zctx->cctx_mem); + else + zstd_free_cctx(zctx->cctx); + + if (zctx->dctx_mem) + vfree(zctx->dctx_mem); + else + zstd_free_dctx(zctx->dctx); + kfree(zctx); } =20 @@ -63,28 +136,41 @@ static int zstd_create(struct zcomp_params *params, st= ruct zcomp_ctx *ctx) return -ENOMEM; =20 ctx->context =3D zctx; - prm =3D zstd_get_params(params->level, PAGE_SIZE); - sz =3D zstd_cctx_workspace_bound(&prm.cParams); - zctx->cctx_mem =3D vzalloc(sz); - if (!zctx->cctx_mem) - goto error; - - zctx->cctx =3D zstd_init_cctx(zctx->cctx_mem, sz); - if (!zctx->cctx) - goto error; - - sz =3D zstd_dctx_workspace_bound(); - zctx->dctx_mem =3D vzalloc(sz); - if (!zctx->dctx_mem) - goto error; - - zctx->dctx =3D zstd_init_dctx(zctx->dctx_mem, sz); - if (!zctx->dctx) - goto error; + if (params->dict_sz =3D=3D 0) { + prm =3D zstd_get_params(params->level, PAGE_SIZE); + sz =3D zstd_cctx_workspace_bound(&prm.cParams); + zctx->cctx_mem =3D vzalloc(sz); + if (!zctx->cctx_mem) + goto error; + + zctx->cctx =3D zstd_init_cctx(zctx->cctx_mem, sz); + if (!zctx->cctx) + goto error; + + sz =3D zstd_dctx_workspace_bound(); + zctx->dctx_mem =3D vzalloc(sz); + if (!zctx->dctx_mem) + goto error; + + zctx->dctx =3D zstd_init_dctx(zctx->dctx_mem, sz); + if (!zctx->dctx) + goto error; + } else { + struct zstd_params *zp =3D params->drv_data; + + zctx->cctx =3D zstd_create_cctx_advanced(zp->custom_mem); + if (!zctx->cctx) + goto error; + + zctx->dctx =3D zstd_create_dctx_advanced(zp->custom_mem); + if (!zctx->dctx) + goto error; + } =20 return 0; =20 error: + zstd_release_params(params); zstd_destroy(ctx); return -EINVAL; } @@ -96,8 +182,14 @@ static int zstd_compress(struct zcomp_params *params, s= truct zcomp_ctx *ctx, struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 - ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, - req->src, req->src_len, &zp->cprm); + if (params->dict_sz =3D=3D 0) + ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, + req->src, req->src_len, &zp->cprm); + else + ret =3D zstd_compress_using_cdict(zctx->cctx, req->dst, + req->dst_len, req->src, + req->src_len, + zp->cdict); if (zstd_is_error(ret)) return -EINVAL; req->dst_len =3D ret; @@ -107,11 +199,17 @@ static int zstd_compress(struct zcomp_params *params,= struct zcomp_ctx *ctx, static int zstd_decompress(struct zcomp_params *params, struct zcomp_ctx *= ctx, struct zcomp_req *req) { + struct zstd_params *zp =3D params->drv_data; struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 - ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, - req->src, req->src_len); + if (params->dict_sz =3D=3D 0) + ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, + req->src, req->src_len); + else + ret =3D zstd_decompress_using_ddict(zctx->dctx, req->dst, + req->dst_len, req->src, + req->src_len, zp->ddict); if (zstd_is_error(ret)) return -EINVAL; return 0; --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9EB5718593F for ; Mon, 2 Sep 2024 10:57:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274674; cv=none; b=RwZb3xLFZF92WB3NO8/ItBtti5n5HPVXQ1FZzPJzdjQrDy9ZrhJFYkyEvNKDeJvz9k3iMPsTMTXNaiWHmfj3mZ9F9C47hOMSiDk8v7IAu6FR9m+1ncbVlAngCEn4GB6PMJtDf+pnjZ9YUNzKofrehGCGhXF5SwUcelR24HXTsTI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274674; c=relaxed/simple; bh=AE/WqtEbSPbB0Mv5p05o8b8pv0X98CUBbHDhrjrLRmM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FQ2gzzbBmkr93Esd/KA0wwi/PqdqX/Tl+RQr8vKdGxb8wURsZMWow+7PaF55RToD1dx24atqgAouXdqnlTPTkFIK+GbXM5qGh+H/U1e0EVJ7tybF4u28XI4bKiJ3TWXmVVPEKIKtYxMdrBVmDuLfWCOqZShkAVQyISxjVQFXUdk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=jxx5XrW2; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="jxx5XrW2" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-6c5bcb8e8edso2982855a12.2 for ; Mon, 02 Sep 2024 03:57:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274672; x=1725879472; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KbZNPChlJKjfmmUIfS51iuf6pveXQDG6PrtZ+3HXZQQ=; b=jxx5XrW2V8Xz391spZZI6jdMiOsvr1uA+VISCPet9iXV0WUg0JUt1Pae4mBBQLb1yX 1SNxZCfgtfTL9aeXWdmsAQgFOry36zGNkB01m7ZYTt+wvabaHlthD9oaM4aqcnclIT3o t03/b8s74zbV70FLIJmNCrloUc0rhQZnkCCJg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274672; x=1725879472; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KbZNPChlJKjfmmUIfS51iuf6pveXQDG6PrtZ+3HXZQQ=; b=ddp00SHIVD/1YTRC/CMvXOR/j8Gyg1QefKqRGl6zhX1dyAy4BPNtX+BVP2TSIisEip gtGDFmfr++YY4fOSkiiCM8sjH2DVynbf9iviP9bp6LTIDQM2NmRJJJlMs89w5WGpqzLd wGYmQybiC+froj8LBZ9oGkwmUczZ5wZmFx+vxU2nv7ogJuSRuz0F1mMVhE+s2U0b+/GU SB5K1QYc6dMc6+eGrctpb0RtPsfKXMtJFeqv1BU0jcYoxYELhzWQbldp5a1mdAy5uVZY ivVN+zy1i0Lyme5ZGbONTwiErC2YpaqY4zDts4lF9CWYSkCWwTXVM3TSCc2zeK+8jhLW eLRw== X-Forwarded-Encrypted: i=1; AJvYcCXzdEAk+Bwzs0mIgUQsZdGJlhNPJTvqdPpIcAZ+v60u480ssIrN2Qvh+NR//SOiCnoWL3XN/kza3sJcsHU=@vger.kernel.org X-Gm-Message-State: AOJu0YyJBzuKuezVbqn7zeQW4XkeAqA9p0kRRikdUlkqOaL1kEiYOk0e Wr+dTJmkkv50SVkXV2nTJoqSBbIe6dOFUgeuV+/FZBfrjm6iP9Wusz5gTxxSNQ== X-Google-Smtp-Source: AGHT+IFNEGLegGQuWu7zwaVsoGnyvcQAlLtRk74EzF4/gmOT8492xTQO7/i7mwQV/rFSW9WT2dW9ow== X-Received: by 2002:a05:6a21:9688:b0:1cc:e9bc:2567 with SMTP id adf61e73a8af0-1cecdf2955fmr10375322637.24.1725274671859; Mon, 02 Sep 2024 03:57:51 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:51 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 23/24] Documentation/zram: add documentation for algorithm parameters Date: Mon, 2 Sep 2024 19:56:11 +0900 Message-ID: <20240902105656.1383858-24-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Document brief description of compression algorithms' parameters: compression level and pre-trained dictionary. Signed-off-by: Sergey Senozhatsky --- Documentation/admin-guide/blockdev/zram.rst | 45 +++++++++++++++++---- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 96d81dc12528..bb52d2fc0587 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -105,7 +105,38 @@ Examples:: For the time being, the `comp_algorithm` content shows only compression algorithms that are supported by zram. =20 -4) Set Disksize +4) Set compression algorithm parameters: Optional +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Compression algorithms may support specific parameters which can be +tweaked for particular dataset. ZRAM has an `algorithm_params` device +attribute which provides a per-algorithm params configuration. + +For example, several compression algorithms support `level` parameter. +In addition, certain compression algorithms support pre-trained dictionari= es, +which significantly change algorithms' characteristics. In order to config= ure +compression algorithm to use external pre-trained dictionary, pass full +path to the `dict` along with other parameters:: + + #pass path to pre-trained zstd dictionary + echo "algo=3Dzstd dict=3D/etc/dictioary" > /sys/block/zram0/algorithm_par= ams + + #same, but using algorithm priority + echo "priority=3D1 dict=3D/etc/dictioary" > \ + /sys/block/zram0/algorithm_params + + #pass path to pre-trained zstd dictionary and compression level + echo "algo=3Dzstd level=3D8 dict=3D/etc/dictioary" > \ + /sys/block/zram0/algorithm_params + +Parameters are algorithm specific: not all algorithms support pre-trained +dictionaries, not all algorithms support `level`. Furthermore, for certain +algorithms `level` controls the compression level (the higher the value the +better the compression ratio, it even can take negatives values for some +algorithms), for other algorithms `level` is acceleration level (the higher +the value the lower the compression ratio). + +5) Set Disksize =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Set disk size by writing the value to sysfs node 'disksize'. @@ -125,7 +156,7 @@ There is little point creating a zram of greater than t= wice the size of memory since we expect a 2:1 compression ratio. Note that zram uses about 0.1% of= the size of the disk when not in use so a huge zram is wasteful. =20 -5) Set memory limit: Optional +6) Set memory limit: Optional =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =20 Set memory limit by writing the value to sysfs node 'mem_limit'. @@ -144,7 +175,7 @@ Examples:: # To disable memory limit echo 0 > /sys/block/zram0/mem_limit =20 -6) Activate +7) Activate =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 :: @@ -155,7 +186,7 @@ Examples:: mkfs.ext4 /dev/zram1 mount /dev/zram1 /tmp =20 -7) Add/remove zram devices +8) Add/remove zram devices =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D =20 zram provides a control interface, which enables dynamic (on-demand) device @@ -175,7 +206,7 @@ execute:: =20 echo X > /sys/class/zram-control/hot_remove =20 -8) Stats +9) Stats =3D=3D=3D=3D=3D=3D=3D=3D =20 Per-device statistics are exported as various nodes under /sys/block/zram<= id>/ @@ -277,7 +308,7 @@ a single line of text and contains the following stats = separated by whitespace: Unit: 4K bytes =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D =20 -9) Deactivate +10) Deactivate =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 :: @@ -285,7 +316,7 @@ a single line of text and contains the following stats = separated by whitespace: swapoff /dev/zram0 umount /dev/zram1 =20 -10) Reset +11) Reset =3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Write any positive value to 'reset' sysfs node:: --=20 2.46.0.469.g59c65b2a67-goog From nobody Wed Dec 17 08:57:15 2025 Received: from mail-oa1-f42.google.com (mail-oa1-f42.google.com [209.85.160.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1039E20010C for ; Mon, 2 Sep 2024 10:57:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274676; cv=none; b=I7krXVelDJWmAFc/NUkdlbdu7I+FlrTpZ70kiO4k1c+uMPXb23tmFJfS9W1s1/Yj4EKHHE5w5kh5pDPA4ZCtKnLeGqQLesMd9faohTZorZUPijifiLmOr85hnYsu6l7vUArBwAk3bgPerNAXHSxy/LGxtmapjOIeLzNilElxpco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725274676; c=relaxed/simple; bh=R3mOJ0tg7Pga0e0/mL08j7cxX2XkXKFhyGbziepUW8M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HsBwdaAO1LBKwg34F341BlFtvGL1CYdozt6OBUa/qxuCmEOc/02ESBpXZVWh0/wijEfzV6bHcUdpe7/tnlr8VvP5IqGSWayGzJLLO2xcvVCOu6+u+Fi1g1EVO2JhFt+c+G90dkAfjepKXynIAivfbJCIHWZm0LmpH/QIn47k1U8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=nOIbsf9Z; arc=none smtp.client-ip=209.85.160.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="nOIbsf9Z" Received: by mail-oa1-f42.google.com with SMTP id 586e51a60fabf-2705d31a35cso2467911fac.0 for ; Mon, 02 Sep 2024 03:57:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1725274674; x=1725879474; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ANQ7nNmlnnrCWKC9y2AnQPhj4CrEHBm/AtpIgpKbHKg=; b=nOIbsf9ZfFhtDKrmbnKDWXONT5p+exmcWbxobhdxkVAcR4s52H3abjN68Dl85c1udf LYC4gR97ovdEWP4gATGPbVjGliH44rIyPODp7NUZC3NX4cCKQt4IlqUGstj5ni/O2zpN qhw8Wnn6LjpkVOMIR/0hoKDEkv+2zDnMnehc4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725274674; x=1725879474; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ANQ7nNmlnnrCWKC9y2AnQPhj4CrEHBm/AtpIgpKbHKg=; b=DjLhqXCH4T3/qreI8luNOZSuUQ+44aRzYbPuWFJ/RF5YXdPKUzWPrhJTfzpoB5qRQP ycbre4yC6fwopjoA1YAv4KM7MYRXNVVu0A3P4eAj5TOL2MmqzUFxLj05CB9+hjOjk2xL TpXEKbKMrOv9AbVKcAxpzxmqM71ET26WQcVAkbusgmkHWh7M/7jN1JUX3bKHm0fGv40O vg8zbfrLeH4WGMvHH6SIH/zPt9cnn7tuyKDeSpbMWZocyeWMPGkh8GnxkIF0Pjr3YiPl m8cMWzH/BmDGERwjUIYMM2Qc/EH2VWrPBRxPK9nJFQkDrG8/tgRRw8+vF4XrEJQ/A0Gp gIrg== X-Forwarded-Encrypted: i=1; AJvYcCVoWC10Po5PA3hYEakxf6BBmmV+9OstczA6MdUw6N7Wwk2RzLG/ajwLQK2Ui6ln+1MrB88MWz5jUW05WIo=@vger.kernel.org X-Gm-Message-State: AOJu0YwzLTroFwFk2ODPLy7LBAM10ZXpiS2KeM9zViUkgZeVLZHqfn4d DMyDdEGutTA4qDkDvPPiHPucOyNIQVABquaRGngAMZsA531ored9y3rOdtblOw== X-Google-Smtp-Source: AGHT+IHfFvHGTiw+yEI4r1FIWoqKufWTfDqAXp7jaziqaBKtGOEA95/l3uaagE8pIbNfk15h7FbRsw== X-Received: by 2002:a05:6870:1f0d:b0:270:463e:4b72 with SMTP id 586e51a60fabf-277ccbed82emr7661252fac.20.1725274673994; Mon, 02 Sep 2024 03:57:53 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:43a1:71e3:7464:e91b]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a51e9sm6633769b3a.78.2024.09.02.03.57.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 03:57:53 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv7 24/24] zram: support priority parameter in recompression Date: Mon, 2 Sep 2024 19:56:12 +0900 Message-ID: <20240902105656.1383858-25-senozhatsky@chromium.org> X-Mailer: git-send-email 2.46.0.469.g59c65b2a67-goog In-Reply-To: <20240902105656.1383858-1-senozhatsky@chromium.org> References: <20240902105656.1383858-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" recompress device attribute supports alg=3DNAME parameter so that we can specify only one particular algorithm we want to perform recompression with. However, with algo params we now can have several exactly same secondary algorithms but each with its own params tuning (e.g. priority 1 configured to use more aggressive level, and priority 2 configured to use a pre-trained dictionary). Support priority=3DNUM parameter so that we can correctly determine which secondary algorithm we want to use. Signed-off-by: Sergey Senozhatsky --- Documentation/admin-guide/blockdev/zram.rst | 5 ++++- drivers/block/zram/zram_drv.c | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index bb52d2fc0587..bbb1b1b8f10e 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -512,11 +512,14 @@ registered compression algorithms, increases our chan= ces of finding the algorithm that successfully compresses a particular page. Sometimes, howev= er, it is convenient (and sometimes even necessary) to limit recompression to only one particular algorithm so that it will not try any other algorithms. -This can be achieved by providing a algo=3DNAME parameter::: +This can be achieved by providing a `algo` or `priority` parameter::: =20 #use zstd algorithm only (if registered) echo "type=3Dhuge algo=3Dzstd" > /sys/block/zramX/recompress =20 + #use zstd algorithm only (if zstd was registered under priority 1) + echo "type=3Dhuge priority=3D1" > /sys/block/zramX/recompress + memory tracking =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 9b29f9e6cb50..1f1bf175a6c3 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1855,6 +1855,18 @@ static ssize_t recompress_store(struct device *dev, algo =3D val; continue; } + + if (!strcmp(param, "priority")) { + ret =3D kstrtouint(val, 10, &prio); + if (ret) + return ret; + + if (prio =3D=3D ZRAM_PRIMARY_COMP) + prio =3D ZRAM_SECONDARY_COMP; + + prio_max =3D min(prio + 1, ZRAM_MAX_COMPS); + continue; + } } =20 if (threshold >=3D huge_class_size) --=20 2.46.0.469.g59c65b2a67-goog