From nobody Wed Dec 17 09:01:24 2025 Received: from mail-ot1-f46.google.com (mail-ot1-f46.google.com [209.85.210.46]) (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 1BCA317C8D for ; Fri, 12 Jul 2024 05:19:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761544; cv=none; b=K2ZYphQ5H+U9mMe8iZ+rba2MBSlryWJOrcxwaRzj5CuvxwTYpU5E0pC92S/hOKMWYsi9wA7kO5qbsK2Bv81StwzfN/6Ox51qP0050tEPTxmSeC7r9kX0Tf6RIzmCA6/T3JVN5w/A23Ppab9bsADPzWC60IK+ux9PlQM1rJ5uw88= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761544; c=relaxed/simple; bh=D8WXbYL73jK4vli9EwReTWnvkQH2fOA76UcHZIphfSQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CHM7cloPM+kGXxpOO61bBXbkXkVCHkfWBq8OEy5eLDDAbj7oz3uRIEm+pak8Z0RCz5a4MeSEPaUrvu3+TFmMjtTIpvfoJ66ZGuvfMAa50VxwVUNZQpCEYTnrd9f3N4DslJOW0FZJUfpXZEj0nPlOxd5Mgu0PsD+GZHbziCl7Cro= 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=SEEbVwle; arc=none smtp.client-ip=209.85.210.46 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="SEEbVwle" Received: by mail-ot1-f46.google.com with SMTP id 46e09a7af769-7044c085338so877936a34.2 for ; Thu, 11 Jul 2024 22:19:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761541; x=1721366341; 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=i05Lj+y8qHOCzSjVM9gXfHHjxDugAgWJ2b7D0+8v8cg=; b=SEEbVwle6PRqjs64JKKp4w6ctP8PsCqfSYh4HzZCBCLF+rB/ZXX1Qr7C2XrFP0GbuM w9CVZS7U4+G3zhHBDm4u/w68YPW4EFECyM1Hu+HLTjg/rYH26oYlp3dstJYTTbT5RMn+ r/5zeNWu0urE2uOpwnVpHHARNG7NiauF7Ykmo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761541; x=1721366341; 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=i05Lj+y8qHOCzSjVM9gXfHHjxDugAgWJ2b7D0+8v8cg=; b=jlrNhxCrNesE1DQa6h3/as9WkllBaq9L0N/Jf/obr3FJO9vejKlCBdqqsEKaEmlSlu 7iQOLClKjIKmNnqGtY2UHHuhtX74MQenqiqsnafsIdc8vAMcSQEKtTfgVbDazP76CLNi DaOC6z/QmvRph96sas0jaJaxuRV9WeUNgoxFwhehaHdFxl9R+XWB95RKnl2Ysq3cwPdV NZthK2pCaHRfXM2V+SuEblEymgFS4kJZeBMGjVPL05fFBsQA+G4csLA76ii08FgVogx6 Hpjcbb5scQMMfvH6i+iPyiThJBL1rcWBsLtaVuQgNrR69XgDgWpGz/StsU+LKAdnsJG9 tNig== X-Gm-Message-State: AOJu0YxlyXqEyIdDaPmusadp30uTuBkfNmEsjEBDnh2S3Nu49dJXKySH WMIuKzqIzoAI87xTLUGKptMZ1O8fGGj7VSb54iHWEf9EnItshFpfthmpxZnEwg== X-Google-Smtp-Source: AGHT+IHrXrRY31nmgWIKayz1TMynawnwcxwm51h5NmG8E/UqRWH3yIuXUo4c2HVEBeRfiWHZ+drHbg== X-Received: by 2002:a9d:6397:0:b0:703:783a:dad5 with SMTP id 46e09a7af769-703783add7cmr9327462a34.27.1720761541011; Thu, 11 Jul 2024 22:19:01 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.18.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:00 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCH v6 01/23] lib: zstd: export API needed for dictionary support Date: Fri, 12 Jul 2024 14:18:12 +0900 Message-ID: <20240712051850.484318-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 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 34DFB1BDE6 for ; Fri, 12 Jul 2024 05:19:04 +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=1720761545; cv=none; b=g7cmoNMT3+F65AppIe5bElLVI5vk4Z+Mj1kSbPFULhJNuBdCvnikYPA3EJ2g6X5o1X7sLv2aV56MhNMck0WlUaZEGJGc5aTiOndCzXkDjsoiOSpRPnSxN1jnJrZ1132exjIh0SgcIeG+7jwtk9LvYn+zV/OXLnARcUyt3RCSyDg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761545; c=relaxed/simple; bh=xetQK4NvrTVzpEMIZzjKGoPzjTKxq2X0OCSfKW+YHz0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CUUrbUWFCBaO9ecs9usEaQt+IckWuBA+D9nW+tWas9F7Y7Uvdicj3b2VmDr5R4RcGbjldaNW0ahaf9C8ZlqK1cH580/T0q5LkL96uIc+QZpZivk8o68ao9as/pOjiHXZgQecn4jx/2HRGHkqkSlcK/kgEwBhCBtiVjTI8BgzLl4= 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=Gs9fwuyu; 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="Gs9fwuyu" Received: by mail-oi1-f169.google.com with SMTP id 5614622812f47-3d93147ac6bso901509b6e.0 for ; Thu, 11 Jul 2024 22:19:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761543; x=1721366343; 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=jK4yGCTZGoA8FfUJeWZ5DsSBcIzSsvHoyFCV3fGU2TI=; b=Gs9fwuyuwT0kLv/YmYZLYneamvUz1jIG6WvpKn1TS0NSn4JSX2g34UOGo9UzkKmDql yeptBi49sxyYygyQpCTGELDK02o+fmdWS7+xYXiJe8Kqwu8i+p28F500ZegVY9lHMQR9 Vp2mL6yRYQckISDI/YzwEHNVwAWsOegcbmCSU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761543; x=1721366343; 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=jK4yGCTZGoA8FfUJeWZ5DsSBcIzSsvHoyFCV3fGU2TI=; b=bU1N+qJAFLi5/1Lm2atPAJsjzlK3Gp2sq6d+2nRBgGozGJwbgH27oeo1VcXu1kOJvS l3y4NEF0369NhddD0Msm65K2ywKrHrL65Ge0R7zNnRO1ag9DTJh1Sjx0In0XP0fxA6NP eyeSwBU9NF0cFiaSLGF2bWhWuP4K3TQpNnJ1j0J23gECpHZ+y9kpTSCMCZZNaXNFRhO/ yxpxrKzgmJ416bXWOq2pWvG/WAZuCl99l3QLYzTW8kitSSreOZTdhUCRGn1HHG/92vnP Djt6uaIhCdbCH8t3ZnrFEt/9tCwPupT28JulduNEayXzpnxYwNhC8kciPFHz8Bv9rgsT GaXg== X-Gm-Message-State: AOJu0Yy8iUSkyqyLv7dGbx4g1/j7oKZ7NuM5WvhLzjq/k+IS5Rd1ULfh 71yGxFzuW73Vf6giJXnzTsGL6Gry+ZJo2uCR9JGv27sZ6a1/kXk2upQpEDqVQg== X-Google-Smtp-Source: AGHT+IHVu0899IACUROmpvF1H0znP5GmchmoXxv8zKFqxqWYcBpnyKonZrqH8uozm0s1Iz9VsavLhQ== X-Received: by 2002:a05:6808:2395:b0:3d9:2fd5:6c14 with SMTP id 5614622812f47-3d93c033989mr12604186b6e.29.1720761543355; Thu, 11 Jul 2024 22:19:03 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:03 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCH v6 02/23] lib: lz4hc: export LZ4_resetStreamHC symbol Date: Fri, 12 Jul 2024 14:18:13 +0900 Message-ID: <20240712051850.484318-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-ot1-f50.google.com (mail-ot1-f50.google.com [209.85.210.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 690F02EAE6 for ; Fri, 12 Jul 2024 05:19:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761548; cv=none; b=J7RKBar/9LDGhaoe/0eVmV/eowUxr4/IddW6V//5RqjgT37Ci3ChuU7/fK+yaiKCdSZC6s23QrYmNyezyRZBYYaHn/wTp1Hoii/VuuvNc6CBpDqEhix1VQdv5Hc7xmN+VrwgnpSxd5yb42VacyfV6weTQy/NP0afHy1IJxaqmjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761548; c=relaxed/simple; bh=vdYvQfcQu1mt93UPykwvclLXnIntkTvh7GSWCA4dW2s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A8ChtScIC6BnQNunDcN9ob8CZ9FtSLL+V+USgB7JGLR+kM1Ob56jN5MpOnMRLWVp1Nl9Tf88QY4hU5PlbgU1q7iFSNYD0MvARP1GOXtfKr8ubsz6wfSaO0i6qq/WtaHAGGkUztW0imY17xJuVY8SSo2nrFOCl44V/Nz1tjOF9d8= 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=DcxBJ++I; arc=none smtp.client-ip=209.85.210.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="DcxBJ++I" Received: by mail-ot1-f50.google.com with SMTP id 46e09a7af769-7036e383089so909634a34.2 for ; Thu, 11 Jul 2024 22:19:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761545; x=1721366345; 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=ECaTUdajKrss2jyo4a5iaGCo7q7p1EgM+Xi9/dziakE=; b=DcxBJ++IqOrORfS1Rqen2SVdkyzNAjPUj/F0bTCwPVTkMZJCMjCosR/Ss9lBfLRoiY BjslASMeb3Wf2Nw2g8JlrCrZRsEdTY6YmcyT2nU1hFEzFv7cgSMdeBfO27oYOeEruxXV zZqPoHXOFBsKFHTFi9BtnRQqBfKvzPeMZcpdQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761545; x=1721366345; 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=ECaTUdajKrss2jyo4a5iaGCo7q7p1EgM+Xi9/dziakE=; b=BYDuv857NTAsSq3HtWj0Yqb+FVL+2Q5Yh3/DY76EZg7N5sng0LK8+I2qjJZECPfZJ4 iKIQ4V+XEp2yYtwH8EX1PN514QjFEJKM3p1/7UFVl9yrCYr5wsxz39Zn+5M+ueJhtY4Y VODOvvcV2H/zZpS/VLwWLwJRJWPxrYMnxzOP2iMuHPNdIu8JrevfQbN1LsgwvvN2OGcT vT+sEr8/BkBiIp4mL7XXEGYDmaa8ITsOFuEyThzpMpdM5UZhYhOo95GVHHUomKqOFff4 WdGwD1fq9G8lWB9gn6CNkNoxm0Vj+UVKpyKWjQLepke1FGDI4fAScvbwq3qSGGmbUbPW DcBg== X-Gm-Message-State: AOJu0Yyw0BAdjww62zN/TjBY4vUtbZsQVzu+A6MZf5Vr+D5APIRLOMKj GA4Z6Sr0N0zp0OoGbEzE+NlDpLlDe7flZ7KKwV1Xm2Oi6X+dYajWTsjj4i4GrQ== X-Google-Smtp-Source: AGHT+IFrDm6735UI/63EjXzjrotK6RyvKolr4AO3e1cwckwjGynCvF7pulss+Ma/8qhI3+63C1uKjQ== X-Received: by 2002:a05:6830:849:b0:704:46de:5820 with SMTP id 46e09a7af769-70446de5c70mr9419292a34.34.1720761545505; Thu, 11 Jul 2024 22:19:05 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:05 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCH v6 03/23] lib: zstd: fix null-deref in ZSTD_createCDict_advanced2() Date: Fri, 12 Jul 2024 14:18:14 +0900 Message-ID: <20240712051850.484318-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F2743EA83 for ; Fri, 12 Jul 2024 05:19:08 +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=1720761550; cv=none; b=O7cuDtg9NUcsZhXeWaJ2+B1fLRMgg+L4ULbG5qeEL49biz8y/qnHBAFW5fsF9EwAB+Vjf16ki4+1LKtF/O8NTuuTyH6XvVnkF5Zn1CZdN2g+i6QcgMeu5WevdY9WzRULc5ZEBL1PW5TASjnk3BggfymW+ehWh3M2KwHi1E81+b4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761550; c=relaxed/simple; bh=pCVGUI9coQ1GGtjREQtr7J4m3xMvhJ3HzpTiTLdKH+4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fyrbk3ymspBuDZNZorqEjqsWGfrDSmhymeu4MQwVG9rTQRPTxMY8xhOBVPIv0uJwQhW99QNyKvYdfTOaiWbUqjZSl1z8yYp/C4lczRw2+Y3251Z2NhhH1ce5EnLdk0sxgjB/WFrWFxWT9tJEGvpLMwdzOE7gJL/Sl+u182TgK14= 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=HRQRMu1y; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="HRQRMu1y" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-70af3d9169bso1513329b3a.1 for ; Thu, 11 Jul 2024 22:19:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761548; x=1721366348; 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=1KDwed5gvq8MMsbXHf9gcLXNPE5BVPoiraQJBExsFrE=; b=HRQRMu1yS8b//U/1ahm0MJV+mbxAL3wpJ7G5mi1BNvuaONIZFdnUf906mWe2rHKo1y tRgSjSznfVbtiypz80ZNrkAXxNODNet8Ap/MUCf8mcjFypsXvePI1UAUx3DLFacsdf21 FUYXxMwJa10GtihraU+KnY9245HsYRubKA/ZU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761548; x=1721366348; 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=1KDwed5gvq8MMsbXHf9gcLXNPE5BVPoiraQJBExsFrE=; b=OJYIJHFDBBAjufQ0B5YXmAEIgqBRNQtJRrynZmz+0ON8X7GTzgFRFUFnf9vHL49tCm cVAkC5iPZObeALVPu6V4mruN/k8RB84MBH+169FRj1cDLVga5VedvLR1xUWxvaBbiL0K jCzhf6RykL5nFv1XFLKtZEZodLN1Nt1qjBnWKqDmsko2hcqoLgiY9ESlL/eRypCgY6RN Why5Ktf5RL9pUO/f1lqi0f0Y72Neu/NtFjo5ZJFTatWOBcSIVYwYPtzStQ39P/IrWptO 3QWnaI+8Mp2eq45T1/LAiSGzNvZApEKAf05RffmUapjLJ2OHhGsviX2GjXv/x2j6ccLG vM1Q== X-Gm-Message-State: AOJu0YxAzm3Qt0YLkObf0Es/QR3tFr26WJQ+PIc9rHfnsJXYglK4aCdi f4rb/JWVMaNU4FUhfzS1m7zplTxjuwFiMx7im9vJBsVyad7U1E2xb4yBmLrf4w== X-Google-Smtp-Source: AGHT+IEVbSRo9/zmQe3hVmgfASHQ42mDbldrkwdybM6dWRDIos7ub3FGpiHE9dx3HCWuQzYvJI98Kw== X-Received: by 2002:a05:6a00:1401:b0:70a:ff09:f151 with SMTP id d2e1a72fcca58-70b43584ffcmr12860231b3a.20.1720761547622; Thu, 11 Jul 2024 22:19:07 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:07 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 04/23] zram: introduce custom comp backends API Date: Fri, 12 Jul 2024 14:18:15 +0900 Message-ID: <20240712051850.484318-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..2f75f18fc1ca 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 const struct zcomp_ops *backends[] =3D { + NULL }; =20 -static void zcomp_strm_free(struct zcomp_strm *zstrm) +static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) { - if (!IS_ERR_OR_NULL(zstrm->tfm)) - crypto_free_comp(zstrm->tfm); + if (zstrm->ctx) + comp->ops->destroy_ctx(zstrm->ctx); vfree(zstrm->buffer); - zstrm->tfm =3D NULL; + zstrm->ctx =3D NULL; zstrm->buffer =3D NULL; } =20 -/* - * Initialize zcomp_strm structure with ->tfm initialized by backend, and - * ->buffer. Return a negative value on error. - */ -static int zcomp_strm_init(struct zcomp_strm *zstrm, struct zcomp *comp) +static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) { - zstrm->tfm =3D crypto_alloc_comp(comp->name, 0, 0); + zstrm->ctx =3D comp->ops->create_ctx(); + /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ zstrm->buffer =3D vzalloc(2 * PAGE_SIZE); - if (IS_ERR_OR_NULL(zstrm->tfm) || !zstrm->buffer) { - zcomp_strm_free(zstrm); + if (!zstrm->ctx || !zstrm->buffer) { + zcomp_strm_free(comp, zstrm); return -ENOMEM; } return 0; } =20 +static const struct zcomp_ops *lookup_backend_ops(const char *comp) +{ + int i =3D 0; + + while (backends[i]) { + if (sysfs_streq(comp, backends[i]->name)) + break; + i++; + } + return backends[i]; +} + bool zcomp_available_algorithm(const char *comp) { - /* - * Crypto does not ignore a trailing new line symbol, - * so make sure you don't supply a string containing - * one. - * This also means that we permit zcomp initialisation - * with any compressing algorithm known to crypto api. - */ - return crypto_has_comp(comp, 0, 0) =3D=3D 1; + return lookup_backend_ops(comp) !=3D NULL; } =20 /* show available compressors */ ssize_t zcomp_available_show(const char *comp, char *buf) { - bool known_algorithm =3D false; ssize_t sz =3D 0; int i; =20 - for (i =3D 0; i < ARRAY_SIZE(backends); i++) { - if (!strcmp(comp, backends[i])) { - known_algorithm =3D true; + for (i =3D 0; i < ARRAY_SIZE(backends) - 1; i++) { + if (!strcmp(comp, backends[i]->name)) { sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz - 2, - "[%s] ", backends[i]); + "[%s] ", backends[i]->name); } else { sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz - 2, - "%s ", backends[i]); + "%s ", backends[i]->name); } } =20 - /* - * Out-of-tree module known to crypto api or a missing - * entry in `backends'. - */ - if (!known_algorithm && crypto_has_comp(comp, 0, 0) =3D=3D 1) - sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz - 2, - "[%s] ", comp); - - sz +=3D scnprintf(buf + sz, PAGE_SIZE - sz, "\n"); return sz; } =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..e5eb5ec4c645 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -1,7 +1,4 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (C) 2014 Sergey Senozhatsky. - */ =20 #ifndef _ZCOMP_H_ #define _ZCOMP_H_ @@ -12,13 +9,26 @@ struct zcomp_strm { local_lock_t lock; /* compression/decompression buffer */ void *buffer; - struct crypto_comp *tfm; + void *ctx; +}; + +struct zcomp_ops { + int (*compress)(void *ctx, const unsigned char *src, size_t src_len, + unsigned char *dst, size_t *dst_len); + + int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, + unsigned char *dst, size_t dst_len); + + void *(*create_ctx)(void); + void (*destroy_ctx)(void *ctx); + + const char *name; }; =20 /* dynamic per-device compression frontend */ struct zcomp { struct zcomp_strm __percpu *stream; - const char *name; + const struct zcomp_ops *ops; struct hlist_node node; }; =20 @@ -33,10 +43,9 @@ void zcomp_destroy(struct zcomp *comp); struct zcomp_strm *zcomp_stream_get(struct zcomp *comp); void zcomp_stream_put(struct zcomp *comp); =20 -int zcomp_compress(struct zcomp_strm *zstrm, - const void *src, unsigned int *dst_len); - -int zcomp_decompress(struct zcomp_strm *zstrm, - const void *src, unsigned int src_len, void *dst); +int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm, + const void *src, unsigned int *dst_len); +int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm, + const void *src, unsigned int src_len, void *dst); =20 #endif /* _ZCOMP_H_ */ diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index efcb8d9d274c..93042da8ccdf 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1327,7 +1327,8 @@ static int zram_read_from_zspool(struct zram *zram, s= truct page *page, ret =3D 0; } else { dst =3D kmap_local_page(page); - ret =3D zcomp_decompress(zstrm, src, size, dst); + ret =3D zcomp_decompress(zram->comps[prio], zstrm, + src, size, dst); kunmap_local(dst); zcomp_stream_put(zram->comps[prio]); } @@ -1414,7 +1415,8 @@ static int zram_write_page(struct zram *zram, struct = page *page, u32 index) compress_again: zstrm =3D zcomp_stream_get(zram->comps[ZRAM_PRIMARY_COMP]); src =3D kmap_local_page(page); - ret =3D zcomp_compress(zstrm, src, &comp_len); + ret =3D zcomp_compress(zram->comps[ZRAM_PRIMARY_COMP], zstrm, + src, &comp_len); kunmap_local(src); =20 if (unlikely(ret)) { @@ -1601,7 +1603,8 @@ static int zram_recompress(struct zram *zram, u32 ind= ex, struct page *page, num_recomps++; zstrm =3D zcomp_stream_get(zram->comps[prio]); src =3D kmap_local_page(page); - ret =3D zcomp_compress(zstrm, src, &comp_len_new); + ret =3D zcomp_compress(zram->comps[prio], zstrm, + src, &comp_len_new); kunmap_local(src); =20 if (ret) { --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.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 EC7CC7604D for ; Fri, 12 Jul 2024 05:19:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761558; cv=none; b=INKhKuON1ZUOfX97YAzxYZPjojBA72VNlB+Q2ePvtl6km9Mn54AJSPTn+ZGBzL6P2TDkOqoD3DZZN7DhoUwwDv78UW7N1ppB2KuSs6cNZWa8Z+/SVaiyjBWD0daES9SgfO6KL3S+0oLPpzRXNoOaU+EzMnZQ6xhLHIkooS/fNk8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761558; c=relaxed/simple; bh=CHEdMiMhgYInwkfp3Q8EUoDNjUdbVZTVY8neSKYoHcQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u9R+Y6wKvGUGhdesOwQ0j9lCqO6glS6C6f8zR/ZiXewEpAnLBjubC4ouL66q9bKzdyDuDGQAuKqxBTZ/zR/UAhFZh0Aw8vLfUApxS3lud7kASROMBzcZ4a3Bjdqj8enGYDAu4Z2lXAJcYduyIZ/jeA7wYxMlC5ECc/CxkxT2xqI= 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=g0invbkq; arc=none smtp.client-ip=209.85.210.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="g0invbkq" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-70b1808dee9so1273709b3a.2 for ; Thu, 11 Jul 2024 22:19:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761556; x=1721366356; 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=ht+3f0FtpNtS8JqL2/xQ8Ijm+o7mHtqwCkWXqPcnDZA=; b=g0invbkqhBhQdepPCNaYu+h9XtRnS35Pfu+mCn+PCIqkn7JZSuL9Ss8jFryqfKZ5fr srbKKlvbVZmK8QUIwCj+PpRle1568QaTCFDP0LIvz6+M7E411itB2BB+B1xc7NpCpDA+ LfBdjOKG75h+N8ZSp28eK6AhZpRc5LSxF1dWI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761556; x=1721366356; 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=ht+3f0FtpNtS8JqL2/xQ8Ijm+o7mHtqwCkWXqPcnDZA=; b=Rs+pBfe6IE+lhvKUbmgyPAoRMCIHPxViPPvG8AQeyNAebDuEy7IqNmagDJAxKFEiUe 2Th8AvK4fSUMl8EeQib0+WawOoBNhTcLMYryKJ382ZeP0KTsiIn64poUEojI6M6Va3yB s3ReVvNXSve7cJ03Ur38PPm7ZWiEN6mmwml+RILNsNQUzpDrxYdcfWPu299B2kUICoqt 0bkm/2KX420pPAY5Q9QNCwCYdAdNM5qKNCzhtrrTigRLcenYNMr1auE+xt7E9t7FUUfu /q0H2Z4C+c4LdDmWCWOVlZY2fkHIzhjUIIW+QCU3pI5zDAgeKP1y+VcNil6SkxnYRWba YGDQ== X-Gm-Message-State: AOJu0YzvXmLvf7Sq+gqOtdqB1SlcSrfAqS9H3T0RvrChj2aTORHcJi18 CRXr1zAdSUCB0xQMDHQoM/5obW2c8ljtwhYJD+TOofMLcwfGatvaWiYaWeNxUQ== X-Google-Smtp-Source: AGHT+IFPxq3Ug+6gPgibAegfNfHZ6jTYh+2Ha++Ld63dB5qwMyEoq8pNQLcTBS0RFKlpop4EU3wxPQ== X-Received: by 2002:a05:6a00:10d5:b0:705:9992:d8ad with SMTP id d2e1a72fcca58-70b4358d3c9mr11355015b3a.19.1720761549718; Thu, 11 Jul 2024 22:19:09 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:09 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 05/23] zram: add lzo and lzorle compression backends support Date: Fri, 12 Jul 2024 14:18:16 +0900 Message-ID: <20240712051850.484318-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..4c9e611f6c03 --- /dev/null +++ b/drivers/block/zram/backend_lzo.c @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "backend_lzo.h" + +static void *lzo_create(void) +{ + return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); +} + +static void lzo_destroy(void *ctx) +{ + kfree(ctx); +} + +static int lzo_compress(void *ctx, const unsigned char *src, size_t src_le= n, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D lzo1x_1_compress(src, src_len, dst, dst_len, ctx); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +static int lzo_decompress(void *ctx, const unsigned char *src, size_t src_= len, + unsigned char *dst, size_t dst_len) +{ + int ret; + + ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +const struct zcomp_ops backend_lzo =3D { + .compress =3D lzo_compress, + .decompress =3D lzo_decompress, + .create_ctx =3D lzo_create, + .destroy_ctx =3D lzo_destroy, + .name =3D "lzo", +}; diff --git a/drivers/block/zram/backend_lzo.h b/drivers/block/zram/backend_= lzo.h new file mode 100644 index 000000000000..93d54749e63c --- /dev/null +++ b/drivers/block/zram/backend_lzo.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZO_H__ +#define __BACKEND_LZO_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lzo; + +#endif /* __BACKEND_LZO_H__ */ diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c new file mode 100644 index 000000000000..19a9ce132046 --- /dev/null +++ b/drivers/block/zram/backend_lzorle.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "backend_lzorle.h" + +static void *lzorle_create(void) +{ + return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); +} + +static void lzorle_destroy(void *ctx) +{ + kfree(ctx); +} + +static int lzorle_compress(void *ctx, const unsigned char *src, size_t src= _len, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D lzorle1x_1_compress(src, src_len, dst, dst_len, ctx); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +static int lzorle_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, + size_t dst_len) +{ + int ret; + + ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +const struct zcomp_ops backend_lzorle =3D { + .compress =3D lzorle_compress, + .decompress =3D lzorle_decompress, + .create_ctx =3D lzorle_create, + .destroy_ctx =3D lzorle_destroy, + .name =3D "lzo-rle", +}; diff --git a/drivers/block/zram/backend_lzorle.h b/drivers/block/zram/backe= nd_lzorle.h new file mode 100644 index 000000000000..6ecb163b09f1 --- /dev/null +++ b/drivers/block/zram/backend_lzorle.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZORLE_H__ +#define __BACKEND_LZORLE_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lzorle; + +#endif /* __BACKEND_LZORLE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 2f75f18fc1ca..e358319c59dc 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -12,7 +12,14 @@ =20 #include "zcomp.h" =20 +#include "backend_lzo.h" +#include "backend_lzorle.h" + static const struct zcomp_ops *backends[] =3D { +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) + &backend_lzorle, + &backend_lzo, +#endif NULL }; =20 --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-ot1-f45.google.com (mail-ot1-f45.google.com [209.85.210.45]) (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 83FFE18654 for ; Fri, 12 Jul 2024 05:19:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761561; cv=none; b=NS3GwqmrgpOX44frNN+1Q1EYXW7Bevsoefb14Wt8105pl+HU7DtjCZ0ea9zD9EVKua8zTTELl0ErxOmdar4+JYzfdd+cvYF1mXzWC5mhKt9NvOiMXxRAaiD6CfaIe9Z0npyv2KBQuyaTj18mJG9/daU7pLZclYwagPqDZbp9LGw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761561; c=relaxed/simple; bh=u2NVoXdSGQP3WhlQPbRooV94Y2i5OvDj2bZiUJ5WI8g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mJJyROEzIxze0ChydEN+P6B7pyj3fv1cnfm60MV2yRrfUYotzFFNVJmY57XvBjQKlAjLqqUXy7zO5NhUzxDe9z37nGml2adwTjdyVoRxyy+MEs4NLnF0hzjGrasG+QqvPcz6fBIJO4OMmaO5X5YMY+R+j7LAZI4SxrTqt44kzGw= 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=WWXdtG24; arc=none smtp.client-ip=209.85.210.45 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="WWXdtG24" Received: by mail-ot1-f45.google.com with SMTP id 46e09a7af769-703ba2477bdso778042a34.2 for ; Thu, 11 Jul 2024 22:19:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761558; x=1721366358; 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=v89ezEM1/0FTv8HuuQypBz5T+BXw4z2POdCqGFQackQ=; b=WWXdtG24EAeoqFC8Lu/Mctc79Id852wTqvf3eI9TkFrqxLQCeGk0oFIzloWXC9zz9I N9zWbmMX1FZ9PB+BU4p4fHLCy3nDR5+i7rrh8iVuwCHpiTVmK1v744Mys5Brq1TED/Mg C9FdeWBd3heTpvMFsrZXjI8clSqulZ3mW+shk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761558; x=1721366358; 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=v89ezEM1/0FTv8HuuQypBz5T+BXw4z2POdCqGFQackQ=; b=GG8wnmvPDqbZTSG8LjiziZczK8Ie6MMIxVz9gchHZXNHnXgu3r06vYuR7COmmTst95 tMqF5U8GXpo0HGzIrem3m1OegIFhBMVhbwgnMGH+GUo9CpyaM+uwO1QW9QcNWBQke2wn 4HfYdp8/dvSvhzNu05kKlQhR7xEi2sBkbWAyxBMG7LlI4oM0VnwYMJ7eR1xynuqUOxQ0 6KDVPB4WXI+Hc9+3uuImLtWWO2kBriWawUBG1+IhHor5mZIuC7cW64dC/w0gns7gmccN NVrL+dWOaYDmcx69Nhz8BblaSdq0RNYV7slc3tCNq2vhTv/tsTaCVrXuF/SoNSpEzvV9 5xLg== X-Gm-Message-State: AOJu0Yyc7d6ZqWyiC4xQmoaSmeZ8o2erXqC4geJmirWNF0ePPDVvucs+ WOmU7Mdk2+SA5QCxNYAKbo02O82rWSOsufQPbMldlVtVpKYz4zVNNiS8xfSr2oqNf3M4y81HRCf FeH1c X-Google-Smtp-Source: AGHT+IE4KygjsvNfaffSipLnMl8tKev5nB7dKvv95cdYYWzs/vyKBHcrc8THYxuaxwOCTi7ULMmgKg== X-Received: by 2002:a05:6830:1e47:b0:703:5db8:805 with SMTP id 46e09a7af769-703759faf93mr12786584a34.4.1720761558504; Thu, 11 Jul 2024 22:19:18 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:18 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 06/23] zram: add lz4 compression backend support Date: Fri, 12 Jul 2024 14:18:17 +0900 Message-ID: <20240712051850.484318-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..c1d19fed5af2 --- /dev/null +++ b/drivers/block/zram/backend_lz4.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "backend_lz4.h" + +struct lz4_ctx { + void *mem; + s32 level; +}; + +static void lz4_destroy(void *ctx) +{ + struct lz4_ctx *zctx =3D ctx; + + vfree(zctx->mem); + kfree(zctx); +} + +static void *lz4_create(void) +{ + struct lz4_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + /* @FIXME: using a hardcoded LZ4_ACCELERATION_DEFAULT for now */ + ctx->level =3D LZ4_ACCELERATION_DEFAULT; + ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!ctx->mem) + goto error; + + return ctx; +error: + lz4_destroy(ctx); + return NULL; +} + +static int lz4_compress(void *ctx, const unsigned char *src, size_t src_le= n, + unsigned char *dst, size_t *dst_len) +{ + struct lz4_ctx *zctx =3D ctx; + int ret; + + ret =3D LZ4_compress_fast(src, dst, src_len, *dst_len, + zctx->level, zctx->mem); + if (!ret) + return -EINVAL; + *dst_len =3D ret; + return 0; +} + +static int lz4_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, size_t dst_len) +{ + int ret; + + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (ret < 0) + return -EINVAL; + return 0; +} + +const struct zcomp_ops backend_lz4 =3D { + .compress =3D lz4_compress, + .decompress =3D lz4_decompress, + .create_ctx =3D lz4_create, + .destroy_ctx =3D lz4_destroy, + .name =3D "lz4", +}; diff --git a/drivers/block/zram/backend_lz4.h b/drivers/block/zram/backend_= lz4.h new file mode 100644 index 000000000000..c11fa602a703 --- /dev/null +++ b/drivers/block/zram/backend_lz4.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZ4_H__ +#define __BACKEND_LZ4_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lz4; + +#endif /* __BACKEND_LZ4_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index e358319c59dc..080cf1d001f0 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -14,11 +14,15 @@ =20 #include "backend_lzo.h" #include "backend_lzorle.h" +#include "backend_lz4.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) &backend_lzorle, &backend_lzo, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4) + &backend_lz4, #endif NULL }; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B2E686EB55 for ; Fri, 12 Jul 2024 05:19:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761563; cv=none; b=AGIxy4XnjPtGuGBbRaW4WvG/OotFo6ed4gEVXBsRJZ4HUslgaq0w8vTzlj7pdEyIV/nI8pJ0mQC6wXR6pLB/7QSHG+flTxgSuEmvjPth4DFQzSE7xYA6o81I9CPlHhdpNIjGSB1DvZqrZAkY2L1a/9/Kn4EmgSBMUIXrkNkuvco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761563; c=relaxed/simple; bh=nuxOffzi+aQXSrLraJAVYpsnXY5nFZPNCqMwYC7MjsI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VlaSoDv1MH+9EBEOROKqTscLWmCmA/EPYyHsoRmWULi+2UtYqA5W/WuDzxh6XhpqnSJYmv6Q3ZwmOUWyGuJ8EiXE9qXf897e/+uFKKtL3iQmmfkNGDSGoN4QB+A8mGeoAv1EygZR0xLA2ZXXvc6wzWxK3MKAtmFKEinn/cHxJlM= 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=BgyAz7Go; arc=none smtp.client-ip=209.85.210.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="BgyAz7Go" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-70b0d0a7a56so1496275b3a.0 for ; Thu, 11 Jul 2024 22:19:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761561; x=1721366361; 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=ihCXkqK3oyAPMbJxDZQ4flZ6D4+8C4PO76kBiGiEGv0=; b=BgyAz7GotqQ+IGmgD87fZfj5jkpO3LUOkZSMSqjN8o4ZUEA4eSH7I+Po+nzQ3nzicq 1Px6tEjZy66B9k0+5vfyVvyqKmdecHzryiXSlkVwmmKQD3r6647WpHvXZsVpjat8FbaR /6bPy2vk2HsIsx/lRp0FXaMeB/ZgCd9vOc0Ho= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761561; x=1721366361; 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=ihCXkqK3oyAPMbJxDZQ4flZ6D4+8C4PO76kBiGiEGv0=; b=BJjEqbp8wCEDcuM/55LJa4WL3ZKFMyHXInsoet62G4gN8gLJXoSL7cCN/UudC6tfVs kA26kFn8tSOOEG7U78SfQbyN5AKhwJgWQry5g1cBDUJq80nz976QurLUhBKU5nQErlfn KDkSRZ79H7NSrWBI5Az4Vul76VkCsOT5MRn0mtAz1wsNveIMNJKc6eeY9aBaOHr6M3P1 kokO5XjIlcVRAnfVQxjLOdD6rmhrk/TVn8cfjNron8Rs8GangsseCMhxdrw/m7yIbFkQ BZKxSSPTJ5abgE0249Str94U6E3g2NFJIMBsCb3vU70Me+XlN04xG0fPUJEbCYTF04qd 2Z+Q== X-Gm-Message-State: AOJu0YwQDJ+sV0aX3E+F0LjI592e+3ZmfejbXkowMW+5gKE6EIz9IkgI rb0U5YxJoIICW4Xvz550cGFvgIF2igaA2NV9LwbUXIJC4iM0lCbq0o/uKIONiA== X-Google-Smtp-Source: AGHT+IE+U2MZZIB2Z+kFgNxjfY4JS8WaUJeGuDmWzGHw3n5P2X4BSnEBQlD5HOoI5qk7X/aTsErEQw== X-Received: by 2002:a05:6a00:1395:b0:70a:f57c:fa1d with SMTP id d2e1a72fcca58-70b43623b6amr13483706b3a.29.1720761560909; Thu, 11 Jul 2024 22:19:20 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:20 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 07/23] zram: add lz4hc compression backend support Date: Fri, 12 Jul 2024 14:18:18 +0900 Message-ID: <20240712051850.484318-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..536f7a0073c4 --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "backend_lz4hc.h" + +struct lz4hc_ctx { + void *mem; + s32 level; +}; + +static void lz4hc_destroy(void *ctx) +{ + struct lz4hc_ctx *zctx =3D ctx; + + vfree(zctx->mem); + kfree(zctx); +} + +static void *lz4hc_create(void) +{ + struct lz4hc_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ + ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!ctx->mem) + goto error; + + return ctx; +error: + lz4hc_destroy(ctx); + return NULL; +} + +static int lz4hc_compress(void *ctx, const unsigned char *src, size_t src_= len, + unsigned char *dst, size_t *dst_len) +{ + struct lz4hc_ctx *zctx =3D ctx; + int ret; + + ret =3D LZ4_compress_HC(src, dst, src_len, *dst_len, + zctx->level, zctx->mem); + if (!ret) + return -EINVAL; + *dst_len =3D ret; + return 0; +} + +static int lz4hc_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, size_t dst_len) +{ + int ret; + + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (ret < 0) + return -EINVAL; + return 0; +} + +const struct zcomp_ops backend_lz4hc =3D { + .compress =3D lz4hc_compress, + .decompress =3D lz4hc_decompress, + .create_ctx =3D lz4hc_create, + .destroy_ctx =3D lz4hc_destroy, + .name =3D "lz4hc", +}; diff --git a/drivers/block/zram/backend_lz4hc.h b/drivers/block/zram/backen= d_lz4hc.h new file mode 100644 index 000000000000..6de03551ed4d --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZ4HC_H__ +#define __BACKEND_LZ4HC_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_lz4hc; + +#endif /* __BACKEND_LZ4HC_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 080cf1d001f0..305d56278365 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -15,6 +15,7 @@ #include "backend_lzo.h" #include "backend_lzorle.h" #include "backend_lz4.h" +#include "backend_lz4hc.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -23,6 +24,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4) &backend_lz4, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4HC) + &backend_lz4hc, #endif NULL }; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com [209.85.167.176]) (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 3798012AAE2 for ; Fri, 12 Jul 2024 05:19:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761565; cv=none; b=VBWvN6RljaGlbgazOCbRAo4MeoxlFMRP790/uPKbyLkHucu0hwelO+LY73+QTNVmediUu1Dh2N4b3P0APYDzsPpGEFG3WJztjQWcpMdNCwGkxP2BOYW2tlXT1HjBRMlXtzRE7FCLHuG/mSaF7R3+asHSe/DU4dfoLw8Mnp4p8po= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761565; c=relaxed/simple; bh=/Uz+4aL3OfkfgmlUdxoXvZWR7jxQnLeLFRkkRRBEKl4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fjA98lg1vJdkACZVX/+Dhnk8C+uI3X8ClQpqHZXiPMNmtX6BMlQItt0w3iebdMu33pkaFPoVtEFJfhiZ2ZS7H0XL7EopBFzq4z3v42ImAbbGEF61WzTLWfj5QHnlwvJK1wDoYXCFr2evGdqxIJild98XwTn+5HJyNdhVZHcA+lM= 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=ElIAkyfh; arc=none smtp.client-ip=209.85.167.176 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="ElIAkyfh" Received: by mail-oi1-f176.google.com with SMTP id 5614622812f47-3d9db222782so940063b6e.3 for ; Thu, 11 Jul 2024 22:19:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761563; x=1721366363; 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=yLAUG20xE1g/zBI3JLnVMGk2DADM5s4npJDycMgpMaI=; b=ElIAkyfh4vJFzTCCoXjxJX77J0U4eRh/iw84BQ6HJbjmx/V2u6J4XcasZWFJdMQLRg HOTbzsVPEobgPPG4PGBG22OAOiuyR78nkN04lFtqUrpFURs3KjMsp8u8bkt2TP9UAqg7 sr3N/ze5QqAV2OUUY4EVMKvhfNIsLN0+e8vWM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761563; x=1721366363; 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=yLAUG20xE1g/zBI3JLnVMGk2DADM5s4npJDycMgpMaI=; b=E48ohODja4mmaigVvGKABJmFMn5VJnZm9iYoMxwVTcE8ayQUBxFgrWW8DEHULr9U9K N/dZhTjcOoNThENG9gdrpNKf+pY9WP44Z5LDk6H0hkiBw/+w/RSk02lvD+BZ+uwIeRkF FnB3Gu5qWq2N9uPXN3EyZw5tI4oixwrmDdy+RjKrqOleB9PqDugtg3oA7ubdp+qKkYJn 0DL5/V1XOMVjsQKB2QEABPuxdrIRVxwpDI3CM1CaSWbAGtXER5ZDlPPawKaxNHJtfr8c 5Cfybs+TxcAdPtmBdN8/E53k90MIiJeWtjn9gciu8YG0NJnrSJpYXx2TXoYFWiljd+km 9hPg== X-Gm-Message-State: AOJu0Yz9WYZUTOuLDhopVd0i3BvBDGCewpxYjsZT1rd91IBpUyhiwMLJ ZpFWJ1gU4qEWoZO91lythaC0BlI8q+T/NW3EwLoXqEQEKsJ4j+v4nShNkJbWkgsP0AhixmCTOwP orZaW X-Google-Smtp-Source: AGHT+IEUcvn1ieIrOcE6n5OoaZdfZFDBRd6Vy+zpsv33qL0HAM1/I8qFLiULJobFxdqwuJ/iyMQvfQ== X-Received: by 2002:a05:6808:2109:b0:3da:a793:f0df with SMTP id 5614622812f47-3daa7940200mr3186958b6e.9.1720761563210; Thu, 11 Jul 2024 22:19:23 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:22 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 08/23] zram: add zstd compression backend support Date: Fri, 12 Jul 2024 14:18:19 +0900 Message-ID: <20240712051850.484318-9-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..abec68d1104b --- /dev/null +++ b/drivers/block/zram/backend_zstd.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "backend_zstd.h" + +struct zstd_ctx { + zstd_cctx *cctx; + zstd_dctx *dctx; + void *cctx_mem; + void *dctx_mem; + s32 level; +}; + +static void zstd_destroy(void *ctx) +{ + struct zstd_ctx *zctx =3D ctx; + + vfree(zctx->cctx_mem); + vfree(zctx->dctx_mem); + kfree(zctx); +} + +static void *zstd_create(void) +{ + zstd_parameters params; + struct zstd_ctx *ctx; + size_t sz; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + ctx->level =3D zstd_default_clevel(); + params =3D zstd_get_params(ctx->level, 0); + sz =3D zstd_cctx_workspace_bound(¶ms.cParams); + ctx->cctx_mem =3D vzalloc(sz); + if (!ctx->cctx_mem) + goto error; + + ctx->cctx =3D zstd_init_cctx(ctx->cctx_mem, sz); + if (!ctx->cctx) + goto error; + + sz =3D zstd_dctx_workspace_bound(); + ctx->dctx_mem =3D vzalloc(sz); + if (!ctx->dctx_mem) + goto error; + + ctx->dctx =3D zstd_init_dctx(ctx->dctx_mem, sz); + if (!ctx->dctx) + goto error; + + return ctx; + +error: + zstd_destroy(ctx); + return NULL; +} + +static int zstd_compress(void *ctx, const unsigned char *src, size_t src_l= en, + unsigned char *dst, size_t *dst_len) +{ + struct zstd_ctx *zctx =3D ctx; + const zstd_parameters params =3D zstd_get_params(zctx->level, 0); + size_t ret; + + ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, + src, src_len, ¶ms); + if (zstd_is_error(ret)) + return -EINVAL; + *dst_len =3D ret; + return 0; +} + +static int zstd_decompress(void *ctx, const unsigned char *src, size_t src= _len, + unsigned char *dst, size_t dst_len) +{ + struct zstd_ctx *zctx =3D ctx; + size_t ret; + + ret =3D zstd_decompress_dctx(zctx->dctx, dst, dst_len, src, src_len); + if (zstd_is_error(ret)) + return -EINVAL; + return 0; +} + +const struct zcomp_ops backend_zstd =3D { + .compress =3D zstd_compress, + .decompress =3D zstd_decompress, + .create_ctx =3D zstd_create, + .destroy_ctx =3D zstd_destroy, + .name =3D "zstd", +}; diff --git a/drivers/block/zram/backend_zstd.h b/drivers/block/zram/backend= _zstd.h new file mode 100644 index 000000000000..10fdfff1ec1c --- /dev/null +++ b/drivers/block/zram/backend_zstd.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_ZSTD_H__ +#define __BACKEND_ZSTD_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_zstd; + +#endif /* __BACKEND_ZSTD_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 305d56278365..b920462d7e56 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -16,6 +16,7 @@ #include "backend_lzorle.h" #include "backend_lz4.h" #include "backend_lz4hc.h" +#include "backend_zstd.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -27,6 +28,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4HC) &backend_lz4hc, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_ZSTD) + &backend_zstd, #endif NULL }; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-il1-f176.google.com (mail-il1-f176.google.com [209.85.166.176]) (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 732F212EBE9 for ; Fri, 12 Jul 2024 05:19:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761567; cv=none; b=fSMvJBbxX+n6k6vtUh1p9GTw0RbLOOz2imkxpDmjWx9Nqkkk55xm2tm6PEXf8S9rDmbu6f9t0BfloBgt1q4sgaYEr+I2XrerAQPWGRqccASRzAZHHDZjWqqaGmc9wLw43mbCDZ0Kbtls5SKCjKv8MnJg2phqh26mqBe5dtMkx/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761567; c=relaxed/simple; bh=/2817xy2+Q8w7Yvd63vNMy+pnclhpzK34BUeLPjTGsc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XUBtjN+xRcQPiPoNlJ2AGpq+Ya+VRFQHJ3XTKLXFx7aJEnAOMFGq6NlqsjIisPWSRXVbIh632o6j7Jp6VwYfBKBPeKFwtZAciUGGGRAD2Jb7dgzE3MfPCKVGSn667VyohnLzSmZ4fije1a/MZWUdIyiI2eqPlKoPMjj6eqBqqW4= 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=YhSR3rbo; arc=none smtp.client-ip=209.85.166.176 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="YhSR3rbo" Received: by mail-il1-f176.google.com with SMTP id e9e14a558f8ab-383dfcd8cdfso6333615ab.1 for ; Thu, 11 Jul 2024 22:19:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761565; x=1721366365; 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=u21liy2GbPpyOwv3EJWVVcbcrohKbu0gurqjkloMlXg=; b=YhSR3rbooVcPDJb7M7Z81YCpsloGTNoENKeWhoLZnI7Qac+QSaoIXIx47d0wRkFvEH z/87FqdgIqyWt9MSjz7jHlm2JJ6D+Omg8VZNG8Sn81mcvooceVNQCsYgfHwG8qHkW4JN WqCfVxgEERUyORqscvA6qvhfXj1joQGT3Ie5c= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761565; x=1721366365; 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=u21liy2GbPpyOwv3EJWVVcbcrohKbu0gurqjkloMlXg=; b=qe3jgZHezCYGLbQnIOo3284/RBItPPSEah5PsSJBmuWUczMr9857dusMKpdBSIcLTe qxV09Q76VYEDhKPzVaYHiJxnYmofT9xyvVVbgfMob3h+ZA1+WHxtEegCSM+sY/dOchXU 0qaNM7ZYsuN2iQ9O+DmpDupCO/8r9v+m1rqfCcrDYq9tOfxe+vWfhTIGVi2keo2D1Cxd 9hrBTkh0WZKzwCpZd5bOfz1vgcvcypJtoswPSecqZp91O1gVyw1XycNt2O9G4CHhS/Ub TQVHrx9xarnG0qbld9uHdKdyuuLBh+G+09U2rY2RlcqxQ1mJv++Ulud8o2DUYXNF8gXn 7Jaw== X-Gm-Message-State: AOJu0YzTdoPpIszYRcMtn8w7UOf+uHsy5TP6GScJUvDh67PsE6x4cfce CNPY1mwjXX9SJBQnfjbxgqf5eSiUd+45XFLO4mm+AYoftX6nVaw6HQU1APNkZw== X-Google-Smtp-Source: AGHT+IGB7MW+cNp14mvUUbY0QXUbtSi+vnyQGU6EbhqbeFX09AMdNK63I0P6STHkhPjEOGbAgonfVw== X-Received: by 2002:a05:6e02:1d95:b0:375:aaaf:e88f with SMTP id e9e14a558f8ab-38a5aa280aemr134150545ab.27.1720761565510; Thu, 11 Jul 2024 22:19:25 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:25 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 09/23] zram: pass estimated src size hint to zstd Date: Fri, 12 Jul 2024 14:18:20 +0900 Message-ID: <20240712051850.484318-10-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" zram works with PAGE_SIZE buffers, so we always know exact size of the source buffer and hence can pass estimated_src_size to zstd_get_params(). This hint on x86_64, for example, reduces the size of the work memory buffer from 1303520 bytes down to 90080 bytes. Given that compression streams are per-CPU that's quite some memory saving. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_zstd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index abec68d1104b..310d970078e2 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -35,7 +35,7 @@ static void *zstd_create(void) return NULL; =20 ctx->level =3D zstd_default_clevel(); - params =3D zstd_get_params(ctx->level, 0); + params =3D zstd_get_params(ctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(¶ms.cParams); ctx->cctx_mem =3D vzalloc(sz); if (!ctx->cctx_mem) @@ -65,7 +65,7 @@ static int zstd_compress(void *ctx, const unsigned char *= src, size_t src_len, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; - const zstd_parameters params =3D zstd_get_params(zctx->level, 0); + const zstd_parameters params =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C85B1BC20 for ; Fri, 12 Jul 2024 05:19:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761570; cv=none; b=CQZ0cwgdnd8vXfpRsmRBypYj1074H8VA+/4XAdZk7skUsZzUd9tXqUJzlL4+CHjVgpSbTHdd26SlJCkUE0w/pl3HqDr3t/XPKVMKPTvut3fOh+pTy0AFFZgKx/mZ4GGg3Fgc0OcfIfaCoe392ckfZJ60k7xdPXTuAFuwnjrK3KA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761570; c=relaxed/simple; bh=/ynKcXho0I0Fo9asmir1w2xQV/PTACvP4Jzd/gFywIo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dxBV12QlcTn8bpj5O7tbCQzs+Gx0vwy8ykRggZ89jn/8hJvyPU55YNf1WL7KsyDqxgPXNvzyP094whK6YoDi5bBKW7DIYJ82BFpMUjmAyO4Y++v5LzSBkBvdRGyE2czhPOqSDyzf9uyyj16e8X9eAWGUcvrqhhjtkgXyu7qV6FU= 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=Bvx5PT9p; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Bvx5PT9p" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-70b04cb28acso1340328b3a.0 for ; Thu, 11 Jul 2024 22:19:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761568; x=1721366368; 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=Pt9HFXhm8jsjka0o6lJYYClx2NuPsy9T4M2HrSrOQU4=; b=Bvx5PT9pRZWLpN+3Wj1DEL/DcJeWw7JJafu4c2DzW5U+zOf43Te6U5l0Oi0lZI7y7P P2ZE79WjNOwavFYAYrYZj8cJLtbZUugQZao4fdcbFw14zZFyPFw7r/gwXZ6agUD9Iog3 0qSUXyBObhTuYOCAD4P8hthK/Hl5AyyCw+g2s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761568; x=1721366368; 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=Pt9HFXhm8jsjka0o6lJYYClx2NuPsy9T4M2HrSrOQU4=; b=jZYFfuDPYkRh7Xa3Ws6W0auZpnFHB+WTbxidyxBZlN4evrxFs53gHI2UgQiIk5NBtX 2ZIB15N5KRWTdhPdKPS70oz6c+P0DA/FTVH0EJjRvEp3WpqYfoKNRmhNWgeLTliOxZCT NonFzClJTpS6LqflylA0fV+ZCqXYJelRLl6zlRSUzOGXmHUENw1/rzpwQWzcSpoMxQP9 GZHv49g1waI3q9VN9NSYQPtMBixTFibNGaF2ubM/RVkQxdLLWow3vFAiP68FV5hhWMpm YNSvGMfepsrt4abjYidwHgmD9JLP7wAHPeYRTcnZP5nA5361OR4KfMW11gADuXO/MdGZ 8HAA== X-Gm-Message-State: AOJu0Yw3vcNwGqcTsPEKvNxh08uJoTC9FL8YZ6aKFHL6d8ej8Tkcp8SG 7pyPB2dFOWz2H5VKG7aVYB2gCRdNLUJCNNNekbeoGdTct9sbY1o8aAfDNNCeAg== X-Google-Smtp-Source: AGHT+IGS9EzrXig1LahWWg72yNBNn7Mk/hVSjnDVM2VpDkGSqFZzd0mcPwrenDkDvEsxylAEJkewLQ== X-Received: by 2002:a05:6a00:218a:b0:705:d6ad:2495 with SMTP id d2e1a72fcca58-70b6c928dfbmr3179789b3a.12.1720761567665; Thu, 11 Jul 2024 22:19:27 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:27 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 10/23] zram: add zlib compression backend support Date: Fri, 12 Jul 2024 14:18:21 +0900 Message-ID: <20240712051850.484318-11-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..acefb86701b9 --- /dev/null +++ b/drivers/block/zram/backend_deflate.c @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "backend_deflate.h" + +/* Use the same value as crypto API */ +#define DEFLATE_DEF_WINBITS 11 +#define DEFLATE_DEF_MEMLEVEL MAX_MEM_LEVEL + +struct deflate_ctx { + struct z_stream_s cctx; + struct z_stream_s dctx; + s32 level; +}; + +static void deflate_destroy(void *ctx) +{ + struct deflate_ctx *zctx =3D ctx; + + if (zctx->cctx.workspace) { + zlib_deflateEnd(&zctx->cctx); + vfree(zctx->cctx.workspace); + } + if (zctx->dctx.workspace) { + zlib_inflateEnd(&zctx->dctx); + vfree(zctx->dctx.workspace); + } + kfree(zctx); +} + +static void *deflate_create(void) +{ + struct deflate_ctx *ctx; + size_t sz; + int ret; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + /* @FIXME: using a hardcoded Z_DEFAULT_COMPRESSION for now */ + ctx->level =3D Z_DEFAULT_COMPRESSION; + sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); + ctx->cctx.workspace =3D vzalloc(sz); + if (!ctx->cctx.workspace) + goto error; + + ret =3D zlib_deflateInit2(&ctx->cctx, ctx->level, Z_DEFLATED, + -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, + Z_DEFAULT_STRATEGY); + if (ret !=3D Z_OK) + goto error; + + sz =3D zlib_inflate_workspacesize(); + ctx->dctx.workspace =3D vzalloc(sz); + if (!ctx->dctx.workspace) + goto error; + + ret =3D zlib_inflateInit2(&ctx->dctx, -DEFLATE_DEF_WINBITS); + if (ret !=3D Z_OK) + goto error; + + return ctx; + +error: + deflate_destroy(ctx); + return NULL; +} + +static int deflate_compress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, + size_t *dst_len) +{ + struct deflate_ctx *zctx =3D ctx; + struct z_stream_s *deflate; + int ret; + + deflate =3D &zctx->cctx; + ret =3D zlib_deflateReset(deflate); + if (ret !=3D Z_OK) + return -EINVAL; + + deflate->next_in =3D (u8 *)src; + deflate->avail_in =3D src_len; + deflate->next_out =3D (u8 *)dst; + deflate->avail_out =3D *dst_len; + + ret =3D zlib_deflate(deflate, Z_FINISH); + if (ret !=3D Z_STREAM_END) + return -EINVAL; + + *dst_len =3D deflate->total_out; + return 0; +} + +static int deflate_decompress(void *ctx, const unsigned char *src, + size_t src_len, unsigned char *dst, + size_t dst_len) +{ + struct deflate_ctx *zctx =3D ctx; + struct z_stream_s *inflate; + int ret; + + inflate =3D &zctx->dctx; + + ret =3D zlib_inflateReset(inflate); + if (ret !=3D Z_OK) + return -EINVAL; + + inflate->next_in =3D (u8 *)src; + inflate->avail_in =3D src_len; + inflate->next_out =3D (u8 *)dst; + inflate->avail_out =3D dst_len; + + ret =3D zlib_inflate(inflate, Z_SYNC_FLUSH); + if (ret !=3D Z_STREAM_END) + return -EINVAL; + + return 0; +} + +const struct zcomp_ops backend_deflate =3D { + .compress =3D deflate_compress, + .decompress =3D deflate_decompress, + .create_ctx =3D deflate_create, + .destroy_ctx =3D deflate_destroy, + .name =3D "deflate", +}; diff --git a/drivers/block/zram/backend_deflate.h b/drivers/block/zram/back= end_deflate.h new file mode 100644 index 000000000000..a39ac12b114c --- /dev/null +++ b/drivers/block/zram/backend_deflate.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_DEFLATE_H__ +#define __BACKEND_DEFLATE_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_deflate; + +#endif /* __BACKEND_DEFLATE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index b920462d7e56..4d212ef972ea 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -17,6 +17,7 @@ #include "backend_lz4.h" #include "backend_lz4hc.h" #include "backend_zstd.h" +#include "backend_deflate.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -31,6 +32,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_ZSTD) &backend_zstd, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_DEFLATE) + &backend_deflate, #endif NULL }; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A72FF130A4D for ; Fri, 12 Jul 2024 05:19:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761572; cv=none; b=uR2JC0IM8wItJ8HSD9t1cmzSF85Aw22mjcmuUzkGjKLBG9zF83d5E9w4EaLEghNf+wX5EzQjDFcD2Bq8Dg5A7yIQZ9IO1HTQayLcVKMmTrTTxBDekwgZiqpUUNUobTq/+xokO852juHaJSXQINXdEEqn5KBaEb9YwM0F7gkdxzc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761572; c=relaxed/simple; bh=Fivx6VMuk2vjhcGib7Tcx14jPun6dKIEhFaCBDHvtpY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qxbUNxc2CfrLZHx5u4p8t1cRWs9Bfjbs2t9ny/7mv+GxXojIll67CPnSiAQvrZJOYLWhcyLCNsKjaFxXSSVTDCsf3OvuKMxmbqQmypBPg/m3s17j0O446BLIZYshSd2YGG6w4RoYaV/kd/BqhB25h0pOnMUWyz4h4fJ630aW1gk= 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=E8IdklIZ; arc=none smtp.client-ip=209.85.210.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="E8IdklIZ" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-70af0684c2bso1284662b3a.0 for ; Thu, 11 Jul 2024 22:19:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761570; x=1721366370; 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=b9CbhV5g6i0tQmXsKmS9hqUZt4I9LJTh9jd520bTuUo=; b=E8IdklIZrvE8UKxMBZD28Y5s2ra5vulWpqGrzRR5cb0d/B82gZzTsNTrWSEFoYYcmv I6+krBQSHDPw6djhIlV9hodR69LLlYYGP03bwWaqiOaCpDcx01na0LbXRtD6qZqHiEbC k9iRZuWMkUijp6BESd/rjToXbqhIDHIxrB4Lg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761570; x=1721366370; 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=b9CbhV5g6i0tQmXsKmS9hqUZt4I9LJTh9jd520bTuUo=; b=wonZhGXYW/OrKAwsn9d1vo2RS9xTrKtPo7iPk7nKufbOEibotgS9bGLaowLJsFaeGK 8pqj3Y17iWhxDQ7kUu6XXKcOVnAGBQzbeBbjLz6ROzWTnvuiSbK2brSg4I6qx6ErpaNd AJJu87rKWxZ4/xCeqeTuP/i53vB/6w/UeUOzs2Z6WKHxfo23tKuN5pYXT1kSZyW3W4/z /igicnJjN2DY4pX2fS2IZchyF9iQ0m9dCyqGMN5Lx28u52iykX4mQyi85B/AWdF5/szk p04p2bzp33J57shLZLpApLADFKCBNUNlPLsLUCzG6oU3ovNpk+WNnF/1x3u122GyPJmm KJbQ== X-Gm-Message-State: AOJu0YzKFyInDDapVQfbHOfJMz+JVAlkgEvn7Q2qmACQa+CRAohnfdlW XZ35ZpvNLBNGgsnRq1yCILMuHBN65mzOXrpG2l2GarPa+TYH1VHdyN9JbbtEoA== X-Google-Smtp-Source: AGHT+IHP1kUmuKsOrqG9NV434DVislfhlL16TSkV8gCZPCrHd+XbPFpUGGmvpC8iGOnSSxJUpRP/Gw== X-Received: by 2002:a05:6a00:1387:b0:706:3329:5533 with SMTP id d2e1a72fcca58-70b43650a2dmr11919341b3a.24.1720761569793; Thu, 11 Jul 2024 22:19:29 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:29 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 11/23] zram: add 842 compression backend support Date: Fri, 12 Jul 2024 14:18:22 +0900 Message-ID: <20240712051850.484318-12-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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..005f3fcb9024 --- /dev/null +++ b/drivers/block/zram/backend_842.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include + +#include "backend_842.h" + +struct sw842_ctx { + void *mem; +}; + +static void destroy_842(void *ctx) +{ + struct sw842_ctx *zctx =3D ctx; + + kfree(zctx->mem); + kfree(zctx); +} + +static void *create_842(void) +{ + struct sw842_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + ctx->mem =3D kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->mem) + goto error; + + return ctx; + +error: + destroy_842(ctx); + return NULL; +} + +static int compress_842(void *ctx, const unsigned char *src, size_t src_le= n, + unsigned char *dst, size_t *dst_len) +{ + struct sw842_ctx *zctx =3D ctx; + unsigned int dlen =3D *dst_len; + int ret; + + ret =3D sw842_compress(src, src_len, dst, &dlen, zctx->mem); + if (ret =3D=3D 0) + *dst_len =3D dlen; + return ret; +} + +static int decompress_842(void *ctx, const unsigned char *src, size_t src_= len, + unsigned char *dst, size_t dst_len) +{ + unsigned int dlen =3D dst_len; + + return sw842_decompress(src, src_len, dst, &dlen); +} + +const struct zcomp_ops backend_842 =3D { + .compress =3D compress_842, + .decompress =3D decompress_842, + .create_ctx =3D create_842, + .destroy_ctx =3D destroy_842, + .name =3D "842", +}; diff --git a/drivers/block/zram/backend_842.h b/drivers/block/zram/backend_= 842.h new file mode 100644 index 000000000000..4dc85c188799 --- /dev/null +++ b/drivers/block/zram/backend_842.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_842_H__ +#define __BACKEND_842_H__ + +#include "zcomp.h" + +extern const struct zcomp_ops backend_842; + +#endif /* __BACKEND_842_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 4d212ef972ea..48ac7a3e8906 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -18,6 +18,7 @@ #include "backend_lz4hc.h" #include "backend_zstd.h" #include "backend_deflate.h" +#include "backend_842.h" =20 static const struct zcomp_ops *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -35,6 +36,9 @@ static const struct zcomp_ops *backends[] =3D { #endif #if IS_ENABLED(CONFIG_ZRAM_BACKEND_DEFLATE) &backend_deflate, +#endif +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_842) + &backend_842, #endif NULL }; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 819A5132104 for ; Fri, 12 Jul 2024 05:19:32 +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=1720761574; cv=none; b=oxY9mt87AMtt6H77QRt0XRyiHtjY5gGTpaFqVG6/Fut3t2lPM3/Ml89+kvU3ih+679HUvCh7eEl1ydyOuxJH7BzwORk2gtkR7b8CnNi/4O6hXwomPzpgZloe6hhdrwY1vyUrkQnge3PdadFOk/q5yGPBBQK9is+kwwppSVQJpEI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761574; c=relaxed/simple; bh=26FMC06RAj74awgXpxaoTTL9LLEerkdHyU5eXGMrwqM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VAijNxZwwM6cImRktEoQV6+27gCGYGGIGTiUQnmqIXDB0f74vz780qBb7cCpeM2DMe0emixadSOFyICMrIqG45NRhoJ0a0cWtSsDxsVolK+S9YdLLeVEj5So1go6iG4IIwrZDoQhqJik6xaJp1FFQ3yt8X2ma2L0RAXQBX3vjr0= 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=QedeuExY; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="QedeuExY" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-70b05260c39so1189954b3a.0 for ; Thu, 11 Jul 2024 22:19:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761572; x=1721366372; 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=xM31fGaT/iXt00GqtzCm1xbl9EeHSa7uOeAlnW7mZpk=; b=QedeuExYntVxq2cC6otKpTnVxgDG/EDzgpSDLs0oLsmfgQ8SlO2ACtv1et3TqaWQAZ bqKchcBBeXi6rKHBOg4LzCTn9Dh4Tk98Ix6LSsSLQGnF5v0UyD3g695rl6GwHFqmqM/0 SzL6gNRrW4/eEJOl7dKvPGGOzq0h0V/mb4D2Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761572; x=1721366372; 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=xM31fGaT/iXt00GqtzCm1xbl9EeHSa7uOeAlnW7mZpk=; b=vbozd5oiaZNl1p1enyTX4yr1ViP/UT5A/O9MCSzvFr55e5ULP1DSaX/fHVO7Qd8Kax OlooI1OpFAsE9pyonXDwEWgr/cFJQjwWDgyLaySRvcPqWWEgMTESZIoZqWMmyWfcqvL8 i1k1tY1iB6vV/S4YL733PJlcJx5fGfPb/d5/XNo92mcbArdbTYu5pG8hkpYWkB/zpc3u EWnUBbIe7yF9zflL1liGZ8DM+wlL9QjgHK0owi6LMr3dvgzSXdJec7JyWA7TRZTToWIL I8qz7+jcTnnUrIo+nOIAIMi3Q2A2VIkU0GlnxYWb0j+e8sYIZl9LnSmGU1uKHffYSlx6 kCPA== X-Gm-Message-State: AOJu0YxyyNqiVLUvtpX0QdOo8yEX10xLLwvGBO/whp7qC/XZNUCVAWaz g93GC/T4r7jEpdFxN+JTs1PDsnEZ7OwojYUUMPVoyIFH+AdNV1DUkf50SyF4Rg5z3YVZ4gV6+xy Dy4Qg X-Google-Smtp-Source: AGHT+IEl0D1pr3FtX9Qv5hugbvRDGy3/Sf955VMF/uhacWvDXMBmDUtTt4wYr4NBZQeAPEBI7ar+xw== X-Received: by 2002:a05:6a00:124a:b0:70a:fdd8:51f2 with SMTP id d2e1a72fcca58-70b43566035mr12187438b3a.15.1720761571860; Thu, 11 Jul 2024 22:19:31 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:31 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 12/23] zram: check that backends array has at least one backend Date: Fri, 12 Jul 2024 14:18:23 +0900 Message-ID: <20240712051850.484318-13-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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 48ac7a3e8906..cb7afbd4d8fe 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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.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 ECE6F132124 for ; Fri, 12 Jul 2024 05:19:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761576; cv=none; b=pueG+4CjbpNFAWu9D0lYheHZEm1JOhZjRdwaBdfxoL9kCwLPA7UlB5YP1mWMoEnTQ3EK1WdNC9x4dgcJQMPkhMxYstbTCAyHGQyz/NCHSV0Xpzxdzky6b8LHkEIlHGAfXqSM9IF9eizAqamnC9rmCc01EZO4nPVFSSHVVBn3qbQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761576; c=relaxed/simple; bh=Xv8EPg91mLUhONKGCZr7sxXoQy4HbqGbBF6KmbetfVo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=igs+Et+8CY2OySGuWfHKG4hGBn6JRovb7mfd/K4C6eAHdk03A9zNGbilinULFaMLtaMF4Mk0j9LcslK1CINdd2s+fRT63Ab7NSnCq6DcL6tX0HozXf/4al5nELYZSx/qgUqaofO9w84F5yJY9dhfJGDqIhr9JjIGV76pnCp1N9E= 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=MtCUQDd7; arc=none smtp.client-ip=209.85.167.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="MtCUQDd7" Received: by mail-oi1-f174.google.com with SMTP id 5614622812f47-3c9cc681ee4so832545b6e.0 for ; Thu, 11 Jul 2024 22:19:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761574; x=1721366374; 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=LDXfK8psyXJ9LKncZJ7w82uE+VH/goA9zo8xLW1jTSg=; b=MtCUQDd7NlfVgo0VF4Soi2b9b0cEI7taR7DTPhncre34Jy1ljicm5dotgJ1sinp0Q0 vNWKtKxuIgA8RV8G59gG8yvbQq6ztQnKwuXoeLENy696yT62dv59SLBUu4qDRiOnsgY0 rLII0vzhzslX2jkvVgYYg+CpaA02KuqjzeiQo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761574; x=1721366374; 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=LDXfK8psyXJ9LKncZJ7w82uE+VH/goA9zo8xLW1jTSg=; b=Gap0rgYsHqWAJ31ZprnA5y9wj6gw2HduTIgPWBirOP7b/l4TFFriMpr8I8Vb2dujE7 LZS2IOxCRu97T4WDXC5PhxgLYYPRwO6nTm+nQzealPpA4x0R7YPNcg6fO4XpGoRHcs4m Jw5jp3XdwKrRbepDGJ+f5GO8ie87cxXfPnrYH6AZ7NeYQ3rKUmM15zcEcwucM2j87Q68 dhXK1hro59KzrFTVmzv8aQiVTNpyv5HBr2A4peJ8GJLUQqV8RrsWGIBCtsdx1QL771NJ MBbxn8Y13r9motd3VPN5nHbWNJRyhdfpHHPWgXRNyXjoAFN7ytjAYn+yH616t+2CZMCH 6ehQ== X-Gm-Message-State: AOJu0YzQEGBo7Xc++NDVbxNMwH/jnGZkVGOauEhdrIgvxcC2YQMcJvRV xNxZD7vx36ToM77K55wdxxB+5roKBpa6SsN5cH8IprSy2nICqSR+RPU1JouzsyU6coucYOPdqck ssq7W X-Google-Smtp-Source: AGHT+IHETDTUY1T1KcyFxXc4l1LEEpXlCwG3oxxKFTye7it7Quq3iuzTSFV24aoxS7dgWEymih2rLw== X-Received: by 2002:a05:6808:1241:b0:3d9:38ec:3d42 with SMTP id 5614622812f47-3d93c0a3acfmr12035218b6e.49.1720761574039; Thu, 11 Jul 2024 22:19:34 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:33 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 13/23] zram: introduce zcomp_params structure Date: Fri, 12 Jul 2024 14:18:24 +0900 Message-ID: <20240712051850.484318-14-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We will store a per-algorithm parameters there (compression level, dictionary, dictionary size, etc.). Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 2 +- drivers/block/zram/backend_deflate.c | 9 ++++++--- drivers/block/zram/backend_lz4.c | 9 ++++++--- drivers/block/zram/backend_lz4hc.c | 9 ++++++--- drivers/block/zram/backend_lzo.c | 2 +- drivers/block/zram/backend_lzorle.c | 2 +- drivers/block/zram/backend_zstd.c | 18 +++++++++++------- drivers/block/zram/zcomp.c | 5 +++-- drivers/block/zram/zcomp.h | 14 ++++++++++++-- drivers/block/zram/zram_drv.c | 20 +++++++++++++++++++- drivers/block/zram/zram_drv.h | 1 + 11 files changed, 67 insertions(+), 24 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 005f3fcb9024..e14dba30b0a2 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -19,7 +19,7 @@ static void destroy_842(void *ctx) kfree(zctx); } =20 -static void *create_842(void) +static void *create_842(struct zcomp_params *params) { struct sw842_ctx *ctx; =20 diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index acefb86701b9..ec662ce46897 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -32,7 +32,7 @@ static void deflate_destroy(void *ctx) kfree(zctx); } =20 -static void *deflate_create(void) +static void *deflate_create(struct zcomp_params *params) { struct deflate_ctx *ctx; size_t sz; @@ -42,8 +42,11 @@ static void *deflate_create(void) if (!ctx) return NULL; =20 - /* @FIXME: using a hardcoded Z_DEFAULT_COMPRESSION for now */ - ctx->level =3D Z_DEFAULT_COMPRESSION; + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D Z_DEFAULT_COMPRESSION; + sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); ctx->cctx.workspace =3D vzalloc(sz); if (!ctx->cctx.workspace) diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index c1d19fed5af2..ec57b5acbd39 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -18,7 +18,7 @@ static void lz4_destroy(void *ctx) kfree(zctx); } =20 -static void *lz4_create(void) +static void *lz4_create(struct zcomp_params *params) { struct lz4_ctx *ctx; =20 @@ -26,8 +26,11 @@ static void *lz4_create(void) if (!ctx) return NULL; =20 - /* @FIXME: using a hardcoded LZ4_ACCELERATION_DEFAULT for now */ - ctx->level =3D LZ4_ACCELERATION_DEFAULT; + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D LZ4_ACCELERATION_DEFAULT; + ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); if (!ctx->mem) goto error; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 536f7a0073c4..80733fead595 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -18,7 +18,7 @@ static void lz4hc_destroy(void *ctx) kfree(zctx); } =20 -static void *lz4hc_create(void) +static void *lz4hc_create(struct zcomp_params *params) { struct lz4hc_ctx *ctx; =20 @@ -26,8 +26,11 @@ static void *lz4hc_create(void) if (!ctx) return NULL; =20 - /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ - ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); if (!ctx->mem) goto error; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 4c9e611f6c03..8e4aabd04bf3 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -6,7 +6,7 @@ =20 #include "backend_lzo.h" =20 -static void *lzo_create(void) +static void *lzo_create(struct zcomp_params *params) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); } diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index 19a9ce132046..cb01eb8b04f4 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -6,7 +6,7 @@ =20 #include "backend_lzorle.h" =20 -static void *lzorle_create(void) +static void *lzorle_create(struct zcomp_params *params) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); } diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 310d970078e2..c356c5e6e503 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -24,9 +24,9 @@ static void zstd_destroy(void *ctx) kfree(zctx); } =20 -static void *zstd_create(void) +static void *zstd_create(struct zcomp_params *params) { - zstd_parameters params; + zstd_parameters prm; struct zstd_ctx *ctx; size_t sz; =20 @@ -34,9 +34,13 @@ static void *zstd_create(void) if (!ctx) return NULL; =20 - ctx->level =3D zstd_default_clevel(); - params =3D zstd_get_params(ctx->level, PAGE_SIZE); - sz =3D zstd_cctx_workspace_bound(¶ms.cParams); + if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) + ctx->level =3D params->level; + else + ctx->level =3D zstd_default_clevel(); + + prm =3D zstd_get_params(ctx->level, PAGE_SIZE); + sz =3D zstd_cctx_workspace_bound(&prm.cParams); ctx->cctx_mem =3D vzalloc(sz); if (!ctx->cctx_mem) goto error; @@ -65,11 +69,11 @@ static int zstd_compress(void *ctx, const unsigned char= *src, size_t src_len, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; - const zstd_parameters params =3D zstd_get_params(zctx->level, PAGE_SIZE); + const zstd_parameters prm =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, - src, src_len, ¶ms); + src, src_len, &prm); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index cb7afbd4d8fe..08c51f33b5d9 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 e5eb5ec4c645..217a750fa908 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -2,8 +2,17 @@ =20 #ifndef _ZCOMP_H_ #define _ZCOMP_H_ + #include =20 +#define ZCOMP_PARAM_NO_LEVEL INT_MIN + +struct zcomp_params { + void *dict; + size_t dict_sz; + s32 level; +}; + struct zcomp_strm { /* The members ->buffer and ->tfm are protected by ->lock. */ local_lock_t lock; @@ -19,7 +28,7 @@ struct zcomp_ops { int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, unsigned char *dst, size_t dst_len); =20 - void *(*create_ctx)(void); + void *(*create_ctx)(struct zcomp_params *params); void (*destroy_ctx)(void *ctx); =20 const char *name; @@ -29,6 +38,7 @@ struct zcomp_ops { struct zcomp { struct zcomp_strm __percpu *stream; const struct zcomp_ops *ops; + struct zcomp_params *params; struct hlist_node node; }; =20 @@ -37,7 +47,7 @@ int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *n= ode); ssize_t zcomp_available_show(const char *comp, char *buf); bool zcomp_available_algorithm(const char *comp); =20 -struct zcomp *zcomp_create(const char *alg); +struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params); void zcomp_destroy(struct zcomp *comp); =20 struct zcomp_strm *zcomp_stream_get(struct zcomp *comp); diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 93042da8ccdf..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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oa1-f41.google.com (mail-oa1-f41.google.com [209.85.160.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F3B8A134409 for ; Fri, 12 Jul 2024 05:19:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761578; cv=none; b=OO219VPBFiCiTH5ERmzfVRuhdyi3p3qaFrmtz6Jdkxk7AUG38EBKc0Bv9iKehZhRqeuzx5ELc6eMzuyNUsP9iS1nnxmC9IrZ3Qz5xm6bHDHJrx9KIvyfdnui7z0SeNHEUoT888NCc6GcW15LBN7+D7L9gXUY8JhmnW2mK7X4W+s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761578; c=relaxed/simple; bh=GATKpyXWE8hTvPDzPhCl+JMRpVE3IZhLa5/tLsowPmw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TfGW/j/a41uh/eaL6+H3UTfovscCmZSV7etMbzbeDpVYmNgoa0mt9vKsS2svqw/prlvV0pv1GL0LTtf7kLIEgsGDPl2Gswbm2gJ0/Pe+mYRZK0wt4s95mhfyB6b0Xc8CybwVKqvgKTZWLGzkZC984oP0W+EE5DOKJR6vfa4bUFs= 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=b5lGTDOg; arc=none smtp.client-ip=209.85.160.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="b5lGTDOg" Received: by mail-oa1-f41.google.com with SMTP id 586e51a60fabf-25e0c0df558so767373fac.0 for ; Thu, 11 Jul 2024 22:19:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761576; x=1721366376; 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=lkvMhO5tJBHwbauNuFvcStMN53VUkERyuHIOYpstgkw=; b=b5lGTDOgF6jUV/Ca7krXdoiOYiLmhpg/y4NI82TCEU84O1eqfGoLA6QEg5JNvoEIxA EgNbwPQvNun6OLsUU6rHKSR93Oo+78ZTtAMdYWk9PedSuv8HjU3Ic3QP4Mh+TQ+qQJnm rLBciWe1yWTRWkHgYbSl5TmIak+AIDL8TwFp0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761576; x=1721366376; 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=lkvMhO5tJBHwbauNuFvcStMN53VUkERyuHIOYpstgkw=; b=cuck2/fw/ASJv4JIKOrZIMhxbQVHvh9CNmc0oB+TGRl2Nrv+m/YOXmNmqF5paUW4LT 7B8UF5hQOaakJqRYkBznAwzhH4PlSJpzIMMckVeX4KjAM07iE04GvrEE4gYy0O3ZwXzD ExQBPP9iQVpvxTkCjyG8aUEVbvYBkRMcOkNxRtk7zKrsGA/IygDMM51FSvGh+Wu8KVKw pRMYpYglXX5PiqLD5vodihl/aOteDdWh8HlY1DmSSaIuUumka2RKtKAD8nt+6Tv2QJVX gDUFopBHKOIQkqq1/af1OqvAM9Lov0+v8+K1bDdz004awY/15gNYvpO1OANTXX8kpu7B l7sA== X-Gm-Message-State: AOJu0YzDj2ke2WhxqZ3Ri0OxeRxaAO+Lb04iPgPaiCvDLbgl8XyUsdnW A08/89+An5m1isGLpbOpkD7N5Q/WPvokaTxXRRj7d/qqnRvgeXJDWDxn9wSLYw== X-Google-Smtp-Source: AGHT+IFTTgm3AyRTARBBsl0DcUihLcIW7vRNEyk9m0iGo73r6yB5FIqA+GRyeXo1Z/O0RWe1vSGluA== X-Received: by 2002:a05:6870:c1d3:b0:258:44b7:b842 with SMTP id 586e51a60fabf-25eae7b8802mr9626375fac.13.1720761576076; Thu, 11 Jul 2024 22:19:36 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:35 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 14/23] zram: recalculate zstd compression params once Date: Fri, 12 Jul 2024 14:18:25 +0900 Message-ID: <20240712051850.484318-15-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" zstd compression params depends on level, but are constant for a given instance of zstd compression backend. Calculate once (during ctx creation). Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_zstd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index c356c5e6e503..7c6798f0c912 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -10,6 +10,7 @@ struct zstd_ctx { zstd_cctx *cctx; zstd_dctx *dctx; + zstd_parameters cprm; void *cctx_mem; void *dctx_mem; s32 level; @@ -40,6 +41,7 @@ static void *zstd_create(struct zcomp_params *params) ctx->level =3D zstd_default_clevel(); =20 prm =3D zstd_get_params(ctx->level, PAGE_SIZE); + ctx->cprm =3D zstd_get_params(ctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(&prm.cParams); ctx->cctx_mem =3D vzalloc(sz); if (!ctx->cctx_mem) @@ -69,11 +71,10 @@ static int zstd_compress(void *ctx, const unsigned char= *src, size_t src_len, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; - const zstd_parameters prm =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, - src, src_len, &prm); + src, src_len, &zctx->cprm); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oo1-f45.google.com (mail-oo1-f45.google.com [209.85.161.45]) (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 5706B136678 for ; Fri, 12 Jul 2024 05:19:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761580; cv=none; b=DaIwhfsMjHQF6th1tRDzO/cR74/Pzp1Exb8GstYtCLc+a4k7UhorxWkPuhouqxR5T+bXmwEPCRqbF/UFN2Gk3eiie3V5G19rqUIIdLvp33iG7Xlwx6dTaQVpWsxT9o74oM3WuzUFyauFfinXKpW+J1e4FzHYeW+qY+J9NWYMYTk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761580; c=relaxed/simple; bh=Mq09Qqko1C92YSX/82Xz3dlSA8ydenpUZ/gVqONOj0s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QEeSz2BnOGfDpxUMMCf/up79gJpY01SnfrvrfPPwUbNcDtSYo4Vh5O6/NzUWLRKR1jlkBUmovb7Fj61+Vma11Ktq4Tdai75oExR/cFJ4jmXDWamc1MOEMz9MI8NBirCfbajqJ8YM4g5IR6kiaJNWSmN/qj7R2eyerfGoGKU2PMg= 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=StBi8Drx; arc=none smtp.client-ip=209.85.161.45 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="StBi8Drx" Received: by mail-oo1-f45.google.com with SMTP id 006d021491bc7-5cbc5b63939so631262eaf.1 for ; Thu, 11 Jul 2024 22:19:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761578; x=1721366378; 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=1Bg4orkmRxzAWf8JG1gKZYQxqN5DtLQaEOXdZ5SstOU=; b=StBi8Drx2F3MQwU9nwshqjzIUFn9OoGjDRkYZdPpdsGjffhP5o+XNtPYzqnYO0X+h+ 8jmxha5YSmLkV6VajFIYLeoW1W4cU7FLxeSuk5P92sIjC5Ashgdar5SR4ZPaH8YSQ7Vr 2VMAFLcemTNPZy+sW6+UaZPieV1KWHuVDR0J4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761578; x=1721366378; 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=1Bg4orkmRxzAWf8JG1gKZYQxqN5DtLQaEOXdZ5SstOU=; b=wA2VKjU9d30OKT1mrYrXJQ4q4hsuDGeVJ9YBuJB/rJiKgcX6bFxmF+AMCOD7Tc8/Mz OXOvtEZPFpiVQ9XJ5OfHnN6CUbS+zp0xTLiWs87JhDsRnKK0vnFiN6ARJw6co1x1+dOM cQNDD8lcsETIukCFurmGnORmdwSfOgbWPd3OphMbFIy6+AHKxQpn3eG50uyzgAoK6t2M pCUOxgFV68s1lZlC+fUmCaI9ZjzdLctQo1sv6q6czlRX9/bqRA+321WPNRJgI6lsWQlq 3R6tMVBi6IDQnafPjAKU0U5/yayieSpw7GekNaQgHIAD/En63CJ05hahasR2B2y/BP4m 5FIw== X-Gm-Message-State: AOJu0Yx3CM0qNefYT3ueuOfb45Rk3dJUM9yq2xeWkEvWmjzHM+FMPcOq VZKX6sK7MvLsRpdHNE9CKIY2NCU904j2hidOmIR23SFsmsldnsPQdNSihvSChwhxRuQdHpU7+dA 2ayIx X-Google-Smtp-Source: AGHT+IED1M3PNf6PKwCFu6+5F3NEZcXsYFrVpwObFAgIUOSjAZmrWyoXt0ihMlz0wO0Xb2gyiU3DYA== X-Received: by 2002:a05:6870:1603:b0:259:cdf1:b8af with SMTP id 586e51a60fabf-25eaec1389bmr9553210fac.46.1720761578129; Thu, 11 Jul 2024 22:19:38 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:37 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 15/23] zram: extend comp_algorithm attr write handling Date: Fri, 12 Jul 2024 14:18:26 +0900 Message-ID: <20240712051850.484318-16-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F1B82136E37 for ; Fri, 12 Jul 2024 05:19:40 +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=1720761582; cv=none; b=mYVk+snrj9oSMC5V4tO8Kd9wD/sJr1Bdiw2wRNeEmDvZ2KXIttc/19FLEkLlrGDa9rSpkk6xTq0JAbL5i+1FrxIlc6LFH5Aoddwd977ivLuq5VGWaiW0mLg+5rp0X6cJ2FrKBrFDxxF0j1Eg5vPrIdiEsZGioC5oZxqjJgKrcQA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761582; c=relaxed/simple; bh=FlGdiMWI6JvROGTXYpE5PQUIEqfPgjf2CMa2lPVUXkM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o7VNl+VOUPkxj8zhI8sFYBpKr9GH4inDojFjW7RA/gLkKGooqlTn+SCW/6NOkD5YDm1/KW7ych2XHmG2Xgjs2o1jt3QkwRMcNL+dJWzTCbOii/SKD02WuCaRujCx6Ysx0B5h0diNJBS4yqdSl0piHeDE7DrmD9MZqUriOqCheHs= 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=erYCX4dk; 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="erYCX4dk" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-70afe18837cso1278506b3a.3 for ; Thu, 11 Jul 2024 22:19:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761580; x=1721366380; 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=3iaMWnY0DA8eKpdYL2hJc069euaYS8s1eesoaSk2ud8=; b=erYCX4dkQBeuDKDoIKWZLbzFi5bfNflzqAKpH8v44HZ1VZakWDEqzFAQtj0icDsBUb zIYQXjUFnxmqRQnJmp9TPASOp130jaGnjoPqHJ5FoBbl7p/MFzId8o4DTWP/55Vdr8/+ gHpT190xJOkoXepyHoReY2r7vXqvuOrW1eg9E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761580; x=1721366380; 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=3iaMWnY0DA8eKpdYL2hJc069euaYS8s1eesoaSk2ud8=; b=SJ8Y/IVuIdSJfU+pSt7Wj9F2jBl+p0H1gTeu9exaFbCghrLR6Gs8F4aI3MajUA6xNm hsX+PGgU9o2oUh86AOW02dqVp4AS4d2tdc+LU4Yfd1rPXfCaKvP835bsO7C0MpWxdcqt Sxz4SyswIAGwC2MVXTq30xPIVzhlACHih74o55Kve5/M5Wo21PA2REdhGqlZPIomunmv 42fIOIx4AblosZtlLtXSjSdfvsEFwTDz2wg7N9m0AsNyVQX+co6TRLIVszmyJwLQiL3p aF0hxOreCk+lkHAeL3jdlo+BOfCPjMzxAioVT3Ct7EGfVFAkh65l3EdlC4Iwi/RyKU2b 2aVQ== X-Gm-Message-State: AOJu0Ywc6sQHeVv2RdXzVJ7IM9xkNQ4h2SRP+q5bpcrLnKWJQkzMrno3 467HZgTd0gOm6aRit6g1LhDBjIC59LFih0qgWrnDf8hZAie64ornbBwsSJD2UA== X-Google-Smtp-Source: AGHT+IE1+8eLPnxPSIoGAKCHwJ7NFEar2HnHMDldY9NBO/A0MAgi7dgMkgox3FcO7Tmi9xQc7B57Fg== X-Received: by 2002:a05:6a00:1748:b0:70a:f0a3:dbc2 with SMTP id d2e1a72fcca58-70b43623fd1mr10749682b3a.30.1720761580125; Thu, 11 Jul 2024 22:19:40 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:39 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 16/23] zram: add support for dict comp config Date: Fri, 12 Jul 2024 14:18:27 +0900 Message-ID: <20240712051850.484318-17-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 440CC137901 for ; Fri, 12 Jul 2024 05:19:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761585; cv=none; b=CIcrgiQ/vP/t8vRJ0CXlub0D1VOgdDG70lTfMwJH3KGPyjlv9EK5EsApGWuBgSAm9PCciObIPN3OpfCPoGAzXKwa5al4XwWEj0TmAYga+c9ElFD1TCWwjgj9iK44JdzcsnHHbG+Jwpb52mbfRMtVcAlNkguEbWJzRWAozuIXrHo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761585; c=relaxed/simple; bh=l4/IxLpUw1QO7VMnaZsULGvU4FmgUSJC4An3ek2IBeE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JPqZlqIZWpTPc5MDCcF1QpNfITbWPTfwmLuyHd6zF8AMpzaHWUv1Mjwe3Rj0lXFci4gEoqXSa6Y0vqR9D1ejKa9tma6hJOGQZr3KHYsNz9rerqCrwkV2XdQlwUN5E1E71J/+aI3mqEthUA7Xg7eedJAYmzL+3cAmfDi6NrmdkBw= 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=bPBqQS4Y; arc=none smtp.client-ip=209.85.210.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="bPBqQS4Y" Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-70362cb061aso867988a34.1 for ; Thu, 11 Jul 2024 22:19:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761582; x=1721366382; 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=nAQgpqXzaJO10Nk1DwxHPOG0IMSJ77oGcu6vgn4Dxlg=; b=bPBqQS4YmvYylag0csPnwi7XFcyckdFd/sIz3YlyteNbmw8JeYzDgKVxhRSFtuN7GY O1yjc1CxzdKVmvQEUNcceibs4iOOe+27Zw0OjWWsmQW041WPS91dWU/MTkkKRZdWaJwj fHaTpBIeAP14ZIGG/muPih0BmSa0wAx7ln+fY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761582; x=1721366382; 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=nAQgpqXzaJO10Nk1DwxHPOG0IMSJ77oGcu6vgn4Dxlg=; b=f/6h4fJmL7r8GSIu3yVtNQF4KnlAOZEHXWRDhns6hUx5xqUZNESlhdCbzZRZl3UTzi EeVAXOfSaA6tT7oKVbpLnxA67TZlZMurvGRNdcC+sMfKMdxb96Wi4kXgSGJzWAaV1nlf w8mHyjLm4olLK03bniXGd7zxDcdfE56VI8jexk0jEKd6yeNQey3Mc8hpUJVnpe+WY3+1 EIdW2FHeuZs7RDGtUuzUg50VOb7jRJpSCJ666hpa6AkGuJUDobx6TXRtoFJ5ZHtsrCei 4vKue7NBk2CfwepqxRyztavdcnrl2RH+LI2Fn39Ly2aUG0wzO0MsURj2f2GR+KSkh9cy h8xQ== X-Gm-Message-State: AOJu0YzlX+gi1qIoXdHTf1wJnVRPa4exc4J/3DZ0TeBlgYlsVb2/SL1C /UnEF7u5MT4/1iWJ8iMqDGav8jj7t4T5e7tXVROP1yaEWc+cRcHy1ayjgJ0G/g== X-Google-Smtp-Source: AGHT+IEc1r5bDPc07EXzlyk5Hz9rD6FQc+sV+F5jHTRNKFjKRlFj/GuGeUcOdyV+3dlKjJ815V6O3A== X-Received: by 2002:a05:6830:1088:b0:704:49c0:65f0 with SMTP id 46e09a7af769-70449c06716mr7182298a34.3.1720761582223; Thu, 11 Jul 2024 22:19:42 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:41 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 17/23] zram: introduce zcomp_req structure Date: Fri, 12 Jul 2024 14:18:28 +0900 Message-ID: <20240712051850.484318-18-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Encapsulate compression/decompression data in zcomp_req structure. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 17 ++++++++--------- drivers/block/zram/backend_deflate.c | 26 +++++++++++--------------- drivers/block/zram/backend_lz4.c | 15 +++++++-------- drivers/block/zram/backend_lz4hc.c | 13 ++++++------- drivers/block/zram/backend_lzo.c | 12 ++++++------ drivers/block/zram/backend_lzorle.c | 13 ++++++------- drivers/block/zram/backend_zstd.c | 15 +++++++-------- drivers/block/zram/zcomp.c | 23 ++++++++++++++++------- drivers/block/zram/zcomp.h | 15 ++++++++++----- 9 files changed, 77 insertions(+), 72 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index e14dba30b0a2..1597dc4d4f1c 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -38,25 +38,24 @@ static void *create_842(struct zcomp_params *params) return NULL; } =20 -static int compress_842(void *ctx, const unsigned char *src, size_t src_le= n, - unsigned char *dst, size_t *dst_len) +static int compress_842(void *ctx, struct zcomp_req *req) { struct sw842_ctx *zctx =3D ctx; - unsigned int dlen =3D *dst_len; + unsigned int dlen =3D req->dst_len; int ret; =20 - ret =3D sw842_compress(src, src_len, dst, &dlen, zctx->mem); + ret =3D sw842_compress(req->src, req->src_len, req->dst, &dlen, + zctx->mem); if (ret =3D=3D 0) - *dst_len =3D dlen; + req->dst_len =3D dlen; return ret; } =20 -static int decompress_842(void *ctx, const unsigned char *src, size_t src_= len, - unsigned char *dst, size_t dst_len) +static int decompress_842(void *ctx, struct zcomp_req *req) { - unsigned int dlen =3D dst_len; + unsigned int dlen =3D req->dst_len; =20 - return sw842_decompress(src, src_len, dst, &dlen); + return sw842_decompress(req->src, req->src_len, req->dst, &dlen); } =20 const struct zcomp_ops backend_842 =3D { diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index ec662ce46897..117852d45aa4 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -74,9 +74,7 @@ static void *deflate_create(struct zcomp_params *params) return NULL; } =20 -static int deflate_compress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, - size_t *dst_len) +static int deflate_compress(void *ctx, struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx; struct z_stream_s *deflate; @@ -87,22 +85,20 @@ static int deflate_compress(void *ctx, const unsigned c= har *src, if (ret !=3D Z_OK) return -EINVAL; =20 - deflate->next_in =3D (u8 *)src; - deflate->avail_in =3D src_len; - deflate->next_out =3D (u8 *)dst; - deflate->avail_out =3D *dst_len; + deflate->next_in =3D (u8 *)req->src; + deflate->avail_in =3D req->src_len; + deflate->next_out =3D (u8 *)req->dst; + deflate->avail_out =3D req->dst_len; =20 ret =3D zlib_deflate(deflate, Z_FINISH); if (ret !=3D Z_STREAM_END) return -EINVAL; =20 - *dst_len =3D deflate->total_out; + req->dst_len =3D deflate->total_out; return 0; } =20 -static int deflate_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, - size_t dst_len) +static int deflate_decompress(void *ctx, struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx; struct z_stream_s *inflate; @@ -114,10 +110,10 @@ static int deflate_decompress(void *ctx, const unsign= ed char *src, if (ret !=3D Z_OK) return -EINVAL; =20 - inflate->next_in =3D (u8 *)src; - inflate->avail_in =3D src_len; - inflate->next_out =3D (u8 *)dst; - inflate->avail_out =3D dst_len; + inflate->next_in =3D (u8 *)req->src; + inflate->avail_in =3D req->src_len; + inflate->next_out =3D (u8 *)req->dst; + inflate->avail_out =3D req->dst_len; =20 ret =3D zlib_inflate(inflate, Z_SYNC_FLUSH); if (ret !=3D Z_STREAM_END) diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index ec57b5acbd39..cc4ae4097870 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -41,26 +41,25 @@ static void *lz4_create(struct zcomp_params *params) return NULL; } =20 -static int lz4_compress(void *ctx, const unsigned char *src, size_t src_le= n, - unsigned char *dst, size_t *dst_len) +static int lz4_compress(void *ctx, struct zcomp_req *req) { struct lz4_ctx *zctx =3D ctx; int ret; =20 - ret =3D LZ4_compress_fast(src, dst, src_len, *dst_len, - zctx->level, zctx->mem); + ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, + req->dst_len, zctx->level, zctx->mem); if (!ret) return -EINVAL; - *dst_len =3D ret; + req->dst_len =3D ret; return 0; } =20 -static int lz4_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, size_t dst_len) +static int lz4_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); if (ret < 0) return -EINVAL; return 0; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 80733fead595..610dadc09751 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -41,26 +41,25 @@ static void *lz4hc_create(struct zcomp_params *params) return NULL; } =20 -static int lz4hc_compress(void *ctx, const unsigned char *src, size_t src_= len, - unsigned char *dst, size_t *dst_len) +static int lz4hc_compress(void *ctx, struct zcomp_req *req) { struct lz4hc_ctx *zctx =3D ctx; int ret; =20 - ret =3D LZ4_compress_HC(src, dst, src_len, *dst_len, + ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, zctx->level, zctx->mem); if (!ret) return -EINVAL; - *dst_len =3D ret; + req->dst_len =3D ret; return 0; } =20 -static int lz4hc_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, size_t dst_len) +static int lz4hc_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); if (ret < 0) return -EINVAL; return 0; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 8e4aabd04bf3..88f1aa5683f3 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -16,21 +16,21 @@ static void lzo_destroy(void *ctx) kfree(ctx); } =20 -static int lzo_compress(void *ctx, const unsigned char *src, size_t src_le= n, - unsigned char *dst, size_t *dst_len) +static int lzo_compress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzo1x_1_compress(src, src_len, dst, dst_len, ctx); + ret =3D lzo1x_1_compress(req->src, req->src_len, req->dst, + &req->dst_len, ctx); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzo_decompress(void *ctx, const unsigned char *src, size_t src_= len, - unsigned char *dst, size_t dst_len) +static int lzo_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + ret =3D lzo1x_decompress_safe(req->src, req->src_len, + req->dst, &req->dst_len); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index cb01eb8b04f4..f05820929a74 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -16,22 +16,21 @@ static void lzorle_destroy(void *ctx) kfree(ctx); } =20 -static int lzorle_compress(void *ctx, const unsigned char *src, size_t src= _len, - unsigned char *dst, size_t *dst_len) +static int lzorle_compress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzorle1x_1_compress(src, src_len, dst, dst_len, ctx); + ret =3D lzorle1x_1_compress(req->src, req->src_len, req->dst, + &req->dst_len, ctx); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzorle_decompress(void *ctx, const unsigned char *src, - size_t src_len, unsigned char *dst, - size_t dst_len) +static int lzorle_decompress(void *ctx, struct zcomp_req *req) { int ret; =20 - ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + ret =3D lzo1x_decompress_safe(req->src, req->src_len, + req->dst, &req->dst_len); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 7c6798f0c912..19eba65f44c9 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -67,27 +67,26 @@ static void *zstd_create(struct zcomp_params *params) return NULL; } =20 -static int zstd_compress(void *ctx, const unsigned char *src, size_t src_l= en, - unsigned char *dst, size_t *dst_len) +static int zstd_compress(void *ctx, struct zcomp_req *req) { struct zstd_ctx *zctx =3D ctx; size_t ret; =20 - ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, - src, src_len, &zctx->cprm); + ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, + req->src, req->src_len, &zctx->cprm); if (zstd_is_error(ret)) return -EINVAL; - *dst_len =3D ret; + req->dst_len =3D ret; return 0; } =20 -static int zstd_decompress(void *ctx, const unsigned char *src, size_t src= _len, - unsigned char *dst, size_t dst_len) +static int zstd_decompress(void *ctx, struct zcomp_req *req) { struct zstd_ctx *zctx =3D ctx; size_t ret; =20 - ret =3D zstd_decompress_dctx(zctx->dctx, dst, dst_len, src, src_len); + ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, + req->src, req->src_len); if (zstd_is_error(ret)) return -EINVAL; return 0; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 08c51f33b5d9..5048087390ea 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 217a750fa908..bbc48094f826 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -21,12 +21,17 @@ struct zcomp_strm { void *ctx; }; =20 -struct zcomp_ops { - int (*compress)(void *ctx, const unsigned char *src, size_t src_len, - unsigned char *dst, size_t *dst_len); +struct zcomp_req { + const unsigned char *src; + const size_t src_len; + + unsigned char *dst; + size_t dst_len; +}; =20 - int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, - unsigned char *dst, size_t dst_len); +struct zcomp_ops { + int (*compress)(void *ctx, struct zcomp_req *req); + int (*decompress)(void *ctx, struct zcomp_req *req); =20 void *(*create_ctx)(struct zcomp_params *params); void (*destroy_ctx)(void *ctx); --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oi1-f177.google.com (mail-oi1-f177.google.com [209.85.167.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5614D137902 for ; Fri, 12 Jul 2024 05:19:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761587; cv=none; b=MM7TAcnJXOc2hlQ7xHgBg3l2Nu2bJifdcXZ4EUkg6Wn3lvWbaEXBOe8lvH4dq2jQvT5Ncknxu2PjxIpuN5UYvSEiqfNfWqCnTBxdS0yZRpaFqryi7I73RmAaDYE5eW96pbqIuGeGUoBEP8y8vzEhAqSp7sFuQk1zx8gIP/FjzQY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761587; c=relaxed/simple; bh=tchSnYXJ6LN9WZ6ym+UCMan1DHyAMu7RAtI0AP8rJic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GnCHtpIZ3KVlX7zDo4AqNrFZzlYr8bYQfQ5iStb7jT97YXEJ3kZ0NzPNnTN//KGkVSqulf/4mJAkgDSCq7iVX62g3hJMf/PAcZfgHaenRuROBYtbW3IzVN40IH6pwFyrKtD3SJuFvouV47vATqe4hKOuEn2fyo9ymBepTsHq1IU= 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=c9RN/rnX; arc=none smtp.client-ip=209.85.167.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="c9RN/rnX" Received: by mail-oi1-f177.google.com with SMTP id 5614622812f47-3d932f991f6so940308b6e.1 for ; Thu, 11 Jul 2024 22:19:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761584; x=1721366384; 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=PWvQDCdKd63WAe8Ad5X75caqQH0R/FhpcSO3XDqLiyY=; b=c9RN/rnX1jqPF7bmgK/c1Z/FvDAngFATkEQKMH1CZ0MuAsXH2nzIOk08y7xKVBI/mp 9MgI/7A2AN7l0RvVPYC3ekPyLcsaSFp6YJPBKB9icQ28/yEOb7JhLrRAZZlvucYJQnLF 1juxv87RPOCrK51OWO9mw2f7nwiRD1yKIKrfM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761584; x=1721366384; 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=PWvQDCdKd63WAe8Ad5X75caqQH0R/FhpcSO3XDqLiyY=; b=TlSoQXlZYAv8xDUp4nN1chiIVGh68C+3hIV0S8jXZun/MnZyPASsP+zEsnGV/xxVV1 3Uv5/n1g4Y96hESBtXIvE22PWVHs9I9TdpdBJBs0ZJ2phYueH95ltJA8Bc6TJZG4rz3l inSOBeBF1PPN1R3SV/9jW/HdE9AD22HPFRqYSb6y9+Ikzqb030TbmBilwaMvUKaNZSnM tunlJbE4gVql60thQXmUKLNC2yvq/IWDixnOXWGtA2rG3A9EvQxlYWUJcFyyETcp6Lj7 lCPnm1y2tymNJElQ+C464+6hMw3XAwqqNLp4/2umYneozFXD4TLjjYr2IpJYEtbIkxKq Wl+Q== X-Gm-Message-State: AOJu0YyYyEyYAWlmqAFuGQpdSLwrrsgX+nfgM0ox8hepLKPsdJx6VNLj YMqOwML3fcs9mRokofHhMhkFWErnuR53sOwawbU787K3sMOqYkdnZ/y2yCeHsg== X-Google-Smtp-Source: AGHT+IHEQ9PC+OrP8VT7nrPp4W+7gyceTLpJ6t49NPnqgqPNU3epzdY5WNVbEEld2jSj9lyePmVZPA== X-Received: by 2002:a05:6808:2d9:b0:3d9:de1e:c24c with SMTP id 5614622812f47-3d9de1ecd6cmr6116125b6e.3.1720761584331; Thu, 11 Jul 2024 22:19:44 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:44 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 18/23] zram: introduce zcomp_ctx structure Date: Fri, 12 Jul 2024 14:18:29 +0900 Message-ID: <20240712051850.484318-19-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Keep run-time driver data (scratch buffers, etc.) in zcomp_ctx structure. This structure is allocated per-CPU because drivers (backends) need to modify its content during requests execution. We will split mutable and immutable driver data, this is a preparation path. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 39 ++++++-------------- drivers/block/zram/backend_deflate.c | 46 +++++++++++++----------- drivers/block/zram/backend_lz4.c | 36 ++++++++++--------- drivers/block/zram/backend_lz4hc.c | 36 ++++++++++--------- drivers/block/zram/backend_lzo.c | 17 +++++---- drivers/block/zram/backend_lzorle.c | 17 +++++---- drivers/block/zram/backend_zstd.c | 54 +++++++++++++++------------- drivers/block/zram/zcomp.c | 16 +++++---- drivers/block/zram/zcomp.h | 23 ++++++++---- 9 files changed, 149 insertions(+), 135 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 1597dc4d4f1c..2f1202322264 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -7,51 +7,32 @@ =20 #include "backend_842.h" =20 -struct sw842_ctx { - void *mem; -}; - -static void destroy_842(void *ctx) +static void destroy_842(struct zcomp_ctx *ctx) { - struct sw842_ctx *zctx =3D ctx; - - kfree(zctx->mem); - kfree(zctx); + kfree(ctx->context); } =20 -static void *create_842(struct zcomp_params *params) +static int create_842(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct sw842_ctx *ctx; - - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; - - ctx->mem =3D kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL); - if (!ctx->mem) - goto error; - - return ctx; - -error: - destroy_842(ctx); - return NULL; + ctx->context =3D kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->context) + return -ENOMEM; + return 0; } =20 -static int compress_842(void *ctx, struct zcomp_req *req) +static int compress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct sw842_ctx *zctx =3D ctx; unsigned int dlen =3D req->dst_len; int ret; =20 ret =3D sw842_compress(req->src, req->src_len, req->dst, &dlen, - zctx->mem); + ctx->context); if (ret =3D=3D 0) req->dst_len =3D dlen; return ret; } =20 -static int decompress_842(void *ctx, struct zcomp_req *req) +static int decompress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) { unsigned int dlen =3D req->dst_len; =20 diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index 117852d45aa4..eae4ee35c1df 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -17,9 +17,12 @@ struct deflate_ctx { s32 level; }; =20 -static void deflate_destroy(void *ctx) +static void deflate_destroy(struct zcomp_ctx *ctx) { - struct deflate_ctx *zctx =3D ctx; + struct deflate_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 if (zctx->cctx.workspace) { zlib_deflateEnd(&zctx->cctx); @@ -32,51 +35,52 @@ static void deflate_destroy(void *ctx) kfree(zctx); } =20 -static void *deflate_create(struct zcomp_params *params) +static int deflate_create(struct zcomp_params *params, struct zcomp_ctx *c= tx) { - struct deflate_ctx *ctx; + struct deflate_ctx *zctx; size_t sz; int ret; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D Z_DEFAULT_COMPRESSION; + zctx->level =3D Z_DEFAULT_COMPRESSION; =20 sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); - ctx->cctx.workspace =3D vzalloc(sz); - if (!ctx->cctx.workspace) + zctx->cctx.workspace =3D vzalloc(sz); + if (!zctx->cctx.workspace) goto error; =20 - ret =3D zlib_deflateInit2(&ctx->cctx, ctx->level, Z_DEFLATED, + ret =3D zlib_deflateInit2(&zctx->cctx, zctx->level, Z_DEFLATED, -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, Z_DEFAULT_STRATEGY); if (ret !=3D Z_OK) goto error; =20 sz =3D zlib_inflate_workspacesize(); - ctx->dctx.workspace =3D vzalloc(sz); - if (!ctx->dctx.workspace) + zctx->dctx.workspace =3D vzalloc(sz); + if (!zctx->dctx.workspace) goto error; =20 - ret =3D zlib_inflateInit2(&ctx->dctx, -DEFLATE_DEF_WINBITS); + ret =3D zlib_inflateInit2(&zctx->dctx, -DEFLATE_DEF_WINBITS); if (ret !=3D Z_OK) goto error; =20 - return ctx; + return 0; =20 error: deflate_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int deflate_compress(void *ctx, struct zcomp_req *req) +static int deflate_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct deflate_ctx *zctx =3D ctx; + struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *deflate; int ret; =20 @@ -98,9 +102,9 @@ static int deflate_compress(void *ctx, struct zcomp_req = *req) return 0; } =20 -static int deflate_decompress(void *ctx, struct zcomp_req *req) +static int deflate_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct deflate_ctx *zctx =3D ctx; + struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *inflate; int ret; =20 diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index cc4ae4097870..e2d951e62746 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -10,40 +10,44 @@ struct lz4_ctx { s32 level; }; =20 -static void lz4_destroy(void *ctx) +static void lz4_destroy(struct zcomp_ctx *ctx) { - struct lz4_ctx *zctx =3D ctx; + struct lz4_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 vfree(zctx->mem); kfree(zctx); } =20 -static void *lz4_create(struct zcomp_params *params) +static int lz4_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4_ctx *ctx; + struct lz4_ctx *zctx; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D LZ4_ACCELERATION_DEFAULT; + zctx->level =3D LZ4_ACCELERATION_DEFAULT; =20 - ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); - if (!ctx->mem) + zctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!zctx->mem) goto error; =20 - return ctx; + return 0; error: lz4_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int lz4_compress(void *ctx, struct zcomp_req *req) +static int lz4_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct lz4_ctx *zctx =3D ctx; + struct lz4_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, @@ -54,7 +58,7 @@ static int lz4_compress(void *ctx, struct zcomp_req *req) return 0; } =20 -static int lz4_decompress(void *ctx, struct zcomp_req *req) +static int lz4_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 610dadc09751..6da71ec5fc05 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -10,40 +10,44 @@ struct lz4hc_ctx { s32 level; }; =20 -static void lz4hc_destroy(void *ctx) +static void lz4hc_destroy(struct zcomp_ctx *ctx) { - struct lz4hc_ctx *zctx =3D ctx; + struct lz4hc_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 vfree(zctx->mem); kfree(zctx); } =20 -static void *lz4hc_create(struct zcomp_params *params) +static int lz4hc_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4hc_ctx *ctx; + struct lz4hc_ctx *zctx; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + zctx->level =3D LZ4HC_DEFAULT_CLEVEL; =20 - ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!ctx->mem) + zctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!zctx->mem) goto error; =20 - return ctx; + return 0; error: lz4hc_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int lz4hc_compress(void *ctx, struct zcomp_req *req) +static int lz4hc_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct lz4hc_ctx *zctx =3D ctx; + struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, @@ -54,7 +58,7 @@ static int lz4hc_compress(void *ctx, struct zcomp_req *re= q) return 0; } =20 -static int lz4hc_decompress(void *ctx, struct zcomp_req *req) +static int lz4hc_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 88f1aa5683f3..81fbad286092 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -6,26 +6,29 @@ =20 #include "backend_lzo.h" =20 -static void *lzo_create(struct zcomp_params *params) +static int lzo_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->context) + return -ENOMEM; + return 0; } =20 -static void lzo_destroy(void *ctx) +static void lzo_destroy(struct zcomp_ctx *ctx) { - kfree(ctx); + kfree(ctx->context); } =20 -static int lzo_compress(void *ctx, struct zcomp_req *req) +static int lzo_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 ret =3D lzo1x_1_compress(req->src, req->src_len, req->dst, - &req->dst_len, ctx); + &req->dst_len, ctx->context); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzo_decompress(void *ctx, struct zcomp_req *req) +static int lzo_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index f05820929a74..99c9da8f116e 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -6,26 +6,29 @@ =20 #include "backend_lzorle.h" =20 -static void *lzorle_create(struct zcomp_params *params) +static int lzorle_create(struct zcomp_params *params, struct zcomp_ctx *ct= x) { - return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + if (!ctx->context) + return -ENOMEM; + return 0; } =20 -static void lzorle_destroy(void *ctx) +static void lzorle_destroy(struct zcomp_ctx *ctx) { - kfree(ctx); + kfree(ctx->context); } =20 -static int lzorle_compress(void *ctx, struct zcomp_req *req) +static int lzorle_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 ret =3D lzorle1x_1_compress(req->src, req->src_len, req->dst, - &req->dst_len, ctx); + &req->dst_len, ctx->context); return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzorle_decompress(void *ctx, struct zcomp_req *req) +static int lzorle_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { int ret; =20 diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 19eba65f44c9..9f000dedf1ad 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -16,60 +16,64 @@ struct zstd_ctx { s32 level; }; =20 -static void zstd_destroy(void *ctx) +static void zstd_destroy(struct zcomp_ctx *ctx) { - struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx *zctx =3D ctx->context; + + if (!zctx) + return; =20 vfree(zctx->cctx_mem); vfree(zctx->dctx_mem); kfree(zctx); } =20 -static void *zstd_create(struct zcomp_params *params) +static int zstd_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { + struct zstd_ctx *zctx; zstd_parameters prm; - struct zstd_ctx *ctx; size_t sz; =20 - ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return NULL; + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) + return -ENOMEM; =20 + ctx->context =3D zctx; if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - ctx->level =3D params->level; + zctx->level =3D params->level; else - ctx->level =3D zstd_default_clevel(); + zctx->level =3D zstd_default_clevel(); =20 - prm =3D zstd_get_params(ctx->level, PAGE_SIZE); - ctx->cprm =3D zstd_get_params(ctx->level, PAGE_SIZE); + prm =3D zstd_get_params(zctx->level, PAGE_SIZE); + zctx->cprm =3D zstd_get_params(zctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(&prm.cParams); - ctx->cctx_mem =3D vzalloc(sz); - if (!ctx->cctx_mem) + zctx->cctx_mem =3D vzalloc(sz); + if (!zctx->cctx_mem) goto error; =20 - ctx->cctx =3D zstd_init_cctx(ctx->cctx_mem, sz); - if (!ctx->cctx) + zctx->cctx =3D zstd_init_cctx(zctx->cctx_mem, sz); + if (!zctx->cctx) goto error; =20 sz =3D zstd_dctx_workspace_bound(); - ctx->dctx_mem =3D vzalloc(sz); - if (!ctx->dctx_mem) + zctx->dctx_mem =3D vzalloc(sz); + if (!zctx->dctx_mem) goto error; =20 - ctx->dctx =3D zstd_init_dctx(ctx->dctx_mem, sz); - if (!ctx->dctx) + zctx->dctx =3D zstd_init_dctx(zctx->dctx_mem, sz); + if (!zctx->dctx) goto error; =20 - return ctx; + return 0; =20 error: zstd_destroy(ctx); - return NULL; + return -EINVAL; } =20 -static int zstd_compress(void *ctx, struct zcomp_req *req) +static int zstd_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, @@ -80,9 +84,9 @@ static int zstd_compress(void *ctx, struct zcomp_req *req) return 0; } =20 -static int zstd_decompress(void *ctx, struct zcomp_req *req) +static int zstd_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) { - struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 5048087390ea..877ae6c6ae9d 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -45,23 +45,25 @@ static const struct zcomp_ops *backends[] =3D { =20 static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) { - if (zstrm->ctx) - comp->ops->destroy_ctx(zstrm->ctx); + comp->ops->destroy_ctx(&zstrm->ctx); vfree(zstrm->buffer); - zstrm->ctx =3D NULL; zstrm->buffer =3D NULL; } =20 static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) { - zstrm->ctx =3D comp->ops->create_ctx(comp->params); + int ret; + + ret =3D comp->ops->create_ctx(comp->params, &zstrm->ctx); + if (ret) + return ret; =20 /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ zstrm->buffer =3D vzalloc(2 * PAGE_SIZE); - if (!zstrm->ctx || !zstrm->buffer) { + if (!zstrm->buffer) { zcomp_strm_free(comp, zstrm); return -ENOMEM; } @@ -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 bbc48094f826..1d8920c2d449 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -13,12 +13,20 @@ struct zcomp_params { s32 level; }; =20 +/* + * Run-time driver context - scratch buffers, etc. It is modified during + * request execution (compression/decompression), cannot be shared, so + * it's in per-CPU area. + */ +struct zcomp_ctx { + void *context; +}; + struct zcomp_strm { - /* The members ->buffer and ->tfm are protected by ->lock. */ local_lock_t lock; - /* compression/decompression buffer */ + /* compression buffer */ void *buffer; - void *ctx; + struct zcomp_ctx ctx; }; =20 struct zcomp_req { @@ -30,11 +38,12 @@ struct zcomp_req { }; =20 struct zcomp_ops { - int (*compress)(void *ctx, struct zcomp_req *req); - int (*decompress)(void *ctx, struct zcomp_req *req); + int (*compress)(struct zcomp_ctx *ctx, struct zcomp_req *req); + int (*decompress)(struct zcomp_ctx *ctx, struct zcomp_req *req); =20 - void *(*create_ctx)(struct zcomp_params *params); - void (*destroy_ctx)(void *ctx); + int (*create_ctx)(struct zcomp_params *params, + struct zcomp_ctx *ctx); + void (*destroy_ctx)(struct zcomp_ctx *ctx); =20 const char *name; }; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oi1-f173.google.com (mail-oi1-f173.google.com [209.85.167.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 9156E1386DF for ; Fri, 12 Jul 2024 05:19:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761589; cv=none; b=C1hturLKBsTaSLlTMqNpHb59pzYeb5chhFpGM0MGwVFeoAiZtdt7Gq59xklXoHJBRPcYKLQuOqygExuu6MB8tz01J0t1KJV5xMN+TVGZxAph+w+jmn5FdvkPTv8TxGE19ogXgp+N8/acfiJ8fTYDdNe9daco+klQgB1PbIP4tiQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761589; c=relaxed/simple; bh=csVsBdDsmePvz+KmBra6QJSTU8HQoyTERVghOcl7m+M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PNXsdIojmzR+LEtGEt/COoxR5b/OblY7c+/TJQVaKcM3XBi7B6PGWPRqbq/rRxRrR2Qx/X+eef3VwFUt9rN1tr98ldK7VPcxjFE1ototDYYGrOwL3cVvFS3T5pEumNpN+2eFThnYXHnIktj+fk8TrMJlxhNxU63Spa8gwyR8fCk= 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=oDorOCo2; arc=none smtp.client-ip=209.85.167.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="oDorOCo2" Received: by mail-oi1-f173.google.com with SMTP id 5614622812f47-3d9dbbaa731so910420b6e.3 for ; Thu, 11 Jul 2024 22:19:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761586; x=1721366386; 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=a9pv9z2MtsR34imvndck6Cotg/vfME6RwvWopqH+sJk=; b=oDorOCo2F0EVwyI+0yb/D03GEn1J1zBj/aEeiIEkz2xnqdFphW3/CrZQY/7LUsmMsw ogz4atLGchlelOlsdKrdMmcXo6wL/PkaIiKR2Gx1CgMI/2WD3WjbwoGye8No6KeYHe6m Je1il1YxXbPwQuyN1YUAcM4K4CkqWrPQ0dV6s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761586; x=1721366386; 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=a9pv9z2MtsR34imvndck6Cotg/vfME6RwvWopqH+sJk=; b=pzPWg8wHlmL76FH+CszUQhqCsu4es/ngNSSU303TmE2FrqiiI+puUcd6oeAQv9V+wS SW4vpQgSyZBndECP4P1cUKdt5l5bpbEbFts1RLfPq+Cg2e2IV9jcKXb9YUseSQDFec/U 6RTBT0oEW9nFaa1FZKjAbagWBuAxjaKvZ5vL6qHDUYJ3nOLUsSqfxogv6yB1CI4Y5qdo O1mQTBledL9426VKbkNzghqjGKqthMTTNgrNjXJDtdw7tIuU50cMHZ1/chUYy97V8LRU dDzfFsH6Aym/J5z6iIyBPjKLLtfOlsQ2+iqpFzfLLpJf4TbhtL2EYTGnMP4uqWhvz7Ar VlhA== X-Gm-Message-State: AOJu0Ywsj5BAg6NkVMBph9g7S3TplTxBJblgWB+NEpaCvjxc4EcEcZQY 6SJ7bsWIVymViDgvbrkTTl1DzenwAysRhzN1vPEYJ996WipBYyc8e2EtCRBVZw== X-Google-Smtp-Source: AGHT+IG6QrcKXNLvDYdzeak+xwUSVhl96WxvE+7fmduNCRTKlxfRpaxiwBZIw2abDNWGc9SF5PM3Bg== X-Received: by 2002:a05:6808:30aa:b0:3d9:245c:4226 with SMTP id 5614622812f47-3d93c082a4amr11601164b6e.37.1720761586447; Thu, 11 Jul 2024 22:19:46 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:46 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 19/23] zram: move immutable comp params away from per-CPU context Date: Fri, 12 Jul 2024 14:18:30 +0900 Message-ID: <20240712051850.484318-20-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Immutable params never change once comp has been allocated and setup, so we don't need to store multiple copies of them in each per-CPU backend context. Move those to per-comp zcomp_params and pass it to backends callbacks for requests execution. Basically, this means parameters sharing between different contexts. Also introduce two new backends callbacks: setup_params() and release_params(). First, we need to validate params in a driver-specific way; second, driver may want to allocate its specific representation of the params which is needed to execute requests. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 17 ++++++++-- drivers/block/zram/backend_deflate.c | 29 +++++++++++----- drivers/block/zram/backend_lz4.c | 51 +++++++++++----------------- drivers/block/zram/backend_lz4hc.c | 51 +++++++++++----------------- drivers/block/zram/backend_lzo.c | 17 ++++++++-- drivers/block/zram/backend_lzorle.c | 17 ++++++++-- drivers/block/zram/backend_zstd.c | 47 ++++++++++++++++++------- drivers/block/zram/zcomp.c | 17 +++++++--- drivers/block/zram/zcomp.h | 20 ++++++++--- 9 files changed, 168 insertions(+), 98 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 2f1202322264..10d9d5c60f53 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -7,6 +7,15 @@ =20 #include "backend_842.h" =20 +static void release_params_842(struct zcomp_params *params) +{ +} + +static int setup_params_842(struct zcomp_params *params) +{ + return 0; +} + static void destroy_842(struct zcomp_ctx *ctx) { kfree(ctx->context); @@ -20,7 +29,8 @@ static int create_842(struct zcomp_params *params, struct= zcomp_ctx *ctx) return 0; } =20 -static int compress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int compress_842(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req) { unsigned int dlen =3D req->dst_len; int ret; @@ -32,7 +42,8 @@ static int compress_842(struct zcomp_ctx *ctx, struct zco= mp_req *req) return ret; } =20 -static int decompress_842(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int decompress_842(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { unsigned int dlen =3D req->dst_len; =20 @@ -44,5 +55,7 @@ const struct zcomp_ops backend_842 =3D { .decompress =3D decompress_842, .create_ctx =3D create_842, .destroy_ctx =3D destroy_842, + .setup_params =3D setup_params_842, + .release_params =3D release_params_842, .name =3D "842", }; diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index eae4ee35c1df..0f7f252c12f4 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -14,9 +14,20 @@ struct deflate_ctx { struct z_stream_s cctx; struct z_stream_s dctx; - s32 level; }; =20 +static void deflate_release_params(struct zcomp_params *params) +{ +} + +static int deflate_setup_params(struct zcomp_params *params) +{ + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D Z_DEFAULT_COMPRESSION; + + return 0; +} + static void deflate_destroy(struct zcomp_ctx *ctx) { struct deflate_ctx *zctx =3D ctx->context; @@ -46,17 +57,12 @@ static int deflate_create(struct zcomp_params *params, = struct zcomp_ctx *ctx) return -ENOMEM; =20 ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D Z_DEFAULT_COMPRESSION; - sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); zctx->cctx.workspace =3D vzalloc(sz); if (!zctx->cctx.workspace) goto error; =20 - ret =3D zlib_deflateInit2(&zctx->cctx, zctx->level, Z_DEFLATED, + ret =3D zlib_deflateInit2(&zctx->cctx, params->level, Z_DEFLATED, -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, Z_DEFAULT_STRATEGY); if (ret !=3D Z_OK) @@ -78,7 +84,8 @@ static int deflate_create(struct zcomp_params *params, st= ruct zcomp_ctx *ctx) return -EINVAL; } =20 -static int deflate_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int deflate_compress(struct zcomp_params *params, struct zcomp_ctx = *ctx, + struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *deflate; @@ -102,7 +109,9 @@ static int deflate_compress(struct zcomp_ctx *ctx, stru= ct zcomp_req *req) return 0; } =20 -static int deflate_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int deflate_decompress(struct zcomp_params *params, + struct zcomp_ctx *ctx, + struct zcomp_req *req) { struct deflate_ctx *zctx =3D ctx->context; struct z_stream_s *inflate; @@ -131,5 +140,7 @@ const struct zcomp_ops backend_deflate =3D { .decompress =3D deflate_decompress, .create_ctx =3D deflate_create, .destroy_ctx =3D deflate_destroy, + .setup_params =3D deflate_setup_params, + .release_params =3D deflate_release_params, .name =3D "deflate", }; diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index e2d951e62746..cf3c029bd5ad 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -5,60 +5,47 @@ =20 #include "backend_lz4.h" =20 -struct lz4_ctx { - void *mem; - s32 level; -}; +static void lz4_release_params(struct zcomp_params *params) +{ +} =20 -static void lz4_destroy(struct zcomp_ctx *ctx) +static int lz4_setup_params(struct zcomp_params *params) { - struct lz4_ctx *zctx =3D ctx->context; + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D LZ4_ACCELERATION_DEFAULT; =20 - if (!zctx) - return; + return 0; +} =20 - vfree(zctx->mem); - kfree(zctx); +static void lz4_destroy(struct zcomp_ctx *ctx) +{ + vfree(ctx->context); } =20 static int lz4_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4_ctx *zctx; - - zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); - if (!zctx) + ctx->context =3D vmalloc(LZ4_MEM_COMPRESS); + if (!ctx->context) return -ENOMEM; =20 - ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D LZ4_ACCELERATION_DEFAULT; - - zctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); - if (!zctx->mem) - goto error; - return 0; -error: - lz4_destroy(ctx); - return -EINVAL; } =20 -static int lz4_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req) { - struct lz4_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, - req->dst_len, zctx->level, zctx->mem); + req->dst_len, params->level, ctx->context); if (!ret) return -EINVAL; req->dst_len =3D ret; return 0; } =20 -static int lz4_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4_decompress(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { int ret; =20 @@ -74,5 +61,7 @@ const struct zcomp_ops backend_lz4 =3D { .decompress =3D lz4_decompress, .create_ctx =3D lz4_create, .destroy_ctx =3D lz4_destroy, + .setup_params =3D lz4_setup_params, + .release_params =3D lz4_release_params, .name =3D "lz4", }; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 6da71ec5fc05..928a6ea78668 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -5,60 +5,47 @@ =20 #include "backend_lz4hc.h" =20 -struct lz4hc_ctx { - void *mem; - s32 level; -}; +static void lz4hc_release_params(struct zcomp_params *params) +{ +} =20 -static void lz4hc_destroy(struct zcomp_ctx *ctx) +static int lz4hc_setup_params(struct zcomp_params *params) { - struct lz4hc_ctx *zctx =3D ctx->context; + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D LZ4HC_DEFAULT_CLEVEL; =20 - if (!zctx) - return; + return 0; +} =20 - vfree(zctx->mem); - kfree(zctx); +static void lz4hc_destroy(struct zcomp_ctx *ctx) +{ + vfree(ctx->context); } =20 static int lz4hc_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - struct lz4hc_ctx *zctx; - - zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); - if (!zctx) + ctx->context =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!ctx->context) return -ENOMEM; =20 - ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D LZ4HC_DEFAULT_CLEVEL; - - zctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!zctx->mem) - goto error; - return 0; -error: - lz4hc_destroy(ctx); - return -EINVAL; } =20 -static int lz4hc_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4hc_compress(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { - struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, - zctx->level, zctx->mem); + params->level, ctx->context); if (!ret) return -EINVAL; req->dst_len =3D ret; return 0; } =20 -static int lz4hc_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lz4hc_decompress(struct zcomp_params *params, struct zcomp_ctx = *ctx, + struct zcomp_req *req) { int ret; =20 @@ -74,5 +61,7 @@ const struct zcomp_ops backend_lz4hc =3D { .decompress =3D lz4hc_decompress, .create_ctx =3D lz4hc_create, .destroy_ctx =3D lz4hc_destroy, + .setup_params =3D lz4hc_setup_params, + .release_params =3D lz4hc_release_params, .name =3D "lz4hc", }; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 81fbad286092..4c906beaae6b 100644 --- a/drivers/block/zram/backend_lzo.c +++ b/drivers/block/zram/backend_lzo.c @@ -6,6 +6,15 @@ =20 #include "backend_lzo.h" =20 +static void lzo_release_params(struct zcomp_params *params) +{ +} + +static int lzo_setup_params(struct zcomp_params *params) +{ + return 0; +} + static int lzo_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); @@ -19,7 +28,8 @@ static void lzo_destroy(struct zcomp_ctx *ctx) kfree(ctx->context); } =20 -static int lzo_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzo_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req) { int ret; =20 @@ -28,7 +38,8 @@ static int lzo_compress(struct zcomp_ctx *ctx, struct zco= mp_req *req) return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzo_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzo_decompress(struct zcomp_params *params, struct zcomp_ctx *c= tx, + struct zcomp_req *req) { int ret; =20 @@ -42,5 +53,7 @@ const struct zcomp_ops backend_lzo =3D { .decompress =3D lzo_decompress, .create_ctx =3D lzo_create, .destroy_ctx =3D lzo_destroy, + .setup_params =3D lzo_setup_params, + .release_params =3D lzo_release_params, .name =3D "lzo", }; diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index 99c9da8f116e..10640c96cbfc 100644 --- a/drivers/block/zram/backend_lzorle.c +++ b/drivers/block/zram/backend_lzorle.c @@ -6,6 +6,15 @@ =20 #include "backend_lzorle.h" =20 +static void lzorle_release_params(struct zcomp_params *params) +{ +} + +static int lzorle_setup_params(struct zcomp_params *params) +{ + return 0; +} + static int lzorle_create(struct zcomp_params *params, struct zcomp_ctx *ct= x) { ctx->context =3D kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); @@ -19,7 +28,8 @@ static void lzorle_destroy(struct zcomp_ctx *ctx) kfree(ctx->context); } =20 -static int lzorle_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzorle_compress(struct zcomp_params *params, struct zcomp_ctx *= ctx, + struct zcomp_req *req) { int ret; =20 @@ -28,7 +38,8 @@ static int lzorle_compress(struct zcomp_ctx *ctx, struct = zcomp_req *req) return ret =3D=3D LZO_E_OK ? 0 : ret; } =20 -static int lzorle_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int lzorle_decompress(struct zcomp_params *params, struct zcomp_ctx= *ctx, + struct zcomp_req *req) { int ret; =20 @@ -42,5 +53,7 @@ const struct zcomp_ops backend_lzorle =3D { .decompress =3D lzorle_decompress, .create_ctx =3D lzorle_create, .destroy_ctx =3D lzorle_destroy, + .setup_params =3D lzorle_setup_params, + .release_params =3D lzorle_release_params, .name =3D "lzo-rle", }; diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 9f000dedf1ad..5b33daf4f645 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -10,12 +10,36 @@ struct zstd_ctx { zstd_cctx *cctx; zstd_dctx *dctx; - zstd_parameters cprm; void *cctx_mem; void *dctx_mem; - s32 level; }; =20 +struct zstd_params { + zstd_parameters cprm; +}; + +static void zstd_release_params(struct zcomp_params *params) +{ + kfree(params->drv_data); +} + +static int zstd_setup_params(struct zcomp_params *params) +{ + struct zstd_params *zp; + + zp =3D kzalloc(sizeof(*zp), GFP_KERNEL); + if (!zp) + return -ENOMEM; + + if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) + params->level =3D zstd_default_clevel(); + + zp->cprm =3D zstd_get_params(params->level, PAGE_SIZE); + params->drv_data =3D zp; + + return 0; +} + static void zstd_destroy(struct zcomp_ctx *ctx) { struct zstd_ctx *zctx =3D ctx->context; @@ -39,13 +63,7 @@ static int zstd_create(struct zcomp_params *params, stru= ct zcomp_ctx *ctx) return -ENOMEM; =20 ctx->context =3D zctx; - if (params->level !=3D ZCOMP_PARAM_NO_LEVEL) - zctx->level =3D params->level; - else - zctx->level =3D zstd_default_clevel(); - - prm =3D zstd_get_params(zctx->level, PAGE_SIZE); - zctx->cprm =3D zstd_get_params(zctx->level, PAGE_SIZE); + prm =3D zstd_get_params(params->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(&prm.cParams); zctx->cctx_mem =3D vzalloc(sz); if (!zctx->cctx_mem) @@ -71,20 +89,23 @@ static int zstd_create(struct zcomp_params *params, str= uct zcomp_ctx *ctx) return -EINVAL; } =20 -static int zstd_compress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int zstd_compress(struct zcomp_params *params, struct zcomp_ctx *ct= x, + struct zcomp_req *req) { + struct zstd_params *zp =3D params->drv_data; struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, - req->src, req->src_len, &zctx->cprm); + req->src, req->src_len, &zp->cprm); if (zstd_is_error(ret)) return -EINVAL; req->dst_len =3D ret; return 0; } =20 -static int zstd_decompress(struct zcomp_ctx *ctx, struct zcomp_req *req) +static int zstd_decompress(struct zcomp_params *params, struct zcomp_ctx *= ctx, + struct zcomp_req *req) { struct zstd_ctx *zctx =3D ctx->context; size_t ret; @@ -101,5 +122,7 @@ const struct zcomp_ops backend_zstd =3D { .decompress =3D zstd_decompress, .create_ctx =3D zstd_create, .destroy_ctx =3D zstd_destroy, + .setup_params =3D zstd_setup_params, + .release_params =3D zstd_release_params, .name =3D "zstd", }; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 877ae6c6ae9d..269b7155eb23 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 1d8920c2d449..ad5762813842 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -7,10 +7,18 @@ =20 #define ZCOMP_PARAM_NO_LEVEL INT_MIN =20 +/* + * Immutable driver (backend) parameters. The driver may attach private + * data to it (e.g. driver representation of the dictionary, etc.). + * + * This data is kept per-comp and is shared among execution contexts. + */ struct zcomp_params { void *dict; size_t dict_sz; s32 level; + + void *drv_data; }; =20 /* @@ -38,13 +46,17 @@ struct zcomp_req { }; =20 struct zcomp_ops { - int (*compress)(struct zcomp_ctx *ctx, struct zcomp_req *req); - int (*decompress)(struct zcomp_ctx *ctx, struct zcomp_req *req); + int (*compress)(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req); + int (*decompress)(struct zcomp_params *params, struct zcomp_ctx *ctx, + struct zcomp_req *req); =20 - int (*create_ctx)(struct zcomp_params *params, - struct zcomp_ctx *ctx); + int (*create_ctx)(struct zcomp_params *params, struct zcomp_ctx *ctx); void (*destroy_ctx)(struct zcomp_ctx *ctx); =20 + int (*setup_params)(struct zcomp_params *params); + void (*release_params)(struct zcomp_params *params); + const char *name; }; =20 --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4CDD9139CFF for ; Fri, 12 Jul 2024 05:19:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761590; cv=none; b=EuLmQ07xwbMEKA4gULk4pDSBA9p/OEyU+90Agl2wJtubu9frnAgcHOvmqx2vbg7dTOrrIL0wMnUGWXiQ65W/MAY+6h/3QlSDR0k+kLq50a+LmCybN2n32pwYB6nwrN+d4xwvYwrwGongstoIf5uKLAyjODRSEL2hXl6v2LuF2dY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761590; c=relaxed/simple; bh=oesL6yJLdEEPjF01GXBOvmDJXeLAWaEls3+QSgro1+g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qL2ysEd2uxxlcd69gHg3TvfRN25fBhiTpN6OuZUA5WhQb7FudPEV2cUVjOT5tu7HStHu4LJ0nJR0iWPtDmoWLeFWKJ522EsQigST3aTgRfmqR4TIMVkxrfPfVFydSRet9WGcTrejG0GsyxDoQbshVjPMcXog67Zv8sfpTEOVKEk= 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=UxgODw9/; arc=none smtp.client-ip=209.85.210.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="UxgODw9/" Received: by mail-pf1-f195.google.com with SMTP id d2e1a72fcca58-70b48dfd6a2so1377604b3a.1 for ; Thu, 11 Jul 2024 22:19:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761588; x=1721366388; 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=cOqz1UKJGC0cJBgyrAcesFmmSKbjK8nnap7UfC7PRiA=; b=UxgODw9/VFAjvoBBW1NfS4+sCRWEUW9aC3ZP99aQ+7YeM2EhmyiVx6npjj5oxQAbhv p/It6HQa7zL2ZnPjcF/1mjlnlxVF+SS6D3/YzJy7rVrXzNvv1PavmPYRZK1hUwGUuhZ+ 4PXTA0Ll5enL9ZPDxKMUnnsHeiOM0I0pfwKGs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761588; x=1721366388; 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=cOqz1UKJGC0cJBgyrAcesFmmSKbjK8nnap7UfC7PRiA=; b=W7+54VIgrpKv3LSxt7ZZ5hmsYz+LmBeMjZa9gRUZMp0TbRUBFg6Wj/SKHXDlODRhoD C2ddyUVvKdbzbWPtXnpiijpvF19PBjY85WtY8C+gt2LBc3WVcVrHnCstQIhMQEKWlRSo rdxficfKVOIEUEoHssRW73FWNTbp5gSMQikOSZWwp3kWP4ZvS3zWAKcYEE5fXvWI7T7t VYPM+y93XQ9F9W2xoS5cUvVsyonIfMmzY5KY6L8gvNkWGSIfRmO4dAsvIUEBd8ia+lEo lKvIlR1m+HBsVOqBiPC5EPg/bUu3yfT7tqytUWmcbZAOIPp87jW8zPvG1UBGKjAwojw9 NrMA== X-Gm-Message-State: AOJu0YzGvbh9nFP9Wrt8paZiJVzvkwPvgbEWQGRSkJsScmu/6OZHsblO RsGx7jT8WZwhjZLZvv5+I5JGuarffq7pZPKnrx+kgIvaszX5VQ8j61ABDly8UA== X-Google-Smtp-Source: AGHT+IFa5LtLb2Dhp8gMYPqeShtFnfkHNf23sEgbIqItEYFBbEjK3KI6KijIZLh/RvVwiE2kVelOJQ== X-Received: by 2002:a05:6a00:a13:b0:70b:1811:3efa with SMTP id d2e1a72fcca58-70b435ef897mr12775668b3a.22.1720761588552; Thu, 11 Jul 2024 22:19:48 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:48 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 20/23] zram: add dictionary support to lz4 Date: Fri, 12 Jul 2024 14:18:31 +0900 Message-ID: <20240712051850.484318-21-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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 cf3c029bd5ad..847f3334eb38 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -5,6 +5,13 @@ =20 #include "backend_lz4.h" =20 +struct lz4_ctx { + void *mem; + + LZ4_streamDecode_t *dstrm; + LZ4_stream_t *cstrm; +}; + static void lz4_release_params(struct zcomp_params *params) { } @@ -19,25 +26,66 @@ static int lz4_setup_params(struct zcomp_params *params) =20 static void lz4_destroy(struct zcomp_ctx *ctx) { - vfree(ctx->context); + struct lz4_ctx *zctx =3D ctx->context; + + if (!zctx) + return; + + vfree(zctx->mem); + kfree(zctx->dstrm); + kfree(zctx->cstrm); + kfree(zctx); } =20 static int lz4_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - ctx->context =3D vmalloc(LZ4_MEM_COMPRESS); - if (!ctx->context) + struct lz4_ctx *zctx; + + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) return -ENOMEM; =20 + ctx->context =3D zctx; + if (params->dict_sz =3D=3D 0) { + zctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!zctx->mem) + goto error; + } else { + zctx->dstrm =3D kzalloc(sizeof(*zctx->dstrm), GFP_KERNEL); + if (!zctx->dstrm) + goto error; + + zctx->cstrm =3D kzalloc(sizeof(*zctx->cstrm), GFP_KERNEL); + if (!zctx->cstrm) + goto error; + } + return 0; + +error: + lz4_destroy(ctx); + return -ENOMEM; } =20 static int lz4_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, struct zcomp_req *req) { + struct lz4_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, - req->dst_len, params->level, ctx->context); + if (!zctx->cstrm) { + ret =3D LZ4_compress_fast(req->src, req->dst, req->src_len, + req->dst_len, params->level, + zctx->mem); + } else { + /* Cstrm needs to be reset */ + ret =3D LZ4_loadDict(zctx->cstrm, params->dict, params->dict_sz); + if (ret !=3D params->dict_sz) + return -EINVAL; + ret =3D LZ4_compress_fast_continue(zctx->cstrm, req->src, + req->dst, req->src_len, + req->dst_len, params->level); + } if (!ret) return -EINVAL; req->dst_len =3D ret; @@ -47,10 +95,22 @@ static int lz4_compress(struct zcomp_params *params, st= ruct zcomp_ctx *ctx, static int lz4_decompress(struct zcomp_params *params, struct zcomp_ctx *c= tx, struct zcomp_req *req) { + struct lz4_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, - req->dst_len); + if (!zctx->dstrm) { + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); + } else { + /* Dstrm needs to be reset */ + ret =3D LZ4_setStreamDecode(zctx->dstrm, params->dict, + params->dict_sz); + if (!ret) + return -EINVAL; + ret =3D LZ4_decompress_safe_continue(zctx->dstrm, req->src, + req->dst, req->src_len, + req->dst_len); + } if (ret < 0) return -EINVAL; return 0; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5ACB413A402 for ; Fri, 12 Jul 2024 05:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761592; cv=none; b=hjCdvkG681QnenXO1LxHzYeqlxYpdQU2GC2ZACfacYDVKg8Z8aDq8hkegsLGsq8gsq5NVjhAmNg8a4pNvDJ81zk7JakXHdztyPJsTopdhwIM1dKdaJD5CYZuDL+EJFHHTUBG9mhSghA9t6qWsBJxS5EcHsJBghOlMtkucopxriU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761592; c=relaxed/simple; bh=pBJX240A8EepnVHuaJxutQ6J47IN9DHh/OOBZLl3Zrg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dxHBz3U/jrMnZN+94YNMKQv23Yd+X1oARNjrXy8SLLyWIejUw+yagh7H1FwALrZUJ2Kf5RMniv8IYtk+vfWbG6gu1DU6UeP0seLSbgvIe6TCAe0b+LqeX2m5o7neIJEjLHdmkRfjuF1tKjScHzRmybmbR4N6xQ1OfwMbYYGrq+A= 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=D2CdFJ1I; arc=none smtp.client-ip=209.85.210.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="D2CdFJ1I" Received: by mail-pf1-f193.google.com with SMTP id d2e1a72fcca58-70b09c2ade6so1355966b3a.3 for ; Thu, 11 Jul 2024 22:19:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761591; x=1721366391; 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=ySNQ8hknVs1Pz2Cxbz+MxOZEuy5IgamkxaSOVrUSiXw=; b=D2CdFJ1IIgL8mdzxC6kTs62mRa9XLbuhb7Lx6h1fIFHYefLlNjgOwK9m+6FaqWJiPj rAGC1lTMuRLSAMXV7+NF1SUv1hkF/Jdi73oKLTlbDIOnQTqBl86nciJuePTYMY9gK6cV qEjns2ZfWEqfsDV/fuqY5YAl3Pr79RuHKXoOM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761591; x=1721366391; 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=ySNQ8hknVs1Pz2Cxbz+MxOZEuy5IgamkxaSOVrUSiXw=; b=OCTDRX5hWJd7TDO3J3VYjUtBLpvji90bYgyXWmzL2WujB7tOGWr4VfpqcyC/c4P030 JSyRjRmtXMXG0w5LK5ps+tZEoPei9P1RSCA6M9de1lpi8VUluu80AgLrXZRhKPDJtEXK YPDYjwG/uK70tt6d0OkcPilWydMs/ZUKFUDuhUlMcQ0FE44Jgcax1tBNGd8E2drYHKAd dmurC7OMcSzGfxggJFTuejMmuwtS+2GwS0ulyn73hioe1K3kIcnPHC93L1Xbm5crMkQP szRiAyKkIO0Rp1fapZ32VrrOcm4kNzmxORbLoD734MztTe4xbxoqar4JxCqw0OYbZbTB aiJw== X-Gm-Message-State: AOJu0YxrDJEu+W7NlBDelWjm7EEufhM6MX8Z+vlk/6yzfQntosH6Cncs lEEB2UaiJHSkXmPuK+Up1Jd5EjGj8hERhKx4OmaOLr6sNlBNBcWS4sDqsz1g/A== X-Google-Smtp-Source: AGHT+IGvSlUfQaZyvlFesabkCeeN/gUj6ePCb9wgZ5Zfoa8PweA3oTtj/Rhf/zk6587E+DBF3A8rPw== X-Received: by 2002:a05:6a00:1797:b0:706:759a:70bf with SMTP id d2e1a72fcca58-70b435686b8mr13804295b3a.13.1720761590676; Thu, 11 Jul 2024 22:19:50 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:50 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 21/23] zram: add dictionary support to lz4hc Date: Fri, 12 Jul 2024 14:18:32 +0900 Message-ID: <20240712051850.484318-22-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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 928a6ea78668..5f37d5abcaeb 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -5,6 +5,13 @@ =20 #include "backend_lz4hc.h" =20 +struct lz4hc_ctx { + void *mem; + + LZ4_streamDecode_t *dstrm; + LZ4_streamHC_t *cstrm; +}; + static void lz4hc_release_params(struct zcomp_params *params) { } @@ -19,25 +26,67 @@ static int lz4hc_setup_params(struct zcomp_params *para= ms) =20 static void lz4hc_destroy(struct zcomp_ctx *ctx) { - vfree(ctx->context); + struct lz4hc_ctx *zctx =3D ctx->context; + + if (!zctx) + return; + + kfree(zctx->dstrm); + kfree(zctx->cstrm); + vfree(zctx->mem); + kfree(zctx); } =20 static int lz4hc_create(struct zcomp_params *params, struct zcomp_ctx *ctx) { - ctx->context =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!ctx->context) + struct lz4hc_ctx *zctx; + + zctx =3D kzalloc(sizeof(*zctx), GFP_KERNEL); + if (!zctx) return -ENOMEM; =20 + ctx->context =3D zctx; + if (params->dict_sz =3D=3D 0) { + zctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!zctx->mem) + goto error; + } else { + zctx->dstrm =3D kzalloc(sizeof(*zctx->dstrm), GFP_KERNEL); + if (!zctx->dstrm) + goto error; + + zctx->cstrm =3D kzalloc(sizeof(*zctx->cstrm), GFP_KERNEL); + if (!zctx->cstrm) + goto error; + } + return 0; + +error: + lz4hc_destroy(ctx); + return -EINVAL; } =20 static int lz4hc_compress(struct zcomp_params *params, struct zcomp_ctx *c= tx, struct zcomp_req *req) { + struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len, - params->level, ctx->context); + if (!zctx->cstrm) { + ret =3D LZ4_compress_HC(req->src, req->dst, req->src_len, + req->dst_len, params->level, + zctx->mem); + } else { + /* Cstrm needs to be reset */ + LZ4_resetStreamHC(zctx->cstrm, params->level); + ret =3D LZ4_loadDictHC(zctx->cstrm, params->dict, + params->dict_sz); + if (ret !=3D params->dict_sz) + return -EINVAL; + ret =3D LZ4_compress_HC_continue(zctx->cstrm, req->src, req->dst, + req->src_len, req->dst_len); + } if (!ret) return -EINVAL; req->dst_len =3D ret; @@ -47,10 +96,22 @@ static int lz4hc_compress(struct zcomp_params *params, = struct zcomp_ctx *ctx, static int lz4hc_decompress(struct zcomp_params *params, struct zcomp_ctx = *ctx, struct zcomp_req *req) { + struct lz4hc_ctx *zctx =3D ctx->context; int ret; =20 - ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, - req->dst_len); + if (!zctx->dstrm) { + ret =3D LZ4_decompress_safe(req->src, req->dst, req->src_len, + req->dst_len); + } else { + /* Dstrm needs to be reset */ + ret =3D LZ4_setStreamDecode(zctx->dstrm, params->dict, + params->dict_sz); + if (!ret) + return -EINVAL; + ret =3D LZ4_decompress_safe_continue(zctx->dstrm, req->src, + req->dst, req->src_len, + req->dst_len); + } if (ret < 0) return -EINVAL; return 0; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-ot1-f67.google.com (mail-ot1-f67.google.com [209.85.210.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 B1C4222EE8 for ; Fri, 12 Jul 2024 05:19:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.67 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761595; cv=none; b=Ek8ECQ45amtvk4TYJdaoLzwJ6QpIWodUociACO62belBPv0WZyjVDFvmnXAfOl+V6OdxnqGpNTWMmOmo/R6oPC0CS52Q6L0xPdfYHDNX9Rs9PrT/M9D3GY6y07Jqp4cbYOI/a2doe+5q0YX0f/6kRW+V2r7TP+NpFyiG64qxvpA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761595; c=relaxed/simple; bh=lIu2cKbtMq8P8bTKzOPWh7Yz083/sTfChl59J3BIqTc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LpMgOvn42l0V9OvP2wfcSdnkypGiKmNcgQDv5oXT1lvRq1mb669pq9qzzZCLzUPEH1dAX95oIdxA49JQD4r01TKtdGLcXmg28O9pBbWSsq0v5VmUTk4hGKChwxAo933miSwp7txG9IGx6GPFupJqmCrqJBsI5GVGZAsTcwL1vYk= 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=YnJ80XPn; arc=none smtp.client-ip=209.85.210.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="YnJ80XPn" Received: by mail-ot1-f67.google.com with SMTP id 46e09a7af769-70445f0d9b8so965841a34.0 for ; Thu, 11 Jul 2024 22:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761593; x=1721366393; 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=JCGwMP05WyVBgIPwBZ6xnpAZJ1Zv7M7TqzCkslB368o=; b=YnJ80XPnQQmUdjTM565s8SrPknQUmhqvQ3+/xxr93szGe9+DJTYQG/AGkfMvmfBm2K 2x1orgdDfvG7utv1lwGpGpunJRofCY8EpdUjjdFDpv06XeIh7HmExvAvsX83yJmu7SdT 0Ey50IW7fk+K/K4M8Y1Xbx1m+aFbxLglf/zwU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761593; x=1721366393; 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=JCGwMP05WyVBgIPwBZ6xnpAZJ1Zv7M7TqzCkslB368o=; b=Z7tBErZlwWLvRuaFE6L7NKVOFTjO19FPHGSh7qI9ee321qPnb9qGCtUaSw6zW/Y0u2 g7ACSU7GPOYLN0BBm6C1jz2Y3O5pTajQuuV3NNSaAshNR5GGJf73NFZfUeNL6A0/jy5u bxDfEyI4p68XnVIVE0y/crjiXIKIf1nIco7OrgCiPhixGrv5FRhv9HKYLxgVNvMkxQmk bOjmVoCcuv8vimVgYqJxyMjWTS5mAb4yiv39fbobKb5YfgQbExdaaTBj8eDqnorffDKM 2SV1cvz0azwar167oLR7IEKbS2aTn/Kdh2i4BMuMe9zuHGb63792qA7JImsKBC1PMd3x JgHQ== X-Gm-Message-State: AOJu0Yy34thf2DIuiLYwgHu+qxt0V/zkU33hzJM5Oh2xBhEAYTcfFdvP 01Cztr6Bq/n2rudIhUrsPsclIFO6sUg04QHJb55Nknmq3psXhzTEpjToGMKCYWmj01qHIckuU8S zybEeMiQ= X-Google-Smtp-Source: AGHT+IEz96Kg+GObK/ZMafk0DpbDPCWjgQUXEH5idPdG/J6B6jpF/Pk9kEkxJnC3yTNMKLEluGjDjg== X-Received: by 2002:a05:6830:e81:b0:703:64c6:305b with SMTP id 46e09a7af769-703759faebdmr11525118a34.2.1720761592805; Thu, 11 Jul 2024 22:19:52 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:52 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 22/23] zram: add dictionary support to zstd backend Date: Fri, 12 Jul 2024 14:18:33 +0900 Message-ID: <20240712051850.484318-23-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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 5b33daf4f645..1184c0036f44 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -15,29 +15,87 @@ struct zstd_ctx { }; =20 struct zstd_params { + zstd_custom_mem custom_mem; + zstd_cdict *cdict; + zstd_ddict *ddict; zstd_parameters cprm; }; =20 +/* + * For C/D dictionaries we need to provide zstd with zstd_custom_mem, + * which zstd uses internally to allocate/free memory when needed. + * + * This means that allocator.customAlloc() can be called from zcomp_compre= ss() + * under local-lock (per-CPU compression stream), in which case we must use + * GFP_ATOMIC. + * + * Another complication here is that we can be configured as a swap device. + */ +static void *zstd_custom_alloc(void *opaque, size_t size) +{ + if (!preemptible()) + return kvzalloc(size, GFP_ATOMIC); + + return kvzalloc(size, __GFP_KSWAPD_RECLAIM | __GFP_NOWARN); +} + +static void zstd_custom_free(void *opaque, void *address) +{ + kvfree(address); +} + static void zstd_release_params(struct zcomp_params *params) { - kfree(params->drv_data); + struct zstd_params *zp =3D params->drv_data; + + params->drv_data =3D NULL; + if (!zp) + return; + + zstd_free_cdict(zp->cdict); + zstd_free_ddict(zp->ddict); + kfree(zp); } =20 static int zstd_setup_params(struct zcomp_params *params) { + zstd_compression_parameters prm; struct zstd_params *zp; =20 zp =3D kzalloc(sizeof(*zp), GFP_KERNEL); if (!zp) return -ENOMEM; =20 + params->drv_data =3D zp; if (params->level =3D=3D ZCOMP_PARAM_NO_LEVEL) params->level =3D zstd_default_clevel(); =20 zp->cprm =3D zstd_get_params(params->level, PAGE_SIZE); - params->drv_data =3D zp; + + zp->custom_mem.customAlloc =3D zstd_custom_alloc; + zp->custom_mem.customFree =3D zstd_custom_free; + + prm =3D zstd_get_cparams(params->level, PAGE_SIZE, + params->dict_sz); + + zp->cdict =3D zstd_create_cdict_byreference(params->dict, + params->dict_sz, + prm, + zp->custom_mem); + if (!zp->cdict) + goto error; + + zp->ddict =3D zstd_create_ddict_byreference(params->dict, + params->dict_sz, + zp->custom_mem); + if (!zp->ddict) + goto error; =20 return 0; + +error: + zstd_release_params(params); + return -EINVAL; } =20 static void zstd_destroy(struct zcomp_ctx *ctx) @@ -47,8 +105,23 @@ static void zstd_destroy(struct zcomp_ctx *ctx) if (!zctx) return; =20 - vfree(zctx->cctx_mem); - vfree(zctx->dctx_mem); + /* + * If ->cctx_mem and ->dctx_mem were allocated then we didn't use + * C/D dictionary and ->cctx / ->dctx were "embedded" into these + * buffers. + * + * If otherwise then we need to explicitly release ->cctx / ->dctx. + */ + if (zctx->cctx_mem) + vfree(zctx->cctx_mem); + else + zstd_free_cctx(zctx->cctx); + + if (zctx->dctx_mem) + vfree(zctx->dctx_mem); + else + zstd_free_dctx(zctx->dctx); + kfree(zctx); } =20 @@ -63,28 +136,41 @@ static int zstd_create(struct zcomp_params *params, st= ruct zcomp_ctx *ctx) return -ENOMEM; =20 ctx->context =3D zctx; - prm =3D zstd_get_params(params->level, PAGE_SIZE); - sz =3D zstd_cctx_workspace_bound(&prm.cParams); - zctx->cctx_mem =3D vzalloc(sz); - if (!zctx->cctx_mem) - goto error; - - zctx->cctx =3D zstd_init_cctx(zctx->cctx_mem, sz); - if (!zctx->cctx) - goto error; - - sz =3D zstd_dctx_workspace_bound(); - zctx->dctx_mem =3D vzalloc(sz); - if (!zctx->dctx_mem) - goto error; - - zctx->dctx =3D zstd_init_dctx(zctx->dctx_mem, sz); - if (!zctx->dctx) - goto error; + if (params->dict_sz =3D=3D 0) { + prm =3D zstd_get_params(params->level, PAGE_SIZE); + sz =3D zstd_cctx_workspace_bound(&prm.cParams); + zctx->cctx_mem =3D vzalloc(sz); + if (!zctx->cctx_mem) + goto error; + + zctx->cctx =3D zstd_init_cctx(zctx->cctx_mem, sz); + if (!zctx->cctx) + goto error; + + sz =3D zstd_dctx_workspace_bound(); + zctx->dctx_mem =3D vzalloc(sz); + if (!zctx->dctx_mem) + goto error; + + zctx->dctx =3D zstd_init_dctx(zctx->dctx_mem, sz); + if (!zctx->dctx) + goto error; + } else { + struct zstd_params *zp =3D params->drv_data; + + zctx->cctx =3D zstd_create_cctx_advanced(zp->custom_mem); + if (!zctx->cctx) + goto error; + + zctx->dctx =3D zstd_create_dctx_advanced(zp->custom_mem); + if (!zctx->dctx) + goto error; + } =20 return 0; =20 error: + zstd_release_params(params); zstd_destroy(ctx); return -EINVAL; } @@ -96,8 +182,14 @@ static int zstd_compress(struct zcomp_params *params, s= truct zcomp_ctx *ctx, struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 - ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, - req->src, req->src_len, &zp->cprm); + if (params->dict_sz =3D=3D 0) + ret =3D zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len, + req->src, req->src_len, &zp->cprm); + else + ret =3D zstd_compress_using_cdict(zctx->cctx, req->dst, + req->dst_len, req->src, + req->src_len, + zp->cdict); if (zstd_is_error(ret)) return -EINVAL; req->dst_len =3D ret; @@ -107,11 +199,17 @@ static int zstd_compress(struct zcomp_params *params,= struct zcomp_ctx *ctx, static int zstd_decompress(struct zcomp_params *params, struct zcomp_ctx *= ctx, struct zcomp_req *req) { + struct zstd_params *zp =3D params->drv_data; struct zstd_ctx *zctx =3D ctx->context; size_t ret; =20 - ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, - req->src, req->src_len); + if (params->dict_sz =3D=3D 0) + ret =3D zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len, + req->src, req->src_len); + else + ret =3D zstd_decompress_using_ddict(zctx->dctx, req->dst, + req->dst_len, req->src, + req->src_len, zp->ddict); if (zstd_is_error(ret)) return -EINVAL; return 0; --=20 2.45.2.993.g49e7a77208-goog From nobody Wed Dec 17 09:01:24 2025 Received: from mail-oi1-f181.google.com (mail-oi1-f181.google.com [209.85.167.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6B5C13B78A for ; Fri, 12 Jul 2024 05:19:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761597; cv=none; b=nlM0+6t57ExkBJgE6fu8N0aV4S2idsza7z4OYIF7SXVOpG+0JB12U56IxiGvg1nhCW0sUSsUOAx2kXk3p3FWhG64xPcGOmta176Lmqv/ORhA4jOeEZO5JvPx4PLqP16rup2hVPyAYOq181Kv4RtF8o5Y++EJ3lnRPe8Uk0Oo7pg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720761597; c=relaxed/simple; bh=zEQaHkIHnLEwcguffr+8edDadfr0KsJyp3aPZNLWx+4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f3SNaIs6CL0fB9o7biDTv9Wm0v1XhCS97gYeSRpKuoIYoKezaWpp6kPHv/zpLat5HMmNBE73KnEhPptpw88V/L2Jr4+uLIapuev3cPr68jRQT0M8vl/hFAwsxS2xj+rZYxtY+erD9L6YG5vpmydVaE9LL96lriDn/uXnJ2ldYxU= 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=N3erS5ff; arc=none smtp.client-ip=209.85.167.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="N3erS5ff" Received: by mail-oi1-f181.google.com with SMTP id 5614622812f47-3d9dbbaa731so910453b6e.3 for ; Thu, 11 Jul 2024 22:19:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1720761595; x=1721366395; 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=dJs3uYAgmbjgEj5efu8Z24w0fCzDc8W+Wf0sVn//syU=; b=N3erS5ffP4rFeNpcrVj9WfS3/FR0fcC7U3Y0J8z4ptVxhl+18RCUxS9EBzU3zyRAml TXmXEKgC54RfOp/SVXJbZbFX1GjX36bSM/hhRHcOhy0S0u3NHTundEy6+bF0CUuACynM G9RibQU5PBP/sSG1MpsSpfahhc/1qQSCJ7QJc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720761595; x=1721366395; 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=dJs3uYAgmbjgEj5efu8Z24w0fCzDc8W+Wf0sVn//syU=; b=GUXnNRJ3gkclD3qLj5ozg8ug1ukgwdgffgdXmEHTWcNjfMdJqsgNJLRwPBKR6EHWZR +g6UAmbC/y3rk3VSPsWtT+nvAkfspBAzy3EMfH2j9GzI26B8kmqpL7Uxp5RUKbg4Sl+u GYtV+8hjjfkrQvlA/6ddRD2tGhj7pRd3kfHsOgDs3CIWjmYP1rXdYtHj7yuFkBCSByiP IPa2iS8yv/rjNiq4WnuAaWa3vs9bNacMy5Z49kLyTj+WyEFxPGSDLgrdgtIRJbDCn0wo ddJlox5X1bdMjDdZOi2/x1/krZ8Vp3FgKbDP2kmZHRSOrePg/LHbEnY8RQPq2m4xs0BG Pm7A== X-Gm-Message-State: AOJu0YyHyOlGwX3eDqWzxZ0B4nxA8AjbLid66sG1UIT0zQj+YTxwe5e8 NfWfeqspq9hZywO8wqoQS04nspFw0JhqFU1tfXgdByuLPioxu1hz0H4TOxylfQ== X-Google-Smtp-Source: AGHT+IGeKCj6wggEIhkK5rbVRPufA0jXDRCHo+n4P5SDGOIZsguPpIWfq3UtLpR21utxnl1c5msKMw== X-Received: by 2002:a05:6808:15a2:b0:3da:a793:f10e with SMTP id 5614622812f47-3daa793fe0amr3234374b6e.18.1720761594886; Thu, 11 Jul 2024 22:19:54 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:15f3:5252:ec56:52ae]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70b43967851sm6553436b3a.109.2024.07.11.22.19.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jul 2024 22:19:54 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v6 23/23] Documentation/zram: add documentation for algorithm parameters Date: Fri, 12 Jul 2024 14:18:34 +0900 Message-ID: <20240712051850.484318-24-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.2.993.g49e7a77208-goog In-Reply-To: <20240712051850.484318-1-senozhatsky@chromium.org> References: <20240712051850.484318-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.993.g49e7a77208-goog