From nobody Mon Feb 9 01:17:39 2026 Received: from mail-yb1-f172.google.com (mail-yb1-f172.google.com [209.85.219.172]) (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 5983C179BD for ; Sat, 6 Jul 2024 04:56:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241815; cv=none; b=cmBnX9Rx2Y3H2eO6xXkNqYl6kooYZBr6sq5xhYlbplOlro8+nX0McziR0/IVTOXX6AuNqEwFj5jZ6emfldyAd3D8MXaGfvzx3lzH6lVfGZZlTtGKucqUU2L6K3fCbS91HYp2X/zEPgbTwNSO2eid3QfulQrVIl04gpzjNlEgpR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241815; c=relaxed/simple; bh=KyGV4AYcEPRm/POvoqKx7aNG19FSKEaNYd+Q68r51/8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RGbD+IEU97D/SQPHUd33Oo5p+1zAkO0hz3yzabMWLAyzYCbcJBFRky1SdDx46BqQ28q962PXey3nNVoH5bMFMm6+u64p5YHMt8thfVx2dIK6DE3EBqqcIg6Dyrrq+0YmTXRu8ZgGvVc411xD2Xo4eTwsQ4JRveB5uoW2Q9Xi2ko= 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=UJ5n50Of; arc=none smtp.client-ip=209.85.219.172 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="UJ5n50Of" Received: by mail-yb1-f172.google.com with SMTP id 3f1490d57ef6-e03a63ec15eso2180393276.1 for ; Fri, 05 Jul 2024 21:56:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241812; x=1720846612; 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=AbFfs14998ar2wUnE0RQCgPBaSYreabWRIGc1xBbPLE=; b=UJ5n50OfpIEcOM9BB1B4G1pkegdSYLz/yYs5WRmn78I05pvnAOxyVn4HdhC7FOB0gY y6yyuYocfpfIaywnr9J+gyUPtSh0xcm86Otn6ovAOL1iTSk3d7oUF2dMqDIrdy7ZlIH5 Srw3MsHtMUpFW4aais8e6qjEUh5Vp5Hh71rVA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241812; x=1720846612; 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=AbFfs14998ar2wUnE0RQCgPBaSYreabWRIGc1xBbPLE=; b=Klip04MCz65IPk9Y2Y7KsJpaRs3fal2wb4F4BkYbW79jp8IvO83bH8dQSC4BuzHfo0 9W+b6D6Pn+368gSQB5lp+6E/hOltizduUBqkKSOKyNd2Fs+l1ZR28Bak5jCqS98o0QFJ Glza8eFn6jDk0QjEA53v0Vs2fkJSTOMTbkQzBEQEkXoHr/8LKOTfd9H1wJkj9Kyg+F/v njByIWd2fqdREjLjgWiQzKnEX/uD4V2/ZWfDQWnWcYJZ1VMqirjx7iKDCLcD02udWOE0 wb30k5SBVLMKAPqLKqtMFBU+j+6Sc913XdWD0hIWZRCb0chmhQguqZ+/0wbkB8ZGrlqp ocKQ== X-Gm-Message-State: AOJu0Yz/PSPSsTzAaJj3VJHjy02qbqUrdIYUZnRyWQjBC5/n80aFfM92 Rm/lbV709ouiIT0IcqV7PFKUOrByZATn0eizj8j6G7h3Cg78mEEZwJiLUenHdD4DO9PXl98+tx8 gOA== X-Google-Smtp-Source: AGHT+IFCy3ZU69dZ37ljbfVnSDIqLCByLwgRqsEkAa1FPqGsL1mAniaKeM5tPpFKv+EuiCsMJTMGUg== X-Received: by 2002:a25:5f07:0:b0:e03:a6b3:9f28 with SMTP id 3f1490d57ef6-e03d9993483mr3495499276.10.1720241812186; Fri, 05 Jul 2024 21:56:52 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.56.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:56:51 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv5 01/23] lib: zstd: export API needed for dictionary support Date: Sat, 6 Jul 2024 13:56:03 +0900 Message-ID: <20240706045641.631961-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 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 600DA18EA8 for ; Sat, 6 Jul 2024 04:56:55 +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=1720241816; cv=none; b=u5vF5plZwbBqRERH/ik1MrGMBj0CUSR0mufZW+nE0tvodcN38SxOuBv9JVdcT5Wc35mmaJJ5RfjxucgF6vSTBk/CFAGkdpk79h/7Ge6nNIG/RUqlM4oiBV0EZ7OE8YZ+xhADpyBkgaFD77gKF2Xa0R8jcs/WHIS7Cq1+isYFwsY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241816; c=relaxed/simple; bh=TW8IWpx+kWbsEG+EhKN0puvD0sZJLuyE33r66GzEHKA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bPJ3WCg2Becs6/NbHpNFmBevTqU1svBN7J6rvU7b+a53cki0CQJ4Xv/Rv3gkvhd04HoztnhYT6BGilYqSUuQJrpMDLzE5SIwtiYAGnDOHPGplsWlqFVlt0bgH8KklDzefWx/3uPLi+2qUJr/Dmv9XnG3CSjJsZG1fulXrv5WFBw= 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=McJeecHS; 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="McJeecHS" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-70af81e8439so1840316b3a.0 for ; Fri, 05 Jul 2024 21:56:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241814; x=1720846614; 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=/FXjjKFQQ/AAI7tVJvwr6gZnCUjSgAdFHQ4h4smS3cs=; b=McJeecHSwVF1yv8VIpWxOJqxNPb44hm1IKR0u+Vp2iIv5CIqwVojRmWMT/s3HhDnkt HqAgeVu/573/X98Fd4dtP4HCUHS2hipNEQiswsnvrmCNJ46tg4tfXO6YXvJt9OmqCrdX OEAer+tFK6eb+XP+pW5akf8/PR2MrVFI3xV+w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241814; x=1720846614; 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=/FXjjKFQQ/AAI7tVJvwr6gZnCUjSgAdFHQ4h4smS3cs=; b=M2vDd+tH++6oPRY7Dv+RZLaCNAQ3p/T424yGZtyb+rGXV7ifK1lxUXdObJAYApj3gm C72HN7S1SnE1rRhmS0nkxOZ4P+j7xSPw+vNwV0upHa8BI/2lbmfJz1k8JVEYQq/AIM8l vENBtL8mbQ0VHvve4wLTiaAH1x7mK/yVR8E4yDpA7PYTvifP8a7mLL9TqSw3qQqSyvXz 2xm3NIdKweZbD44nfHmKKDOoqS7+gURfFgVKbthNe6BMVCkSzFWCoplrORrBwi4SCL5T S33V3uR1NY6MUoArLQ8x0FR+EUiZkBFZJk4ULKpFtJ2pMMUCJcsUuaVZIokxID1Q0c3+ TP7Q== X-Gm-Message-State: AOJu0Yw8qatF3DH0jXKsuze5wRQ4cwxqLLRIpbwpvQDv8/BzBNvAh7H6 TokvkuWpE4NUvjO/vV63g0C7qJH+03ooSjKjm4VdFBlbZJiUfwRKAqcPiOVdww== X-Google-Smtp-Source: AGHT+IG1uu9EeufS7V2p8jG+wHETC2wQx4NYEmGYvO/CDixqNrUGPN9y8xNRWmR8SgshWuZeDtrZ/Q== X-Received: by 2002:a05:6a00:3306:b0:704:37b2:4ced with SMTP id d2e1a72fcca58-70b00945e6emr8066889b3a.11.1720241814560; Fri, 05 Jul 2024 21:56:54 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.56.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:56:54 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv5 02/23] lib: lz4hc: export LZ4_resetStreamHC symbol Date: Sat, 6 Jul 2024 13:56:04 +0900 Message-ID: <20240706045641.631961-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-oo1-f49.google.com (mail-oo1-f49.google.com [209.85.161.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 F08221C697 for ; Sat, 6 Jul 2024 04:56:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241819; cv=none; b=eByWAfOO6NN8FKdGID4gtku6BgrjT3La4PXgfRQdbaInfLLQ3B3oLZlnlrg9qd4iPXaoA24uUWr9ViiLb/yyawONeHd7N+BqJ8lqzuwXNZ3Si1vy7Q4bRJhWWiU315JhUTDQXPwl4T6BLca1yzx+0wbfstV7Ym++0R61/LykQi4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241819; c=relaxed/simple; bh=AxI1yOXfNzixZbRuyuo/WRbDbgz5hU/FIRLKw3O+4EY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eiEA07OY5qamJ4cbdFyIon+S5ZhcZIfo5RSimajOzKateH+tL0lkw9BaBUhwj197ipVosnlIR3gwvcplVi4kCOvywvQWs4KqO5rHo/9RaOxigLPZN3MhddihCKAm8FciwXh3Itkbltpx/hNulqhWi3O6CWNv/DetTU1kjVBjykg= 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=UX8q+ONy; arc=none smtp.client-ip=209.85.161.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="UX8q+ONy" Received: by mail-oo1-f49.google.com with SMTP id 006d021491bc7-5c651c521f2so797276eaf.1 for ; Fri, 05 Jul 2024 21:56:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241817; x=1720846617; 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=jf1Swlc+GcHPMZi81XclrU8zJMIYY20nEHE2YL4cnE0=; b=UX8q+ONyyCOhy/HNFav0eOTF+1tdlmNRISDBfdAbY5gc1l8NAw2vLtkyG6V4EAtMIj kKYFzyPLMhQm71Bo95BjgH5lNCqwHELZhxRQid2aJiB18pEKx6qWPp0cRvU1bz3j5pZ0 YLi+jSwjPz3XWWZ4CnEgSGndsd9K2wHsiGTDQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241817; x=1720846617; 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=jf1Swlc+GcHPMZi81XclrU8zJMIYY20nEHE2YL4cnE0=; b=dfcXfsbdNpWVgpaQ5V5uG/1LNkeprh+qHtdmJpLfAslpXSxMIvE52WMtklnIcKdatH 6e6TIQXOHrxUpqlcBJh1vt8MYhpdFqv2uE/ZYZfUaypuCswtTuaT/Sf38d1Vu4etOzKB uNLOCF0+lI3p1D2aP4LJgULYnJ5EijoGSiV36kIeJS6t++jhArFdAMX1S2zsYlh4O+yL 2A4aHGUSWZkEO7KtX+CfiHrslWMCA0jp9d3w7NbBaIxD7mJdofwDbyJh8skq0Kf3kylL 4izAyGBLzw3NcG1G/7ljAWL8FZPmShmeb6lWwhYxNDZSMSABQi/+/lQnSm/+CEut3qkJ zzXw== X-Gm-Message-State: AOJu0YwgdhxRnQr5h+vodYyuqKCoXrEGmvCujK448X3WCj1U1/5M/4dv TTzntljatzPmil3xdSFNCTLfTg6URBBBnRYPqqH2E6V+uy8QuULfDt31NOtBqQ== X-Google-Smtp-Source: AGHT+IF+tti8aMl4R/ryaZBrmJNkrtaFNv3vJz5tuQqhihSxL1fkpB0i/XD2WlUyxrwEoXsjSzAzgQ== X-Received: by 2002:a05:6870:9706:b0:25a:eca3:6b58 with SMTP id 586e51a60fabf-25e2bea664fmr5737810fac.43.1720241816931; Fri, 05 Jul 2024 21:56:56 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.56.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:56:56 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv5 03/23] lib: zstd: fix null-deref in ZSTD_createCDict_advanced2() Date: Sat, 6 Jul 2024 13:56:05 +0900 Message-ID: <20240706045641.631961-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 D0BE51CD31 for ; Sat, 6 Jul 2024 04:56:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241821; cv=none; b=G3RepbuyUEal/W2Ld1FuhXVttWlN0PjgSD/rH4stffWoUoFt7FIMrVeHde3nZzH3x8iRdJl2/9dV7K3DtxgXORgYqa7nc+pSXsp8yBD4jvBLgrsuyGBFkdFRAXxTbZXbGN1HjodzBlrKo7Pzk1gPpJVGVv/vL39BfbgLXvitWZU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241821; c=relaxed/simple; bh=M9pc+U462otBmyCGF82RSB362L3Cc0jrA10xEuzqAC8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TePlox0buCvFSaXwU1NgUUEQmCGOLqoIrCtwQRKWTe9lDF7dL/ckmbIJcGAOMvT6o+YlN6fbOZ2MnRJDuhg9OLjQ2WtQfERUxuySTv5p0qgzx9eABFtZgI7jiVoZ3MImF35j+zLsSq+THGWPhXJgcADYbXXfNQXZ7BQYB+TIi0w= 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=KcoxEo4Q; arc=none smtp.client-ip=209.85.210.180 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="KcoxEo4Q" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-70b0d0fefe3so981877b3a.2 for ; Fri, 05 Jul 2024 21:56:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241819; x=1720846619; 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=x441/jctiZDhLwO/5h6POdMEIGSeyDo7GTcWYKMYAC4=; b=KcoxEo4Qi7Fl+Btv615G4muK3UNc4melK8Y9JGlNRtolo/KoBv79h7LU1Fde9itbb4 JuijTasdAp9Ko30hJZO3zeziXPHqeeS2aSPNbW6Z7NCdhXDv23KTuqYi+iGYw1J9+1G1 zs7jFh25/KixZRW+XKek42PBWfe0khAgzSQN4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241819; x=1720846619; 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=x441/jctiZDhLwO/5h6POdMEIGSeyDo7GTcWYKMYAC4=; b=CQPy4pHGz6JBePqUvRa+I5trbYnNfb4SMoTKXkmt0oO/iImPmi0mpBhxemHhudeKWe v0ysqXrIsYmZTOGgJgrpqDpUljjUmmHjMjQAOeolSt0RwHjm7k9M4CmPMMHzInB3lVFR vX2DNMsrna8gJn61SDNRul/IZQPA9ea9yLZOChIDcNCasNQpKfmCvmTBXcBZKJcUwczp MZzfKgcC2uK9DuIXhN/xUKktGV/PFThjbB4QmAp3rA+YFxEopdRRhULuCpxJUU2JA1uU WOOn/w1KsqBd6IDK5pGqRlHdhRBjl8cvv6RnpL175LSpgi4lvFcRg0ZT/VWKHYVh8JJ+ GJvg== X-Gm-Message-State: AOJu0YxvTC6SvbcPryUIT/LiqlqMXKtW5+IX5JypMH3CqZyL2rD0e25r lUiTkEx9BsOvmWdIbsUx0N30juYLrxjgZg9szWf8L43oQDznD0qRg94XRUJVEA== X-Google-Smtp-Source: AGHT+IG+gJSEP9d052qSS4jde55lfIVo9Va1z2puU1oVgxaLDAZv+0BC2GnrLVnKpuq7DwchJcs57w== X-Received: by 2002:a05:6a00:1791:b0:705:c0a1:61c9 with SMTP id d2e1a72fcca58-70b00947856mr6899185b3a.9.1720241819102; Fri, 05 Jul 2024 21:56:59 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.56.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:56:58 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 04/23] zram: introduce custom comp backends API Date: Sat, 6 Jul 2024 13:56:06 +0900 Message-ID: <20240706045641.631961-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 --- drivers/block/zram/Kconfig | 39 +-------- drivers/block/zram/zcomp.c | 151 +++++++++++----------------------- drivers/block/zram/zcomp.h | 29 ++++--- drivers/block/zram/zram_drv.c | 9 +- 4 files changed, 76 insertions(+), 152 deletions(-) diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index eacf1cba7bf4..ace5698db5f6 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -3,7 +3,6 @@ config ZRAM tristate "Compressed RAM block device support" depends on BLOCK && SYSFS && MMU depends on HAVE_ZSMALLOC - 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, ...). @@ -16,45 +15,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..5075934ce388 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,92 +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 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 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; } =20 @@ -115,38 +88,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 +118,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 +130,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 +159,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..dde28a8d32d4 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; + 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 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 DFBBA210F8 for ; Sat, 6 Jul 2024 04:57:01 +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=1720241823; cv=none; b=tIohZ9cuNY6M0uaTaEeUltuOlUB1UFZpIFQ8817GTzNK3JeK3PiTimlryNVA7mIir9SP3oel1LvL0LAlFMxXUQ05OWe048XWWNqXXAYwgGmz0kCT/sNefFjbGnvzc6NpejluUATR05zfgcjz4dgeO8cmAhkfdkOeuFkbcR6/u+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241823; c=relaxed/simple; bh=1UqjfmlydUNwAcDlrojibgzaEy8NqgyMbdlLJRXvk/A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YFHCAcIlbKdliPpRO3OYgUxlWBQb+2lIZdIAW57feG044MlR5ZuwhNiUCM2HqDgQABFqXza+WON+6LFk9Yb+mnUh96YJPPvo32KAPDaLvHWNRi8IfJnYDFL7JqmRgfoMDlmM6hYfarqMCf9lKVxqNyITuOJ/hoTBIQS/25g1GGw= 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=AdtvxbM/; 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="AdtvxbM/" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-70b0e7f6f6fso1057640b3a.2 for ; Fri, 05 Jul 2024 21:57:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241821; x=1720846621; 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=rWYtwy2PatGs7UVH1r9e/kJ4xQ+K9KSNO3YE0Ktxnv0=; b=AdtvxbM/NXPnbooFRYpcPzHg2BqAT5DVeM6+7SgjZUsug/c4KoYfAqI/7ZyIbG8dai Bao4OzuyTWtkLEkTCYiQ2xdl7oLDVBv24uAE9Fi1OwzFypD0Vj4/nXWNUJEWWX1Awa3Y GNPg6l9WoATRrymMjp+lMsFL4sjdm/2q70INo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241821; x=1720846621; 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=rWYtwy2PatGs7UVH1r9e/kJ4xQ+K9KSNO3YE0Ktxnv0=; b=upUwWqwVVbtnYhsk24D2wzH+pYVU8Oyj1jkJYYMjUZLHF1rMsTGCYc3sijTSejSem8 ODBNGLYgMibpU/pVCeJir/uN5CY30uknlnIjJfjtb3QC9yfQwj8gfCvusLKmCy9O7Hvy aKUpAXAdaaa9IU3YmmfS95E69m38vRDW0/HnSw6Lth+7EKPi3yzpzDmeayzuGz1ZucXP pONXem5r905K0ilYgiBOiYhF2OzHBcv+rB5h6ujFFygBJFEgGj7wgQAZK6RdkRHeA+pN HdU2p2yrwonQB5GRMwYDf9cBRmEKBIyT8EDcf5EQ5n6InH9nrKIN/ulUIt1pRf6LV7bI vzdg== X-Gm-Message-State: AOJu0Yw8rH9thP2MR+5xANBgRrgdEHet65D4WWc9kg9zmRGnLAt6sdfv NVO2XBhwRpwJaACAQtjNFDeQ/0zwUY6ZGSeAVhMfIKh3FAVrbx0N1wWnDZE9vA== X-Google-Smtp-Source: AGHT+IHrcyPt/hRC4J1b4dRa0Z3VayGefUt+DJ6Mdl+2O0aJ4R2OTxyriDZkVktH1cd28d3zqqh1Sw== X-Received: by 2002:a05:6a00:4606:b0:705:c30d:d6c3 with SMTP id d2e1a72fcca58-70b00a90050mr8384596b3a.11.1720241821181; Fri, 05 Jul 2024 21:57:01 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.56.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:00 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 05/23] zram: add lzo and lzorle compression backends support Date: Sat, 6 Jul 2024 13:56:07 +0900 Message-ID: <20240706045641.631961-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 ace5698db5f6..ce70b8ef3405 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -15,8 +15,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..7eb0d2709a73 --- /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; +} + +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..dad334013539 --- /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 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..68fcdccb2f53 --- /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; +} + +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..b96ccb82ac48 --- /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 struct zcomp_ops backend_lzorle; + +#endif /* __BACKEND_LZORLE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 5075934ce388..fa074b8d167e 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 struct zcomp_ops *backends[] =3D { +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) + &backend_lzorle, + &backend_lzo, +#endif NULL }; =20 --=20 2.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 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 E10CF2374C for ; Sat, 6 Jul 2024 04:57:03 +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=1720241825; cv=none; b=E406ytteCYTPomcXRXUHtSQQirkirgfpnPsUgDtT5sNyY7QUd21Tb5wM+1DSWdob5u+E1/SXfpRF5HVxMyjU3w2w7dUNOQK7VfFaslpWup0/UtYLo786ZJOuqoBHn4Ip7VMrIsjLdDv7576YqIphmMr/A8skbk7BAwvUgEx+ugg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241825; c=relaxed/simple; bh=bDNOAul3soezzN79Cz6I49QyuvBl/1Em9Z7hkMv1DD0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n7YHtjgFOAs6pcg/Ud81sSOv94MoQ2tWZJEnKKsmUP7+/EIM+Y9glTkkZiHFiUmLhneCCxquBXCFPiq+yO1NFRAHM6PFz2nozpKTrrgZprEhqzh4qeDFzn55S7UNf2V4Y466WfD2/Yzcf/a8Vnkjrps9h4qGsF2wPJuZp8QPPfc= 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=lw4CeCSq; 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="lw4CeCSq" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-70b04cb28baso1641683b3a.1 for ; Fri, 05 Jul 2024 21:57:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241823; x=1720846623; 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=4gYDtkSJqtpqqQGmjPwKrPrrHp6vWlNSd0sXatgXT8k=; b=lw4CeCSq/zaI6IffHD6+T2/eemut60UJuvIT06tCOZ2PpZ1GYcBKWvgU9FLmcgJHBN Pi+CSsS8vMAoStS8sFs0IY17meiqm5JJDLtscNxcDPFszP282XeIMMjj6Ik3fYlj44su i+zz7tpxl6AUT/a9M7IcsCCVYnTVf5m3fPIfo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241823; x=1720846623; 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=4gYDtkSJqtpqqQGmjPwKrPrrHp6vWlNSd0sXatgXT8k=; b=CEDYkjkKccPL15O6vm5HDNnukTPUQ/ePHuVQ3FdfQobRzeCHTI2aFNnZPxkezMiiB8 PZqt4Jza/VZL+bpJ3pYsThSlOppEMHmJY/minz6h9CC2U/iLOHE34JIND7473J2NiIDB jy0m9LmgnQO1A/ITCzGWiftQmXwAQ6ZNPg49Ks1ByhgkxdiTSRHF2Zm6oEn8APxZg+cM JDKYyYkQ/GxONlb29OiNH+/CSIOBwibbosppwa4EKKNrTm6K8fPlfN/ypB+AxCYeHRkQ GiEXIO4hNxwZ5QQdb6k3PXRCNgcsKwX3/FXSnhtMlnFookeW7mn8k849I3C+FcJLVEZi hjfg== X-Gm-Message-State: AOJu0YzCaQRvgVoE5x1XxFo39VnZSISJN2qxEJqrwV5UHEEUbS9oLGv2 xKnXRUjc6DrazlxTAU70UmEREF8Kv8uzXg7pG+GOZtbaj3U67L7L4kZiT+W5Kw== X-Google-Smtp-Source: AGHT+IHS+p2eSSQmz71ZxQsVRU6NdvwVL9g5PlB8XoRw0H/ujsJy3dmryV17QmdiqiI/aLWjNvl9/A== X-Received: by 2002:a05:6a00:2d8f:b0:706:6b0b:9573 with SMTP id d2e1a72fcca58-70b00a64b24mr7574762b3a.19.1720241823289; Fri, 05 Jul 2024 21:57:03 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:02 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 06/23] zram: add lz4 compression backend support Date: Sat, 6 Jul 2024 13:56:08 +0900 Message-ID: <20240706045641.631961-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 ce70b8ef3405..28288e9432d4 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -21,6 +21,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 @@ -34,12 +40,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..4de389fb3463 --- /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; +} + +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..2e1df0a80887 --- /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 struct zcomp_ops backend_lz4; + +#endif /* __BACKEND_LZ4_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index fa074b8d167e..8c1a904e95b6 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 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-yb1-f178.google.com (mail-yb1-f178.google.com [209.85.219.178]) (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 5FBE42E3F2 for ; Sat, 6 Jul 2024 04:57:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241828; cv=none; b=FpQDMrXnqgWaj2y5lJ1JP4pqgftOzKPVaYen7zSBmwW239+i76FYqM73hbVHskhCFClGuf8YRH8M4jIj03m37tzPLltGzJbEOBzo5x9hK4xbs2LA66iX+vIXO7V+LjAX5+Y9abl79aiO2LhJ1GIG09bW/CPLxHCFmez4vS1qH3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241828; c=relaxed/simple; bh=WVIv7jWgg47saRbrefFbuUQCgKzYygaFFuD3DQJS2aA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aUQ0F1oIxc8lGzMyHZoDEiSxmliD9RhNqeAN61Y2v7O3qkk8iDVTKuHIWbYOMhvHLVJ8NZvhHVNfcKebDzPRbDuOVobi3HykLoDWRjUgbKG8h0M2jos7jlZarIhaT5TJHALxCkPWpzes3nDqqbVj/4GzmhVmEtrBIIJtpjUZW0c= 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=Ml42k4Em; arc=none smtp.client-ip=209.85.219.178 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="Ml42k4Em" Received: by mail-yb1-f178.google.com with SMTP id 3f1490d57ef6-e035dc23a21so1970559276.0 for ; Fri, 05 Jul 2024 21:57:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241825; x=1720846625; 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=Easn2tQ6LJYNrxCCKgQLYF9rZKcHvgXLfZVFO+hGVcA=; b=Ml42k4EmqtIzLDAHaiL19Ivyak01iyiN6VHjFaL8mFHUeBXsvRTy7iW0JWiZREDwDF kLAjwvyT84FJioFgGkHjtH3z9usYiM2ryyNNb6H6Y+sQ0wjQ3y22SZKErrAy5nEETCPF hBnwrnGGKlYr+SWcbYWAufA5APjVyB92DnHJ0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241825; x=1720846625; 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=Easn2tQ6LJYNrxCCKgQLYF9rZKcHvgXLfZVFO+hGVcA=; b=efA/lgrzvNaOI8AnPqTwCQ23Xaer1KpS93Nz2qYLrLMdLKj827lMsaZGqZURggM5lJ KWFC2UaXm4/7ItwQjyhGWT0bYRO+z1HyBmeNRSDcEdCqGHrwpsM0yWBEMiD6xMFKcBYR IkBiPpqTvxVEosR5PgY8EzTATtyMrTA4ii9xfcwjK9I7DcOpLvDjiwWqsATJ3ZrV3bW4 srdmu0xRvvoKDKUiFIOnsRAW8PZCIzyU3pnamxz1BtZff964/Y9FoNfL+rhwi27VO3pf DvsolVM3ngMiVSg3aN3rj0l6QAU1PrUixUZrNPADdZDfwpQIz6rkP5h/dsSO4Hu/TQTb +ZZw== X-Gm-Message-State: AOJu0Yz5EeX4+9bbtwBHAwYcTz2Lt6FgnjpcFjrf6SocbDyL1JnYSFJn SsHX5EizEYfekyAGPSRfsccdnCh3TQ3Vw65YoHZuDkRKoaBoZpHv7XnG4mJvQI8rDNe+I8fJYyF MfQ== X-Google-Smtp-Source: AGHT+IFaLee2cw3wdW2wEfjgCPTR0bW8r3xqVI/V4SOzLEgE/3bMHSF9vOecWzxPHBMDu5vZ7ZwuDQ== X-Received: by 2002:a25:b57:0:b0:e03:54e1:8600 with SMTP id 3f1490d57ef6-e03c18efe38mr6192676276.11.1720241825311; Fri, 05 Jul 2024 21:57:05 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:05 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 07/23] zram: add lz4hc compression backend support Date: Sat, 6 Jul 2024 13:56:09 +0900 Message-ID: <20240706045641.631961-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 28288e9432d4..72751cb2b532 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -27,6 +27,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 @@ -44,6 +50,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 @@ -51,6 +61,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..50e998c1e321 --- /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; +} + +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..93a11c3acf28 --- /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 struct zcomp_ops backend_lz4hc; + +#endif /* __BACKEND_LZ4HC_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 8c1a904e95b6..1423b177dc30 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 struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -23,6 +24,9 @@ static 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-il1-f175.google.com (mail-il1-f175.google.com [209.85.166.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 66C2F3EA98 for ; Sat, 6 Jul 2024 04:57:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241829; cv=none; b=uzz/iANgWwCSdaIYNt5XYINaJgtJ4HY2FqhGtG18qTdte/xh4/d82UiciPpa9o79JthSICDduGTML9FfpysuECgroWALqYosFG+UB/KRkkj3qBk0lFOnsAePyZH7ty6iExmS1ehzfwPo9jS1XMMnoRgL/UjFRGbBc084Cn/Kk0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241829; c=relaxed/simple; bh=lNZrqpWs9a1laLkmBuQCpzIWBGvQuyFh349lB2CY5kQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QgZhaVyNaqg9EaKy5yUIlJplXo4heK1znDXn8aBGEWBJ8+gaoZJdIdFIN4rqvLgDY1d9uZFKSiHDbgxOXmlAsNe1Bvi0sqzSCPQc9hbEvoiBF9YK125BFBKGGPIBYo6F+Rs4BOk6ke1D06kW2ZAGQlZa6PRuKppkD7Hpgw0WeG0= 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=PMwXS606; arc=none smtp.client-ip=209.85.166.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="PMwXS606" Received: by mail-il1-f175.google.com with SMTP id e9e14a558f8ab-375858224adso8700525ab.0 for ; Fri, 05 Jul 2024 21:57:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241827; x=1720846627; 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=oY1U945XmfjcoVZRgtPNuwuX08Cf3l1MfFMAfTHouwY=; b=PMwXS606reM6Rt/ynZE0hhY8qzJBoyPkFUtBVoaZ87TvLyJLWwtztbWiheVlyiK2tA hPln7hgNU3EDsTprSFir1+UzIZNvpDISS08wdVjyw6MGiBJ8WTbUjNcsc4MYecOL28fw fxmS7N8pI6Iuhutgb/luyxscbNfVWTN/Yxl7o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241827; x=1720846627; 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=oY1U945XmfjcoVZRgtPNuwuX08Cf3l1MfFMAfTHouwY=; b=jCW8v3XIcdjuyWMelSRGbgxxhlvovCGSSHnbUOicYLbeO6v3N1nEmCn/WpEl8V/2fw blq/Q11m5J/qRZfPuxf+xvWJhE6ARkcwPZ7VEzl/e9cb3W3yftHh90yOdBhMzZ6i8PE6 U7HSZ1R0SFCGbfWlfpjs1ei4IYF6lHFi7E8m970pwxiMfo6xE872umPPa/ft8xWu6S3G P02Se43mOFHiq4JjxJQGDQae3L7kzdY/GXF3Opc57CkDCrTfkp6Iwu2r2diT9LzIPctW 2NWdNIQQGGnZNaqRq+ru8iJJbTxG/+ENey9cJE0R3YBe8q0hyGgn6VXyxmJ6+f8qSYoI vpCg== X-Gm-Message-State: AOJu0YzJ5OO31kChEZExUa20K3i67I7OvV8luwNVSjaUvzQ44B8xHjZU yiHxCalTXGlyxRXxoUMF4SHCUf9GH6r8h3znQwgqaWiezBwzHq2JH/aNhW2BBg== X-Google-Smtp-Source: AGHT+IHOLntQbLpzJVWd3q9AXAh1vP3fsqc4dy9tljuo5ob0zaPpKLsPV0l4ec2SZdb3ZZs7QpDpTA== X-Received: by 2002:a05:6e02:1a02:b0:376:410b:ae76 with SMTP id e9e14a558f8ab-38398af7a16mr75585405ab.11.1720241827564; Fri, 05 Jul 2024 21:57:07 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:07 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 08/23] zram: add zstd compression backend support Date: Sat, 6 Jul 2024 13:56:10 +0900 Message-ID: <20240706045641.631961-9-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 72751cb2b532..ee4fe2ee3413 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -33,6 +33,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 @@ -54,6 +60,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 @@ -62,6 +72,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..d0d01df2261f --- /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; +} + +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..300b9fe635a1 --- /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 struct zcomp_ops backend_zstd; + +#endif /* __BACKEND_ZSTD_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 1423b177dc30..c2441023356f 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 struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -27,6 +28,9 @@ static 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-yb1-f174.google.com (mail-yb1-f174.google.com [209.85.219.174]) (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 A92E1446D2 for ; Sat, 6 Jul 2024 04:57:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241832; cv=none; b=X5Uupn6AfrALGZPP+H4K5AKK3lfvTR/n7aSbSdRfsUqG5BWvkIouTr22TtB1xCwq5y56udsJUeYu7vtMk/7WP4+Y2NDyGJ0OASsF0oKxfdWp4F92gxslSdBq1YvBfQ00x0f3AZ262AgdKImtelRV3YM8GU106ZwIeReK33X0ro4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241832; c=relaxed/simple; bh=ggSUuq9wLdZU/3HYnfroJ7OsgBtfw6Jt/Gbe7ZJLLBE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QHz5bh2uB2VdZHr9czlU+pT4+CIme7QDZjLoH0EBGGQYmbaYyPRn0U0wu1o+qH9l5+s87cEyGtiflQXSn9BPL0eKR/R6H9KkmcCVloCF7TmhejPbanhUB1SXjA4VHHVifHQ3Tc89L3u2TET9TqDrX2UZnELuvJA0RdVoMQytkXs= 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=eMwy2TlU; arc=none smtp.client-ip=209.85.219.174 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="eMwy2TlU" Received: by mail-yb1-f174.google.com with SMTP id 3f1490d57ef6-e035dc23a21so1970574276.0 for ; Fri, 05 Jul 2024 21:57:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241830; x=1720846630; 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=r1uUrn/uLdGhHca2hINlCuTEUNbGnPeH+z1GhABqRLM=; b=eMwy2TlUNQdhp27ONxFAghaJPRXur9VFZ/3mcv8PjuO1/ourn6GG0F61ZY44okVt2P /qYdMJP3Ou/dPJCUHPCHq98T2K49t5SZFAbB5morpUoVecI0PKTPSbohJzvM58bOYqcQ eLlWLK+WkUuOQHutuNI5ukDrxAf6SO+vPFZQM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241830; x=1720846630; 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=r1uUrn/uLdGhHca2hINlCuTEUNbGnPeH+z1GhABqRLM=; b=jPcMM82xFiwkBKwkxZjs1Yx1Sh1pouGLG5nJWWEs4GE9TBrB3SZXUK7SkxBt4ALwre oj0Dhx/LLx9PmJTDEAdHSEaXj35kH2O/NPJ876EW5c1AioPyySTTn4cxpetRwUWOcx+J mvJ/hxOJReco1RBjAaREPpY341UG0JPWn2GqtF0O93qld5u9ayumeKApxkMJlIo7bV/s 8JHmXRidW6CSyKe5wYHZ6W1eFbZ+N11lSLKjStwJXD2QISGplDrQ8Hj8OJ5MF3kCxPPP JCGBrdNkA1kbdfmLI8kIfukrsDQc9MBFJqRsRDx9ZcPMFClZhvKLzr+whMz1h0bmWTRT P2yA== X-Gm-Message-State: AOJu0YwCnxSJ6BBzPpz1J7lScRR8f7awadBviNDftKsde+fUy1glvk57 /Z+DeokjkO9Cnm2462h9shflTwayM4ZtKj0al7gKCxPtg2LyaCQbLX/1ZD5ad64WICl9DhfSuYL WOg== X-Google-Smtp-Source: AGHT+IFkmFrOWWV2il3nNHTJLfhLxc/wo/WUpobx+TQdGpp6n0qTLtSqr6ofZZytwxBHX4E/L8gJkw== X-Received: by 2002:a25:d80b:0:b0:dff:1020:6f31 with SMTP id 3f1490d57ef6-e03c19e9540mr6726053276.45.1720241829733; Fri, 05 Jul 2024 21:57:09 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:09 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 09/23] zram: pass estimated src size hint to zstd Date: Sat, 6 Jul 2024 13:56:11 +0900 Message-ID: <20240706045641.631961-10-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 d0d01df2261f..e70e6dd2b4d6 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 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 933904655F for ; Sat, 6 Jul 2024 04:57:12 +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=1720241834; cv=none; b=Hyj+Oo+PtbaiQpF3Dgzsm+at4Qmtu77XAc+p6KaGcQAKC0Pt06nWeKlBfjHx3rOme+e8vBvIHIb3WqNd3mkHvr+n++1Wa8+GaRUrps0R7nc0RO06yMLhP7R595+5Ox2qNr9ur7dmqoIR21tay0JMEIUeo8Y6ejbft7z+O0CA8Mo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241834; c=relaxed/simple; bh=QB3rZjkSMbLosAmIk4uz+5ujTFjXpUNLWcLEN1jpL6I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rf23LBLcfXV4CzGndbJU8O8dHrTVsotcyT2YyHJl4T5ptkM0bdDSz+vjpDoTt1Lw531W0hnClWJGkYJwruckrx0wVQI7dx5uLJf4/GdLA+Z2G5CX1ieX/9Qy8xFjClN1mQ6GD/g0YyobXZlQsFVG0fl0FECcIFxgSFwuZlyq6TU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=fail smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Gec8F1GV; 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=fail 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="Gec8F1GV" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-706b53ee183so2317382b3a.1 for ; Fri, 05 Jul 2024 21:57:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241832; x=1720846632; 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=92kEQGg850vri2VXH+ZiVOhMXfWvLIhlfpCL7VZGz/0=; b=Gec8F1GVNV6Q/wR7hqGp6jkLbNCt7ZlOPfYZ8nzPSkweRkxAhFLwHN8Ntx5ta1N5ed Iakr3+MR99wdgpfXEv2hZwWeUqRh3xmm172olw1HzPJIJmUHxpb8pB2eKMIfxcX9CXrx NnqT3uWvRo9yQ4Kh2QNBEJE+21AeflU7WglOs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241832; x=1720846632; 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=92kEQGg850vri2VXH+ZiVOhMXfWvLIhlfpCL7VZGz/0=; b=RQly3inJLvwekBWC5WWO3AazMaQqywJiVurkAVYftfETyHdCCH7EwPoLGFZVZCKqTu AOWjaGVFS1DMO764vAEVq3CFc7Ej5Gr/iodqITGg+8lhrBrSymf4lF8Vppzte4ABPHsr fw5N1ZCDxkIoLpu3fYNvpHhElyZRBaxYuPpg/Wn7fXVLFb1bRD0FUQnDqK5mCuz6EOyb wUDmXCEM3DZwNZBL8GKDz1AK0j9yRkbSvUlaYZk3g8KZgby1xX/lmVnB0XRtBbY14vxc 4Y87+Btpouho2m8Ub7jbh/2zk0uCihPAv1Z8cGQg995jezPhF8x5AzngukGPT61ZdMMQ kJ3A== X-Gm-Message-State: AOJu0YwnIIXUKgARM9eVQ26cvunegB7bv42EeGKOV1srIRGcer/3dxzp vFRTkgzCkW/5JGtzKlWEY2iRP7dN9XMC3f7EuIn3ia/H64UFoaiZbqp/c7s5VA== X-Google-Smtp-Source: AGHT+IEBdaA9uIguXqnXnppby3wT+GJelfbaMN9WIUtZ20mijtbHtkJUSEE0oN2TjgEyay8UClD+Pw== X-Received: by 2002:a05:6a20:7344:b0:1bc:f65e:1bfd with SMTP id adf61e73a8af0-1c0cd1fc13cmr9560272637.25.1720241831896; Fri, 05 Jul 2024 21:57:11 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:11 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 10/23] zram: add zlib compression backend support Date: Sat, 6 Jul 2024 13:56:12 +0900 Message-ID: <20240706045641.631961-11-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 ee4fe2ee3413..bc3a1d0455b1 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -39,6 +39,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 @@ -64,6 +70,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 @@ -73,6 +83,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..489694b0d5d9 --- /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; +} + +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..d0a9b35c289f --- /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 struct zcomp_ops backend_deflate; + +#endif /* __BACKEND_DEFLATE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index c2441023356f..13c58e197d60 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 struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -31,6 +32,9 @@ static 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-ot1-f53.google.com (mail-ot1-f53.google.com [209.85.210.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 1ABA44F20C for ; Sat, 6 Jul 2024 04:57:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241836; cv=none; b=rnp0lMFs03njBek5r86TaxGs4+pfdgh9/Cu6QvPX4HCk8zObDeMt7qV3m24ooLAxjUzQfeQmsyZUznLZittu2Z+I5oyQXDi6LExE7i5vkvE6XR80DuAA9Im5MFbj/uAofpRx7BTd+gxlpB2sWcdGOCQU53edQRlv8Y9XrAVIf/g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241836; c=relaxed/simple; bh=5q3+C4a5VJLqPs/DDUL4c1/IyPpqHMV7c98diLyzayA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tpH63liwkFaOj+zenS0SxGh/l8MZbcG/JeZbwf4rTKXsMRTj3E3t96O97cQl8nRTnWy+X+e5zn5ydBB4bDJ6hjph/gQxcaOxNlFADuUHXAsZnlU1GIbQycV858IxrY/z3/X6LvPSvSa2LUNS3iJxSgtz/Xv8AEn4DhcW0GNdvWw= 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=e2oUMHOo; arc=none smtp.client-ip=209.85.210.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="e2oUMHOo" Received: by mail-ot1-f53.google.com with SMTP id 46e09a7af769-7035b2947a4so605572a34.3 for ; Fri, 05 Jul 2024 21:57:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241834; x=1720846634; 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=/iBBmeFFUspr72Atovyon3yPvyiS3OHh9p4aaALH7Fw=; b=e2oUMHOoI80WJrOpZepUa0ylb/I8R+lm3hC7xRJjmxhb3jMDAgz30tb5tFkF4C0XAJ aNuIcKYvilQ3pXdjjdo+WzwegCawHcZNHtRbTGHv+xOtCSu5MieSgr4bqg+HZ2Xj9H3i QBeyogygWKWb2cYv3EutcHD8EINyBJoEwY14I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241834; x=1720846634; 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=/iBBmeFFUspr72Atovyon3yPvyiS3OHh9p4aaALH7Fw=; b=J7r7y8I4V6mpZR9MB1X71OXKJzMdxLgT4rDGlbsP6dXMF1VByUbAePZsC3shkEj7AU ncl4zXPSJ5sn3+KQxcrA3LhKX5oq25KtcwiIMy6RtJ/uiOZPihXat/Oj4N3+/has6ggn Rxq60uR5ajIvV/ieBU1prBPsc+iTHB2Cln6fE4TbHNPKJios6UVTrleMfDZD0w/5z2YK bPd5UNzdtuOwmN9g+Pb4cmmc8fnIK9Gxm/1NBRtEcFNxLjHIklSSNsQfOvR1pu/p/qM5 cTIQsBZnEW+/kZ3Afgk+biqB/lGytR2S3qId/NR618mw51xCvJgLrIXLEPaAWwrDF+ew 7I8Q== X-Gm-Message-State: AOJu0YzZC1WMQQQcChX02dPtXjx8VNPRzYZoJIem0pgUacuE1ukcZBls ZKSTKhcDOYCiGKrFQRANeSOft1Kr9PndWjs4p/PiY6AtuyWE/LRmNExw1fRuCA== X-Google-Smtp-Source: AGHT+IFuenaK4XE/ksni2ZBOpv/6qEP4wUOlksTGQimi8Qo8ACEQmMPy6KwiTM9sOm3Q4yDTqMhCRA== X-Received: by 2002:a05:6830:348e:b0:6f9:faf5:79b0 with SMTP id 46e09a7af769-7034a81e8bemr8069075a34.31.1720241834103; Fri, 05 Jul 2024 21:57:14 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:13 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 11/23] zram: add 842 compression backend support Date: Sat, 6 Jul 2024 13:56:13 +0900 Message-ID: <20240706045641.631961-12-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 bc3a1d0455b1..ddc19853ea96 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -45,6 +45,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 @@ -74,6 +80,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 @@ -84,6 +94,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..83802d6c0e7d --- /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); +} + +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..898ac1410329 --- /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 struct zcomp_ops backend_842; + +#endif /* __BACKEND_842_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 13c58e197d60..280dcc48fb5e 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 struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -35,6 +36,9 @@ static 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-yw1-f174.google.com (mail-yw1-f174.google.com [209.85.128.174]) (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 5904955896 for ; Sat, 6 Jul 2024 04:57:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241838; cv=none; b=QAe2hEPF1i+2gTivu+P+OijHizDqyV8qexY03DSC/hdmMZjRbhIapCpXWxfiDOBQdoSPXn1MiQXEiJLhKN5bEzKA3uL6LhoGY4XFF2O85BCgBKPUzOwfsHG2ULb0d+TARL8k599zzZxHRZCZ7GKpKOJczEfCrDYcDqc0fd29nsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241838; c=relaxed/simple; bh=MtTIDYOtiMGws4Y9w3SNbG9mqa/kEzm7Lktyux70ZbI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=R1NTulYnNc4BsnVaF8R8qSQ6ZjfvE18ePVt5o51n55wY8EiV8asuoCaPpgdsFUb/27yxhX9yYdJMnc1b8z5SahAumR/an0to3ko0U1nrdvDJ+z369Ph5+cLBziP3a2CLy0L+c8gv1ZoCqZid77HRRKacWfZKVp1qIInI7vTL7hQ= 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=AOGMVkXi; arc=none smtp.client-ip=209.85.128.174 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="AOGMVkXi" Received: by mail-yw1-f174.google.com with SMTP id 00721157ae682-64b417e1511so21411387b3.3 for ; Fri, 05 Jul 2024 21:57:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241836; x=1720846636; 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=AAvxUDrK8ysZTYfpY5kDw/1zXA0+zlpvPoo9FszJCFE=; b=AOGMVkXiMukBv/lDCd67SRnNQehqNA2Muud5QONZmTtr9hnBIBvhUM1Lx8scPdePsx S+9ohIuaufBOKRa4+Jw09D0CR0g5Aa/q4htsOAUnJANNQ02Puepnaft6gzW02A7bilHf 4DIJtWe1CkU+MPdn6yiNs4FjOeOklSRZpka6s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241836; x=1720846636; 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=AAvxUDrK8ysZTYfpY5kDw/1zXA0+zlpvPoo9FszJCFE=; b=MvL2bL1MexsbqIHJrBiaEczeYgbqvlxUyg5p5aBJtSMAzBOE9rmGgHbCAiJX/c1H1m 35uELQTVCofpnNyVo895MOx5KMZ+zCYLibIO+n1MpKbm2vJZEyACVTGQn5BzXzgkYRbD QYBNm4QItTHQ+f7XFem/7FBsOPvhn76YM75/VM5bJBdDc96RIASum2mbACdPCzUI0vik ottfsKEMaMShkY+BbliECRuXULRPxntCutObt1PU+SPUYuB2xRd3bb2FqUHv4z1VfcdD BUBtnUInyBk4dTAY3MQqHdKbi9dZ0E5D8nwt0MDCN1X+4vb80fyOKh8mWCCk+dzYgNwd fCgQ== X-Gm-Message-State: AOJu0YzgXRAyUx4Jz7S7DVfAOJRFDaYg2yCXY7HoFDX2SgpCSiWvgkqb EKki8DE8LGQogAgtNRmEULsnBTqIHhwCa4YKjmyFwI1p0JyhS5F2QMI7oMvhqg== X-Google-Smtp-Source: AGHT+IH0w+48P4lsEfTcbcYPgK0q6CF033pwSERgXciwKxFtduwKXQXU9dlNHxwqtQDKqXMk1QWSTg== X-Received: by 2002:a05:690c:4d82:b0:62c:e6c0:e887 with SMTP id 00721157ae682-652d543fdbbmr79682517b3.9.1720241836335; Fri, 05 Jul 2024 21:57:16 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:15 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 12/23] zram: check that backends array has at least one backend Date: Sat, 6 Jul 2024 13:56:14 +0900 Message-ID: <20240706045641.631961-13-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 ddc19853ea96..40e035468de2 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -15,12 +15,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 @@ -51,6 +45,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 280dcc48fb5e..1888d4dd9245 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -191,6 +191,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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.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 21E006A8CF for ; Sat, 6 Jul 2024 04:57:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241840; cv=none; b=qYaxZ6aT/m+BgB+K1tyLmN4LPU1r2BSNoOzxQ3jlWm/EZDtjKtCgUKUCdQhT1aYzpz0MeUIbjQyfTA0wjjPUznqlgh0vC9AzqPeUIj+qfZcZr5WiL701eJmePMGLvhxa8jv6Cq6QFv6K7cr/3TkpyTWMB49XQbRe4a7UEyL4vwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241840; c=relaxed/simple; bh=qPGhEszM28BJLoKcCSLWKB23lcWXg6Neo843Mmco+Os=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pOnEJlwn59e4yUDVrUnZYXPt24OMXAW8ktfCpZ1a09c5X7WjbUhSSFASWmeVe6+SWKKZ9ignsikr92yb9IsHvpUwHRV5VabJDpntVLaalcxCNwVLwh1J22E97ARf4aoFOnOaTGEWNDCbrUtvl/XR7GVqW99fM1tMMGfSTxoJN9w= 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=cFLMhCle; arc=none smtp.client-ip=209.85.215.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="cFLMhCle" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-711b1512aeaso1601298a12.3 for ; Fri, 05 Jul 2024 21:57:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241838; x=1720846638; 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=i8KId/ekURjvlg3m7DNVdUGG5jUGkcV1cBRZ5vD9Kng=; b=cFLMhCleC7tmZHFepgos8SCynrG2+bjTyxASrDW9pRexzrx4IrmL5Gj8tCrViuv/ov AVmHXP4nIITebhVGpBNs+rx7PGlsazB6XojqlwsUCu+nioZyLDYzNwpxk7RUYkYgip7S s3q3awX0texuPp/Ntmpv8nN5+WydcgphXVTNU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241838; x=1720846638; 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=i8KId/ekURjvlg3m7DNVdUGG5jUGkcV1cBRZ5vD9Kng=; b=v7War90q1uOMyoidI+KZ20oPkFYkeBTS5OhLcltBbn4G7VYDJTsIUBKGN1hllwh53d 9k+dPShxAl9dFwwpC8plMEG7YzdYo6yuphfl7lNqUw/mTdlDoe7dSmeZh6s69yaS6PT+ I+G0itbLW5OUI4YsQIaiV9wG9C77PZgL0uYfglLAvxk0eoLOb/9OLUHN9pneUtZQYG7F khXilVDlXdfazRvpDZ6dwZUhPMZG8tNFwr+rg7q/dvaapl4OI5ko1KF9C67iD5mtiPPH OPTSGnqQkI+CXGsV6TDvUXULRJPnpoVSHV5xFb8Z9Kaa/PBAJ6oFIK9ARRH8p/ZC2dZ8 qapA== X-Gm-Message-State: AOJu0Yz5XUeR1P7yTt9urGDEE3Hmja42NwkbGk1A+cnAnZwxQRZg1Nrz t8ne+PaTyUBd/SCLE06HXKdXUlMNBNRaStC/sjjfymXE2hWbLhQ5SAFoYiQ6mw== X-Google-Smtp-Source: AGHT+IHyASufqypx3vgwC2irdSmUwnqaCjV4vRKv0d9Qnf9PygUHQcAJFRSH+r3pnuyYjtihLEFIAg== X-Received: by 2002:a05:6a20:7490:b0:1be:e53c:7fa2 with SMTP id adf61e73a8af0-1c0cc7422c8mr8040828637.25.1720241838489; Fri, 05 Jul 2024 21:57:18 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:18 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 13/23] zram: introduce zcomp_params structure Date: Sat, 6 Jul 2024 13:56:15 +0900 Message-ID: <20240706045641.631961-14-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 83802d6c0e7d..9193391626a9 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 489694b0d5d9..415ab55f8aeb 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 4de389fb3463..90801a7a8f75 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 50e998c1e321..30de6ec511a5 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 7eb0d2709a73..c903c15610f8 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 68fcdccb2f53..3622625abfd9 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 e70e6dd2b4d6..2328a462b82c 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 1888d4dd9245..eacead28cc2b 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 @@ -186,7 +186,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; @@ -203,6 +203,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 dde28a8d32d4..3639c36fb9a9 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; 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..84757f0c8166 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_reset_comp_params(struct zram *zram) +{ + u32 prio; + + for (prio =3D 0; 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_reset_comp_params(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_reset_comp_params(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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-yb1-f173.google.com (mail-yb1-f173.google.com [209.85.219.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 C497D7347E for ; Sat, 6 Jul 2024 04:57:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241843; cv=none; b=rOXHaUp0cNvhHc1V+BZ0w1Gis/o6eutw6m45Sv4ZnFBhaG3pu0q5sSjX6XFMP1RISk0AEbuq0He3Rbci7srwUy0cA7qLBm9N12J0W6wVUy7miIeutHOYc8JrzC9wvonmzYm0ly3wn2CMnzagFaoYddxKdPVvLlZd0BNtpWX+TtI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241843; c=relaxed/simple; bh=d4sQtH1CMOfdwHUjN9Or0CwJq08KoxlzJDmfznBURQA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LIa0Y6fazDS00K6Z+rlCG7aI1InzUb9uqoY9Pee7rdVGXysgCRCKdhrKvY4iDWZZGOHud0Qp+gs3F8aO6OG2PvuLJfTB3zusdxWVeFaK2xIPm7KZSZFkPOW9zLhxCtNzTJDaHhfe161VNlcYEQJf4A2YB+iXZJvhY1Birb2YnVc= 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=H9uUbBTd; arc=none smtp.client-ip=209.85.219.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="H9uUbBTd" Received: by mail-yb1-f173.google.com with SMTP id 3f1490d57ef6-e035ecb35ffso2104122276.2 for ; Fri, 05 Jul 2024 21:57:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241841; x=1720846641; 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=ItQuTXBasJJqFqQGi1leSL1bLvz+yxnE1Fe3ZC5JuEc=; b=H9uUbBTd+OVhQE54qZKGPt2YUSJl8mYR38nuG97tU06KnAWvJy+2MSdfzH2k0DT8k8 K/bLELu2B5aDZGyAdDB046XNJGevlX/J5uTmduIY5bVym7q2fHvvqQIyq27Ped09kidn mEx9dq4kmE+CBHAGgnhyjzY7h/0xkIf1jlsow= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241841; x=1720846641; 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=ItQuTXBasJJqFqQGi1leSL1bLvz+yxnE1Fe3ZC5JuEc=; b=hgACtksfY7WfNRCsYF6Pq+o3D29oL8Y8Zs0JmisSia5M1OkeDBmG9v0wkG/uuv4PIz ITUOF1alCMs9zWyHfVDV9XEaQDj/45zsEW4jrQO/pqPADALE1zQhbXU0y/UDXOEIopWG VKdSI5vFFbthxFs0EPPr/40r5q/a42hPJggquf018v7X5Jw706WhY+PKldDymRq1xOym O0ebLOmomd4SngM5t5n0Ta3bpvwJgb0NY0HhJznFlXuLCouQg5LdZNmz2bzbASwcnf/B PdPr36jf/rJiqBVpUoM0jzNIiHG9B5Nmq7UDz9XUYhshf5ymcjj092rqnigs3r/614Yv +ebA== X-Gm-Message-State: AOJu0Yw7ylUXyjWCK4IDNKXlWV/INB7JYNMFe2y/PssuUFHsmxDzZPuW jOuM9EWqWCU8zTaXO707qgPL0xjQQDn9+0FZsupnrCXLwrlPVN3gNA8zHsgVIA== X-Google-Smtp-Source: AGHT+IH3TxO6XRauX78xSEH9zyZoG0lQ6N4GKqEwieuZodw7hWb3+rGnNMiqHwTJgN6A6SdOHegAyA== X-Received: by 2002:a05:6902:1a48:b0:e02:be75:6a87 with SMTP id 3f1490d57ef6-e03c19d0aabmr8542134276.37.1720241840942; Fri, 05 Jul 2024 21:57:20 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:20 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 14/23] zram: recalculate zstd compression params once Date: Sat, 6 Jul 2024 13:56:16 +0900 Message-ID: <20240706045641.631961-15-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 2328a462b82c..a9808abcf5f2 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-oi1-f169.google.com (mail-oi1-f169.google.com [209.85.167.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 176F9763E7 for ; Sat, 6 Jul 2024 04:57:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241845; cv=none; b=EM4eXF0jMldrTr64QOu9HRJFe8feK+nTBd+iUv9JWpOK1C1w18pfa1PD3PpYIzIwrp7ykwpzqM7Bsce9p4DPiN+27Q9//PG3vE1Rc/ATZMaXnaI2QWt5Qxve6DfQT3nO5X7t6rWJIFRCnvnJtabGcSazKk7BPmi486SaXheXNVo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241845; c=relaxed/simple; bh=HcNkB8JxsPku3lgBoXrRyLCr/wQaOl/b/A7+lr8k6+8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xa9aOBlnJy4pwM7Zx70owODJfV4dDsqjfIlw40Aq1dwT1jpjC5zakf/pPDUFyBn7zDGtZ5bn75QE4+EbfgERk5nSf/JE6ZBhTu84cIulun7KZPYerIPsSgVmHDlad1VenxwreXgA56VRvwaYz+GhOAwxStNis4aAcCGrQNErjCI= 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=ka9pMRTO; arc=none smtp.client-ip=209.85.167.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="ka9pMRTO" Received: by mail-oi1-f169.google.com with SMTP id 5614622812f47-3d9234b77dfso294099b6e.0 for ; Fri, 05 Jul 2024 21:57:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241843; x=1720846643; 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=YRl8rO13pUtwD5y4kvoIkAPkStq8x/JmnNOrgmlShMo=; b=ka9pMRTOYpSU3KfzRzjy1Zo+pimB6S6tZ8vFvXRkIhopCmvmkJOpN/qabjRIy76mDE hBujYOvn3YQam8qDiOQDOo6sSxM+b9JHEHTXUH6Nyv3KL56GFaldKoKVzoNszCYjqKsw Zj8n0AyGK9NKxw87VmrYR/uq09rg2J8PLkNtA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241843; x=1720846643; 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=YRl8rO13pUtwD5y4kvoIkAPkStq8x/JmnNOrgmlShMo=; b=nJ6PL/flYRpYeKqtz7/6rqaQkYLLT80Kk75E0yYrOKkrA24gNTu1AQNfjl23JCayJB 2DyRlYZC6PyC3+UwTc/+8JG5ywlTs+uP+DPBvTmOqIXiavHP/e1dKHBh7uH0el5ti/ic jpwEPchdvEqj+8pemjz5oSLtYsxbCLZTE1Bck+d9lULUqS5ILKiLTdsK5aC+OrwsDQzP giYANP/wGPR2Zq1G4dSnIo9ZHyC1AMmv04MGOcFSjDuUlhGTjCyznMhVpwb6z+vrItBH HfriLCS+oDRv8hfBriJNANvOKjBNc2tmW+XR0jweQux9WZVKjWYstZMk1IJe1v76Vd1+ HguQ== X-Gm-Message-State: AOJu0YzExjWppp/EAdWMIo3whVTorE9twfo0rZ8aXGp6agz3341/21sd C0d4TOfOgikMTiPY208mIGMPZykMHRY5m7PdSRH7+7DwMZecFgrOMQS4R6BEhQ== X-Google-Smtp-Source: AGHT+IEa1DFVnS7VxDRrsxAhjdMjQcszmyX5KHF6huvxiCujMuKmb83PI1C9BnF3Crsjz0oijaETiQ== X-Received: by 2002:a05:6808:13ce:b0:3d6:2b42:82e3 with SMTP id 5614622812f47-3d914c51bc2mr7099384b6e.4.1720241843098; Fri, 05 Jul 2024 21:57:23 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:22 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 15/23] zram: extend comp_algorithm attr write handling Date: Sat, 6 Jul 2024 13:56:17 +0900 Message-ID: <20240706045641.631961-16-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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" Previously comp_algorithm device attr would accept only algorithm name param, however in order to enabled comp configuration we need to extend comp_algorithm_store() with param=3Dvalue support. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 54 +++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 84757f0c8166..a2c23ca033b5 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -998,6 +998,12 @@ 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 comp_algorithm_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -1013,9 +1019,43 @@ static ssize_t comp_algorithm_store(struct device *d= ev, size_t len) { struct zram *zram =3D dev_to_zram(dev); + char *args, *param, *val; + char *alg =3D NULL; + s32 level =3D ZCOMP_PARAM_NO_LEVEL; int ret; =20 - ret =3D __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, buf); + args =3D skip_spaces(buf); + while (*args) { + args =3D next_arg(args, ¶m, &val); + + /* + * We need to support 'param' without value, which is an + * old format for this attr (algorithm name only). + */ + if (!val || !*val) { + alg =3D param; + continue; + } + + if (!strcmp(param, "algo")) { + alg =3D val; + continue; + } + + if (!strcmp(param, "level")) { + ret =3D kstrtoint(val, 10, &level); + if (ret) + return ret; + continue; + } + } + + if (!alg) + return -EINVAL; + + ret =3D comp_params_store(zram, ZRAM_PRIMARY_COMP, level); + if (!ret) + ret =3D __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); return ret ? ret : len; } =20 @@ -1048,6 +1088,7 @@ static ssize_t recomp_algorithm_store(struct device *= dev, int prio =3D ZRAM_SECONDARY_COMP; char *args, *param, *val; char *alg =3D NULL; + s32 level =3D ZCOMP_PARAM_NO_LEVEL; int ret; =20 args =3D skip_spaces(buf); @@ -1068,6 +1109,13 @@ static ssize_t recomp_algorithm_store(struct device = *dev, return ret; continue; } + + if (!strcmp(param, "level")) { + ret =3D kstrtoint(val, 10, &level); + if (ret) + return ret; + continue; + } } =20 if (!alg) @@ -1076,7 +1124,9 @@ static ssize_t recomp_algorithm_store(struct device *= dev, if (prio < ZRAM_SECONDARY_COMP || prio >=3D ZRAM_MAX_COMPS) return -EINVAL; =20 - ret =3D __comp_algorithm_store(zram, prio, alg); + ret =3D comp_params_store(zram, prio, level); + if (!ret) + ret =3D __comp_algorithm_store(zram, prio, alg); return ret ? ret : len; } #endif --=20 2.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 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 590CC7D3E3 for ; Sat, 6 Jul 2024 04:57:26 +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=1720241847; cv=none; b=nyfptZMelJkW9GQx6vjeB8g1OI/JkapYh/5AZkXvHfgip7LoJR3sDjjaIPVBDZMAhWXYrZcJo47kx7p/CyKJiiGpwE/1cIgnFggf9VT31RYgqoJKOtZA2N0bd5Ag3XXrIfhmuqjnlAMBAFLls2ykIMhTU+Raa8iThCLReh2o5Xs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241847; c=relaxed/simple; bh=CIHSUmN+DvzEBm09tbVS8h6+ak9GEa6XzAMkK9GfmXk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ws4hsOPlpGnMLCK5IpMnRZCss+vCZiUPFyjMKDMDfcXP85tTk63lyhFTIQHNiPPuDUqYFclsxXJNciXSgYaOwMDZ0zwnvOIcS+0qyHP4pYFCPWoDvAESUG5wMIK6X/jm1YsQDVyebHnY/dWdJ6K0Yi7v+N5nKm1ZabtD25Ut++U= 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=elvGz2Ry; 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="elvGz2Ry" Received: by mail-oa1-f42.google.com with SMTP id 586e51a60fabf-25e43dda1edso800691fac.0 for ; Fri, 05 Jul 2024 21:57:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241845; x=1720846645; 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=v8IN/hx22BiZG6EnuKDsYGsQS+lcVx3TaUmIhHbV3gc=; b=elvGz2RyO08x7rH7SL0cvghRDOdjAJ8kzjT4ZyeYzOB0HTHWVhNcinbA8bfoVK6qPh GGIt0DUkk4fbGDwXbz5RoxucZUQcSUmlLC9T2IftcIZ/tLGjSxkcpkkInpP8rANCgRwf wxe4aYdPb6xd5EdrINc8z8/uGTIyny+VNqWfE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241845; x=1720846645; 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=v8IN/hx22BiZG6EnuKDsYGsQS+lcVx3TaUmIhHbV3gc=; b=oK6Mii2zcpd89F0nfbOmvUyu9a9qGmYe7/6Bc5zk24V3zVmzbLmAOpXFTmLWp9LY9w cHSpsUkNtPKKAPKzYr74VD3szQSNKbNGCAZHld5eN1Vf1+vu8OE8N2+Xs5jn2r0n1qC5 k7U/9dRabwaSX7r0+dGT7qKRceCu6hcRUYEZsBhzEajGM7+DUPuu7Rv0FTdWQLW8RmlD /ormVHZJRp6Z2aGtDBP5wKehozsipHuUmI1b0z0NU7BnRToOlJTzqpsYZ2t17mBlc0/C 9fu3T/Bv8L+++ZM4H02/zEDaEQ4HCMWRUWZqv5DUnHjVYWUuRP6s6hQiW6GwSK0rYovC B1Xg== X-Gm-Message-State: AOJu0Yzpz7MZNtgFNFk2OGHD/6YBVHZFF7F1eR2gOvTevqVI7sS+Fu1D BxhU9Z4nayVYeH7/6lMnHUVyivupUNHG37lQBOnWlV2vSkzpkT/07bvxhN2oeA== X-Google-Smtp-Source: AGHT+IGZTyKEwieBJOuqhQF36H6sijD2kGNg62qhcX3VFCCfT5z3hAXjljCfnRoy2azGH+NXeMKX7w== X-Received: by 2002:a05:6870:63a6:b0:25e:1659:4ce9 with SMTP id 586e51a60fabf-25e2b5a06admr5277027fac.0.1720241845431; Fri, 05 Jul 2024 21:57:25 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:25 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 16/23] zram: add support for dict comp config Date: Sat, 6 Jul 2024 13:56:18 +0900 Message-ID: <20240706045641.631961-17-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 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 | 60 +++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index a2c23ca033b5..d471ec14c76a 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; } @@ -1020,7 +1047,7 @@ static ssize_t comp_algorithm_store(struct device *de= v, { struct zram *zram =3D dev_to_zram(dev); char *args, *param, *val; - char *alg =3D NULL; + char *alg =3D NULL, *dict_path =3D NULL; s32 level =3D ZCOMP_PARAM_NO_LEVEL; int ret; =20 @@ -1048,12 +1075,17 @@ static ssize_t comp_algorithm_store(struct device *= dev, return ret; continue; } + + if (!strcmp(param, "dict")) { + dict_path =3D val; + continue; + } } =20 if (!alg) return -EINVAL; =20 - ret =3D comp_params_store(zram, ZRAM_PRIMARY_COMP, level); + ret =3D comp_params_store(zram, ZRAM_PRIMARY_COMP, level, dict_path); if (!ret) ret =3D __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); return ret ? ret : len; @@ -1087,7 +1119,7 @@ static ssize_t recomp_algorithm_store(struct device *= dev, struct zram *zram =3D dev_to_zram(dev); int prio =3D ZRAM_SECONDARY_COMP; char *args, *param, *val; - char *alg =3D NULL; + char *alg =3D NULL, *dict_path =3D NULL; s32 level =3D ZCOMP_PARAM_NO_LEVEL; int ret; =20 @@ -1116,6 +1148,11 @@ static ssize_t recomp_algorithm_store(struct device = *dev, return ret; continue; } + + if (!strcmp(param, "dict")) { + dict_path =3D val; + continue; + } } =20 if (!alg) @@ -1124,7 +1161,7 @@ static ssize_t recomp_algorithm_store(struct device *= dev, if (prio < ZRAM_SECONDARY_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); if (!ret) ret =3D __comp_algorithm_store(zram, prio, alg); return ret ? ret : len; @@ -2029,17 +2066,12 @@ static void zram_slot_free_notify(struct block_devi= ce *bdev, zram_slot_unlock(zram, index); } =20 -static void zram_reset_comp_params(struct zram *zram) +static void zram_comp_params_reset(struct zram *zram) { u32 prio; =20 for (prio =3D 0; 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 @@ -2057,7 +2089,7 @@ static void zram_destroy_comps(struct zram *zram) zram->num_active_comps--; } =20 - zram_reset_comp_params(zram); + zram_comp_params_reset(zram); } =20 static void zram_reset_device(struct zram *zram) @@ -2321,7 +2353,7 @@ static int zram_add(void) if (ret) goto out_cleanup_disk; =20 - zram_reset_comp_params(zram); + zram_comp_params_reset(zram); comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor); =20 zram_debugfs_register(zram); --=20 2.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-yb1-f179.google.com (mail-yb1-f179.google.com [209.85.219.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 C571D12B17C for ; Sat, 6 Jul 2024 04:57:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241850; cv=none; b=t4Yk0FT6VnOyB2vkrBFGDyXoc9nR9pQG4KO6xkuJT8aYpqsI9LKPd+me3Wt7qfRVwldfAWreuascYtJMBb8Pups59pa6dT5LOXhHTjU0BEvEWoLiqB8YH21tmRftyO8h/xyjQE1SJ8+RSo74myPXUCMsDvVeKGNoNvg+BN9PoXQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241850; c=relaxed/simple; bh=HzeaU/l84JP69XEkeHwGz11Ln21m1tk3zMDEPKfzAt8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VDdgM0o7y81EPirVbqVKjgbzKqoUveUkfYreuT8AThoMh0AwPCr0ywWgqaQEDfuvR9Ivao6k2VEOmbYPHwlLoEI+Pcck0YjI7G7Lz3aDFeW+ZYrki0CzflIPXTf0jaBBB2EHT00kAxuhUNt2UTg/Wf5DqfnnhBbeo2frjSTE6mw= 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=WZEDpYpS; arc=none smtp.client-ip=209.85.219.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="WZEDpYpS" Received: by mail-yb1-f179.google.com with SMTP id 3f1490d57ef6-e035ecb35ffso2104150276.2 for ; Fri, 05 Jul 2024 21:57:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241848; x=1720846648; 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=tH44H1TVzwAUobTzGL/ZANlz+pOfAMXef1PqW4dbSJQ=; b=WZEDpYpSY1F0lcAnlzCF7WlbLWnh3MlA1DdZOrWhtEfXfVrCWax3H9kWvqEtGQCsrS IBWmogAdcxVcHwtS/I8HOC9JIyes4rLCODaca7hXhvWSRS7ur32YQXiyL/SLeyc5g+PD t+Xe2XV8XvDxPnAxI160GjbYQA7FMiFuvafgw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241848; x=1720846648; 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=tH44H1TVzwAUobTzGL/ZANlz+pOfAMXef1PqW4dbSJQ=; b=w+TlEI9hyElnNWcMpF2SdqvTvVRduIDdFQEsf72Ia0umBQPHNRnGUeWB3fmc6gGmgs YR9reE4pffRLoBfKjtptKxW29Mfhj1JO/zpHQfuYA+yyGsnB9Rvft1zQqfRC9PVyAeqo AqdQM21hWS38WgVC9i6JQtNhMXNYW15QTkHvedxUECdyqu7FjkST/UkU4Gt2CapmYovS nFtcLj5m2kpguKcf0ooNNACffqzv6XA0c+hsmOKzVCXUXvAJcLAFMlq/9mJ6d8RlRzZL mDLydsWOBsOo1LPpRy5i5feQFxlh9tG66gon4uxqiU1RWgeOu6Ec/0Q8bmvWM5ImtviS ByuA== X-Gm-Message-State: AOJu0YyaHEUGwVFi/qk5OJcWa6S1xFUPsUENtvbsZ335bOAt5u//fzyO x+x5Y4DY6mJERXeKVh7zuU75xH0W7mcIJagNTabOTiqGWfNllne4JhEINPZ9uA== X-Google-Smtp-Source: AGHT+IHAkGII32UrL24EsLKuvJnI3yDPAlt44SMYXQKHtOowtgYRy3I1lOMgE6pU+D5tGMvsZ5DR0Q== X-Received: by 2002:a25:9246:0:b0:e03:ab72:fe71 with SMTP id 3f1490d57ef6-e03c1933997mr6310661276.10.1720241847684; Fri, 05 Jul 2024 21:57:27 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:27 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 17/23] zram: introduce zcomp_req structure Date: Sat, 6 Jul 2024 13:56:19 +0900 Message-ID: <20240706045641.631961-18-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 9193391626a9..1df0de5a9863 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 struct zcomp_ops backend_842 =3D { diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index 415ab55f8aeb..19bb61369eb0 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 90801a7a8f75..cb623f16604e 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 30de6ec511a5..a2314e4c7e9a 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 c903c15610f8..48d3f051c258 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 3622625abfd9..4638431326c2 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 a9808abcf5f2..7e7e4af620fc 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 eacead28cc2b..defb04a25d52 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -118,22 +118,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 3639c36fb9a9..963c1e80830c 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-oi1-f180.google.com (mail-oi1-f180.google.com [209.85.167.180]) (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 A51411798F for ; Sat, 6 Jul 2024 04:57:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241853; cv=none; b=JoATPdBXyOMTRr0iFUx/tbJUEfEFh4agrARqMAQPuu0tb38yw+gLmM6ao9hsa3IOJytOa0JHryq7Lv+vLBUXQhWl0Ay+6f8LnUo64FJwkg60wkujmoskkwNYfgVbo1CDUbtMaqLX5illvfhy2gg1nrPw4attEe5Sh6Yv2waZ3yE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241853; c=relaxed/simple; bh=L2Gcc+69KbVEQSiGHyprfdVL0pj130tzcqDGo3Q89HM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W33xs4DV7B031MiVL5xMblX/o6/YpXz8TpcZWEpBsCUL0qtxdFHMB8MexZvqd12tr5It89Ex2fM5Uo0Hh/znesR0iG4BJ5Ue/R5EqZB/QFirgbJPDBhCizAaBNL85ctmErAkDy+8yKGVam/zKwhoPjy1HtbvQIjy5cY/uH6MPQs= 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=Xa5I97Cu; arc=none smtp.client-ip=209.85.167.180 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="Xa5I97Cu" Received: by mail-oi1-f180.google.com with SMTP id 5614622812f47-3d9272287easo22944b6e.2 for ; Fri, 05 Jul 2024 21:57:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241850; x=1720846650; 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=dBmFIhK8b0BisVXRZ6adNXiV3CpDA7ZfhLmwF/BBLjw=; b=Xa5I97Cu1SGAzefgmRZJCgKv0u06XMc7q9FhO6ERHioRR7G9dJW5hihUYiy+/9jvgn pqNv4zb1+XieAWk2e6CoI63Kq/lFA5GPajFk94H2DZVQsgRwegkCvxlkfCx3bx1BErtX jPU8qTvbFSFgK1mUSpceGU4+n7jd8FMoQsY7E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241850; x=1720846650; 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=dBmFIhK8b0BisVXRZ6adNXiV3CpDA7ZfhLmwF/BBLjw=; b=L1PYf/GCbpAPO+lsQsLNuaDahmgjgdercfMmIH+nOg7L4GmKz2nRBU97zSzBVSe/TQ e7Gib7rJMPOqlYVaNPrI/Z2m9jyElPz+oCOgF/74J6d8GDzIXKM2cUHfwT83a7srSjjL kLedMMHMFRkVw+68nLZZ7tGIQtdTAQLHnteAqBegow1dCrfa53H7UY4Wfk/0fbIoWBy+ rMpq9zrxcTkpA+p7cArV/BzLfZMo1jY7XT/DOfy2c31tWlMF6CWpBYjJbP5GgOnYg7i3 bXlfI9aOLe7/fGBZEfVPEGBYxQ2K4XWqVTPzjiU2PR2KGXp7q1hZ6LPXlB63uDWKn4bU 8dGA== X-Gm-Message-State: AOJu0Yzrzih9zKjGUjAWoUHFS6AAHOVlknBhENqx2swYxNV3EhyTKiGN LTyf0mBSznlroLNi+xvm5UUNXYzTLVMdniNZKu6DFobV3iKvVfMMO46Zp/P80w== X-Google-Smtp-Source: AGHT+IGTaW0yf8ZENERQz4X/gzjXja9OvACJSQ+Wu1P7ALjd/vNDHqPFmfDeaX9D0WDn+7K7WdIJQQ== X-Received: by 2002:a05:6808:1449:b0:3d6:2e22:a09b with SMTP id 5614622812f47-3d914eae85amr9465636b6e.37.1720241849872; Fri, 05 Jul 2024 21:57:29 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:29 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 18/23] zram: introduce zcomp_ctx structure Date: Sat, 6 Jul 2024 13:56:20 +0900 Message-ID: <20240706045641.631961-19-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 1df0de5a9863..8364837d300d 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 19bb61369eb0..63a29c26d64c 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 cb623f16604e..1ff6b1a6b5ae 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 a2314e4c7e9a..0daab12836de 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 48d3f051c258..699e8ef147a8 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 4638431326c2..48e4d4dc8437 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 7e7e4af620fc..1cc3a4a1f265 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 defb04a25d52..1964e6195b4b 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -45,23 +45,25 @@ static 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; } @@ -126,7 +128,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; @@ -142,7 +144,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 963c1e80830c..ebab7dbca68d 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-oi1-f170.google.com (mail-oi1-f170.google.com [209.85.167.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 01AE817C7F for ; Sat, 6 Jul 2024 04:57:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241855; cv=none; b=OaOYyibHJskgJA9pbUMzAXDIx2ToT9Yi3UD/wnXJIXYsnhN9PWvx9IVenWz7kgZu2cdz6yK1Gml5Syz0ZZdK/pUGBL1wQDVysRUBkO+I9srveRRhi1GHeDnG7gBfZWSHEqqZNL2qpWRhK0j57BcxZKgrxJIQHs7olIJV9Mkq++Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241855; c=relaxed/simple; bh=k7w1+5N2rsBL54BaeAsGWfRszkguHX37S1FmVPkVOEg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aEw6HHntKtxC1xdAWuH5D/BThFctonuObNEx5h+X2p5QGzcdszJPXc5S+VKdjHxO48dwri39OU0dbCXsne13Uh61TDuyQ/Qd7jB/OJaWseVoqjOA6gU7xdjmIXjXADtUaPJzvv+NwrXQXwXWz+NfiMHkbAvJ9llOLWNOzaLm564= 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=ZP1pqyMm; arc=none smtp.client-ip=209.85.167.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="ZP1pqyMm" Received: by mail-oi1-f170.google.com with SMTP id 5614622812f47-3d922948744so392488b6e.1 for ; Fri, 05 Jul 2024 21:57:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241852; x=1720846652; 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=T77OHceeCySQ70uxoXgvVB0usA+RwOLDNqt5l9mbVQI=; b=ZP1pqyMmfPt0aOh57tvw5XdBnDRgg+YEA+Kj/nvq4Glo5XGydrfogLkiCNkA8neRWW t6xF0lZ2uaEGR6bmB6MPcp0G1F9wjzkCMMTOonZjhKhOVojJhYeDKb4FgeJAKfEJYd8i 2B5JxnrVdc5bGdm5TybQwXs9f4JAyU2Rtw5ho= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241852; x=1720846652; 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=T77OHceeCySQ70uxoXgvVB0usA+RwOLDNqt5l9mbVQI=; b=SfIv6spXx1OBnOx5mQlnFHlhRaoO4ANwxv/4wDnH7fl60C+5XC9JJRDLTeh7FeOEi9 B9fUBaJ0kHZq4/nwYc9yqMSe+1jChLHjO6WT36kRvOHzxZzdVsgVN9Hf/PO63U88Jt6a lMuoDSN3DXHG9MUSwcFr9+CAKLj1QhHWX3jtWKJCuSafd/uC/LiQDESylpTMXnKh4oNp lQS+MiHc45jO2tH6TpEoKjP2MpZuytItkJRUJf1ImP144ZwOpUGHHtwd/3XIbYB8g9sb +abOKR447wz3Z4zrwkdT+fVr6huyCGR+BkZekHUQQ94noxwZmNaVvBY1w2smu5UNyDKP yb9Q== X-Gm-Message-State: AOJu0YxCFQ7Ai7NsBdBhi87tGo0nMOQYcY5tbzXfZrt73eME+9uC09Nx 81WvlX1JOpT8eJYtXrlJK/0qBqXDVSwpQ+BxE4zTaXP6IurSfkrI0FTlZ97b7g== X-Google-Smtp-Source: AGHT+IEul8IDa7fiVoOQdU5pljAo263SwTyiPRORDwxK2KwqisAbmnaMsbog+fqDlIeqTEKKnLqMUA== X-Received: by 2002:a05:6808:1a2a:b0:3d5:6166:c047 with SMTP id 5614622812f47-3d914c652f5mr8715001b6e.26.1720241851900; Fri, 05 Jul 2024 21:57:31 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:31 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 19/23] zram: move immutable comp params away from per-CPU context Date: Sat, 6 Jul 2024 13:56:21 +0900 Message-ID: <20240706045641.631961-20-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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 8364837d300d..8722cdfff411 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 @@ 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 63a29c26d64c..7882b6fe0d7c 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 @@ 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 1ff6b1a6b5ae..cdcf6e3c1826 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 @@ 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 0daab12836de..e7dc0e03f13c 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 @@ 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 699e8ef147a8..76a2e47c4665 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 @@ 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 48e4d4dc8437..b1cfab65cb8e 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 @@ 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 1cc3a4a1f265..3c8ba3232881 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 @@ 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 1964e6195b4b..a508e692999f 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -128,7 +128,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; @@ -144,7 +144,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) @@ -172,7 +172,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 @@ -180,12 +180,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; } @@ -193,6 +200,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); } @@ -214,14 +222,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 ebab7dbca68d..6cb081e5b23e 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-io1-f67.google.com (mail-io1-f67.google.com [209.85.166.67]) (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 E7776137757 for ; Sat, 6 Jul 2024 04:57:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.67 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241856; cv=none; b=im9E0RB7KThOJ3xQxBkjkhAXhUjm6GlZeSPM7QZHdN9sdBI9RMOFRN3OeztMCtNpgmH0vAB/E+hFpxEKKVZSEG7DtxjpoIK/xU+k4tTY/JzkU+K6RJnZZqqpFfWUHarGvfptSiEv2zVKH/6+PWjqPQ42r8Y5Aq3dmkD5DtnaFXk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241856; c=relaxed/simple; bh=Jokkp4jRyqJcm0A1DYn+TcAVitWw78wyN6aHy2nyTtA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SoaBQBpnyI90DFlzkQ6TiytLVBUqWRlAidVhSHlnQvdn25puneeB6q7LrMVqWwVqi3IZBPk6DZA/kGdrpUedDx37248+JtL5Od48b6nO0LlQIjSAgYOdkjkp9eVkz1d+eOpTtyUY7jMIbou+yzBiWOr9YENdl7UW1z14kGY4iYc= 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=Ad/b2Z5E; arc=none smtp.client-ip=209.85.166.67 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="Ad/b2Z5E" Received: by mail-io1-f67.google.com with SMTP id ca18e2360f4ac-7f3cd64e71cso86725439f.3 for ; Fri, 05 Jul 2024 21:57:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241854; x=1720846654; 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=9r+dUMO71IOpvidHYnn6tdfSiwaLYwJEZsT8F2XyCEk=; b=Ad/b2Z5EJSi6d0vC+P20ieWQtsXyQDYwdUtfjLBHUg39zTusEDd1/CbM1CoN1ymzyj tMWLuwhQnEjKEfbCVbDYCmHnR4/IBwKSTC8QQ0T6ifI1dm8T3Ojfg6kOn1aNLcT+WEY1 WsefvHMaG8ZS4/vev1YAV+xescl7+VBtcKZC0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241854; x=1720846654; 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=9r+dUMO71IOpvidHYnn6tdfSiwaLYwJEZsT8F2XyCEk=; b=RsHUwmdZJkt7gfB2sSWI3dcy+omDrLCB7XldX2bFRekSqy6ZiEctI0rQE12tCn0Ki0 RGdpx+ZVip9YOdQ6y90Gml/XiqM+MuGJU2z4RziO4xhWL2o7wJniLAj5+egLv2Nx4ZUH dGSpxiaBYAsBAvNZDEj8o/dJgmo0HGVTr9wOg5nsgj3aXqsQSBVW+r19wP5ECKNbc7hs PV2cRca5lSNBZr4Lb3zUBbE7lgViJ+KCm6FcoQmNF2QKtDrG/xPRP+fCxwIBqMmsJbn7 zzw/mM248+dROBeTZBH4Rj6EXVvGYrCOK/VcefEbRsLG6M6ecx15C10/83bHEpf4lzAC DQEA== X-Gm-Message-State: AOJu0YyLJtmsL9v39cubrc7nGImLVOVpyg/0jcaNa3mxh1lEdYLFKL/b NSI3talhyUNedODL/FL7HgE59g6mexuv19Hrw0O2QOn5JNbboSWtd1pZ5DwZSmbL04ogUWCNHMH YUB+T X-Google-Smtp-Source: AGHT+IFvt1J6zKE9cv1hMVsa+NwAIJfmzdjvtTHGru2vuD24msY4BiJiM6URUXbjaMDes+AnuyrQMQ== X-Received: by 2002:a05:6e02:194b:b0:375:c296:bf90 with SMTP id e9e14a558f8ab-38398430c33mr88614215ab.7.1720241854004; Fri, 05 Jul 2024 21:57:34 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:33 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 20/23] zram: add dictionary support to lz4 Date: Sat, 6 Jul 2024 13:56:22 +0900 Message-ID: <20240706045641.631961-21-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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/home/ss/lz4-dict-amd64 /sys/block/zram0/mm_stat 1750638592 619891141 632053760 0 632053760 1 0 3427= 8 34278 *** lz4 level=3D5 dict=3D/home/ss/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 cdcf6e3c1826..f686157fb401 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-ot1-f66.google.com (mail-ot1-f66.google.com [209.85.210.66]) (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 21CA1139588 for ; Sat, 6 Jul 2024 04:57:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241858; cv=none; b=LIIQ8WNtqmRv6apyYarB2LlVWyw49NI6pU9/BMY4SHUBqP9Dl4xR70pKomx9VbwazdpS/7JqwXgSH5kASxleHQcB9IfM3vhS3qtU06AESy6cIJ6z3i2AH2vrg2QyeNJF+UYcFc3y0UwSGiz+F/l8tsbzHSpMRsfhpk2qJKb4WeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241858; c=relaxed/simple; bh=4BOysAvN6WEsLsyWGj0lrllBLLuR9mEBlKcakWkisvA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j1EfxjbPA53evx7OkEtPZkQOtUm/przZpcRAfkG+AZkTJwoBabUz4ZN8t5Nfiey2WEd88bEEzDoTf+I3Mj7qjT7FymDnBm5JToLN2jwJW2RBlkD7G8ospH4CZVibEqxaGlygyPZvHtBzk1oTNtpGCP3IOYiz7kG2pX4jWZpjLYw= 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=Fa6ifR0I; arc=none smtp.client-ip=209.85.210.66 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="Fa6ifR0I" Received: by mail-ot1-f66.google.com with SMTP id 46e09a7af769-700d3ffc28cso1264730a34.2 for ; Fri, 05 Jul 2024 21:57:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241856; x=1720846656; 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=Lk7lKUfZ2c6LEEWLJ3rTOiTZsxNUbw3palG8LlVINX8=; b=Fa6ifR0I9iJi2UWNzFX7ynjoF+O9x7DPD0VpFUzUg26C2G42cyfVLboELMwsAC0BOx DRB1UT3noTyuuUjsF3YtXHAXtUhgFMIF1qyMiUObn7Yz8DiAzNkTlwDIYLY8/YjAjR4+ keOmW38gG7YmniF7bXPBEttRrRAovaomHbFO4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241856; x=1720846656; 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=Lk7lKUfZ2c6LEEWLJ3rTOiTZsxNUbw3palG8LlVINX8=; b=qZeOvurzegUrVkcfqbe5+GAywdEs454tRZHKaKVrfHMJxG3x8SGoYk17QfsV8lq0R/ PIycTjos+1OXK8Qm9SCucMuxgTbl/B6E53Sn0x/zjy6xlx79+dBD72mAnQE6XbsRrwEM Bt6C7012ck8dveokgyjq4l0GCl2bTiPj2YU3ZAUQna0/P6lb3OETYJ7Kw7AJErJfut7j fFc5JjNchlM6v+MadfS9McnMCjmBivQuB+X4HTK/jEBtx/FUwsXmN9ok2AVjPDyJDgK7 B9X6ZDSCIHBNzEMGvcEr1VoLgiH7mxld7R712Ag+3gU5fjZdhgNMUIqRx/+tJaOuKfgm LeTg== X-Gm-Message-State: AOJu0Yw9CPi+ejXno8edMkx6htlegUlHCLaTt6OGBD/hHeECtL8gzRmq lZwUN9ItYMhMjfxWMfatZ7kka0RVNsSEZ7Viu+T/f7LviBBGTPOMkBv54XUHLw== X-Google-Smtp-Source: AGHT+IHtqKwu9Pjse0iVZGpzEQvqhzmbr8A2UO3GcStS4aRBVH9m8gCkyKaL+gfJv/1sILfQc0EiCQ== X-Received: by 2002:a05:6358:89e:b0:1aa:b887:2386 with SMTP id e5c5f4694b2df-1aab88723e8mr99364555d.10.1720241856134; Fri, 05 Jul 2024 21:57:36 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:35 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 21/23] zram: add dictionary support to lz4hc Date: Sat, 6 Jul 2024 13:56:23 +0900 Message-ID: <20240706045641.631961-22-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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/home/ss/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 e7dc0e03f13c..79ff2c968f6b 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-il1-f194.google.com (mail-il1-f194.google.com [209.85.166.194]) (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 19F3113A40F for ; Sat, 6 Jul 2024 04:57:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241860; cv=none; b=Y3fUpPf8vncywpieKRQT1k0YBEaZrH0Z8RrzUoFZqcYvZm44E+YIk3BvOFuA6Hbq9kXgUF/kjSu3tgdmZyWnAPEEl5TdZPkgXXNkEoCc8cspMpzp3i4mkPu08c2h6Mo7uXKx8+wpyjAflGQQ8YQAlME0BCuJqNrA26GOAnJVioQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241860; c=relaxed/simple; bh=iMNYeVm8sBFa5w57DrFIFjE9IDO3RbM2EovdTMz13oI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k91prhzzsrYITX3yTMmt7CTpxMNodKah8VaCwTrtWGh1PYbZ41EKfG31wBX4WCWGy8J76FkKYpENJ84YAdHrunvJFQj4qF5onTXVleYl85w4iA9NG1RryBCbQR8n+2swTxllmbCROUnGAKV8PKlgAHVW9jfFjQGsogdwK6xcJls= 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=ItpGktnp; arc=none smtp.client-ip=209.85.166.194 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="ItpGktnp" Received: by mail-il1-f194.google.com with SMTP id e9e14a558f8ab-376208fbe7bso8807395ab.3 for ; Fri, 05 Jul 2024 21:57:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241858; x=1720846658; 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=wqv6OJ5QyUalkFrgMWzieb+OEsEN7EcQXglqct7c7eE=; b=ItpGktnpuFXdYE40Oo/IzsxQpUpdFvlrn5kyLF/5x7BWPVvyDIimrazuY0kLOo1zwl tGfzP6BI0RtbEBDLpda1XHIwJJJfuuxlKNHwWC/r0nkfJv05Zo2FaqBhuxEM08k2R0ZU 7oqyok01OZpZLk9P0ugQTP5nVBbFmBHQsxcjQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241858; x=1720846658; 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=wqv6OJ5QyUalkFrgMWzieb+OEsEN7EcQXglqct7c7eE=; b=nt5Nx0wwUC7FnwgXVV/ezIVx/AkpzXmniuXAZISEEuTd21zwgtSDTP4Xtkvy8DyW5Q eBjeJ73hsheLBUsbhp630cNYmRZ2N1Yx1NjdVhJDnj/uLcE1q2oeoPfNMTcD2GuzvvA5 Cp8Xfrf0QDHKHv5PM6XOhGQVaPb43pn0UbMLNI0B9J/DDf28comi7rgnNdyc6lAU9p6j QAwCDC+gmuGePAgkLETkIfbXxODBmGqIzQuekuzOf9g9HzXpfDyo+o5HefHjH4WWPhYZ 0w+ywXzprugAOFGQ2k4Xdv94CsMZjmn8XrmKV4bLmSD9e2tktaADQaWUvDnGbEopAQqX caZg== X-Gm-Message-State: AOJu0Yy7SyVcR+utgy6NcbfE02fMTYnQsKr220MZDTbJzl6zWtIJwGKE DJYV+H7FE8JZqubkfb+uJH8752pzipaUxt9HP25JEbvX/9xgL4UrcG3Doe+XmQ== X-Google-Smtp-Source: AGHT+IFK1hIw7iP6V4TYzdEvb9ZtKXA8UgulI5UO36N9k7wXGTdWwg1qJY80+sFT5VIHJebPK3k0fA== X-Received: by 2002:a05:6e02:2141:b0:375:b52f:334e with SMTP id e9e14a558f8ab-3839b099870mr89881395ab.22.1720241858270; Fri, 05 Jul 2024 21:57:38 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:38 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 22/23] zram: add dictionary support to zstd backend Date: Sat, 6 Jul 2024 13:56:24 +0900 Message-ID: <20240706045641.631961-23-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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/home/ss/zstd-dict-amd64 /sys/block/zram0/mm_stat 1750638592 465851259 475373568 0 475373568 1 0 3418= 5 34185 *** zstd level=3D8 dict=3D/home/ss/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 3c8ba3232881..5a6940136cef 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.45.2.803.g4e1b14247a-goog From nobody Mon Feb 9 01:17:39 2026 Received: from mail-ot1-f42.google.com (mail-ot1-f42.google.com [209.85.210.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 3409313AA5D for ; Sat, 6 Jul 2024 04:57:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241862; cv=none; b=CUN+nroZLUES/lDCLyWGPyLUyM6jXzUl+r59xU2WTb88IS4p40WJQ66XiuqabXLSog/4ACHhPB37hkMWsziCc2DMj/pGvGb0SUwNqfsRlyb32iuFT0TK0WhRaqm9fyCDLatgDoEluad8u69VjpurIXpXX435z32j3Piuop1NFtM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720241862; c=relaxed/simple; bh=SVlOkh5GJ8NiyNyJ3ZVcfcBoQhkOmZLcRwI7bFhlKAs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lHudHhPmO68RYpIlHjjDVYJ21pSQINFR0Tgayj94MHZEKQVOi7ZvlcJXYJj+wVS9KcTyvslyoXbHIPwpjFxtB8RnX5jSw+e7hsBUE55ZDPyCVLyEeMmuFzMNj9bGuE2529k9CEvesIaGKuXOi3LJ4wUDJmQ1pNEJHGanY0mAie8= 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=U37hZIYv; arc=none smtp.client-ip=209.85.210.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="U37hZIYv" Received: by mail-ot1-f42.google.com with SMTP id 46e09a7af769-70362cb061aso76666a34.1 for ; Fri, 05 Jul 2024 21:57:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720241860; x=1720846660; 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=9hPVNUyXyyjE4q4xEMkAy1gPtT+CwQmVwlcp4wgHw+Y=; b=U37hZIYvplKphJpth8VySyAu2En5FYhtzveB+/VSYI5YbFIcyb+RkJ7R99iNIr+VSW /OYLij2QR4k9u/OrmZTjuPQ4bvCg6O6yTIOCN7ysGXrEyHLT3jbdjB+dReBhrEXNCjs5 o1q8QlnfXMQbfAPnmZ3hzvdzba+8iH3g1/wtA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720241860; x=1720846660; 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=9hPVNUyXyyjE4q4xEMkAy1gPtT+CwQmVwlcp4wgHw+Y=; b=koJ6/xOdCokdK+TUuse+6VPLjS/4VUhG0xNLN6P635xolxQRqp2NI0uV4P8Kgc8jj/ Lbd3uRpe3p+yemjm0oI4L4O7xXX4SaYXr2Mf74tgBDJM79fQK4GFq4cPeN9YbpQsN51C RiYj2GV6qd1q9OJ1LD0m6L2Vc0UCbkKmc50GP2Jjgc+c/WgTvo2JO3A79kU0Vsfa1hby a1hKvUxRPY1oGsLAKp8i9ySq4uAexUVA9NjKlXR675l5/jjulFvJ6A33ArJ6j4TUb30E LTi5DKGztMQ5NG7yUtvQH6AHzrNCvGqcl7IOQVMZQEjBoYyIGnh2lq8SGN2rhAQDmBWI 9s6Q== X-Gm-Message-State: AOJu0YzC6pdOAjhDzZrSanMs1PiQMHMetLxfF3LkJVbcp38jDwmjJWO3 GR455purMzsd1jVUkzHf7w9tNPCDvOv+JLiALx/1jbjOaqON3jChspgJQ9NVvg== X-Google-Smtp-Source: AGHT+IErEjggjoZ4CYgQxuvsWS4JdaBEcpnL8tjLtC1lGBOmulPOKxotlxcc+ly8z+dqocdN+M8OLg== X-Received: by 2002:a9d:7dda:0:b0:703:6076:a47 with SMTP id 46e09a7af769-70360760db2mr825427a34.23.1720241860303; Fri, 05 Jul 2024 21:57:40 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:88a7:e7d7:713d:ff09]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7623cd854b2sm2784104a12.38.2024.07.05.21.57.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jul 2024 21:57:40 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv5 23/23] Documentation/zram: add documentation for algorithm parameters Date: Sat, 6 Jul 2024 13:56:25 +0900 Message-ID: <20240706045641.631961-24-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.803.g4e1b14247a-goog In-Reply-To: <20240706045641.631961-1-senozhatsky@chromium.org> References: <20240706045641.631961-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, 36 insertions(+), 9 deletions(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 091e8bb38887..e3cdbf4ba61f 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -102,15 +102,33 @@ 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. + +It is also possible to pass algorithm specific configuration parameters:: + + #set compression level to 8 + echo "zstd level=3D8" > /sys/block/zram0/comp_algorithm + +Note that `comp_algorithm` also supports `algo=3Dname` format:: + + #set compression level to 8 + echo "algo=3Dzstd level=3D8" > /sys/block/zram0/comp_algorithm + +Certain compression algorithms support pre-trained dictionaries, which +significantly change algorithms' characteristics. In order to configure +compression algorithm to use external pre-trained dictionary, pass full +path to the dictionary along with other parameters:: + + #pass path to pre-trained dictionary + echo "algo=3Dzstd dict=3D/etc/dictioary" > /sys/block/zram0/comp_algorithm + +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). =20 4) Set Disksize =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -442,6 +460,15 @@ configuration::: #select deflate recompression algorithm, priority 2 echo "algo=3Ddeflate priority=3D2" > /sys/block/zramX/recomp_algorithm =20 +The `recomp_algorithm` also supports algorithm configuration parameters, e= .g. +compression level and pre-trained dircionary:: + + #pass compression level + echo "algo=3Dzstd level=3D8" > /sys/block/zramX/recomp_algorithm + + #pass path to pre-trained dictionary + echo "algo=3Dzstd dict=3D/etc/dictioary" > /sys/block/zramX/recomp_algori= thm + Another device attribute that CONFIG_ZRAM_MULTI_COMP enables is recompress, which controls recompression. =20 --=20 2.45.2.803.g4e1b14247a-goog