From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47DD543ABC for ; Wed, 15 May 2024 07:16:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757421; cv=none; b=kXV7aS8utfHyCPHl+mKaJZWKZNELAoBJ7nGYFTPHjev8sjbg8XMWqenaxp89WeHAo1fgPmtbgZV9gKc3sqO3UsIAS4KgiFzW96H2lMjB8pTFocBjRZYlmbJbfWVV++1NKjTljcKQbwfi3ceGSmSLpKlU6VCnDjwHWgjNtNFEGS0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757421; c=relaxed/simple; bh=544LLbSp8/PVrYB0QGq7rRmx9sLqiZpPOCFAPpIoqy0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oQoyC1htOfrYJHjyABjowvB61sm1Cu4xaaKX2EwWx/MfJuPj1cOONY64c342bzqgMyYkXofsqDUsFC9zigU9INH/CM/VTMxcPxdJM5JO3WTLD5D1+/38kbRGyH2IRu3npUJvIcGCoE9L+umbUHY9ZbG5VkwDztMsJ4tRlb8yk2o= 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=GsHICxUG; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="GsHICxUG" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-1f0537e39b3so37032265ad.3 for ; Wed, 15 May 2024 00:16:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757419; x=1716362219; 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=fsLG0zPIDV95vZmzBVa/SvUT8ZYjpbB7N30gWJFx0mg=; b=GsHICxUGAfpKfZMBu3GPpDoVfAE4zE4XWuifCtCGJun31Akyh9KG0wrV84E1mqL8wZ MCN5glkCkvxQ67Aon6C1zHdvzZMkPylWSTD1K0idpAT17LbYaowBsDFEhcBtFTmFxCq2 XdYBddbbHGVn8IFThXJhT4ti+eQusRxyuL7mU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757419; x=1716362219; 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=fsLG0zPIDV95vZmzBVa/SvUT8ZYjpbB7N30gWJFx0mg=; b=WJWij92HOAhbPeRBfqIfYOG29dBUVAV4azEgG3wJg8qnK+LnpdL+UD/mXOXb2z1TMI OVLDVYBth8B6Ipo/6TdNcLBIPAAvmYY9gya2h6FLqOCaFQPD4uVDx+lUnox1uRUO8l42 vpGFQA/bs+rW9hhBwf9jbC5EPWSzjjJvtv58isig4RV5+HIPY8ErDhMOuCn7LJhBNi+q EMPNFBWc77aubzGP8ukV2Vvtz6yACVaGm4gOCsbqu2BgoklhMxMrS9SG1ZVIBNvsh9h+ lp3E3/mgnReoSOa3TcjKvdUmbFHn0HMXb0UQbENyirok8mDMBTeHS54gFHxwYvMl6jTx FGfQ== X-Gm-Message-State: AOJu0YxirEprYWsRUeDjIVw3dLpPkEv+tkluynzi+C0hpqHWyKI64scJ YpoR77uiEGOjXFgkaE3eY6PzO9/HGV2QFQcpBTbr6B266KRNMQtxgpXO3aPngxb6ln6sigW4TVg = X-Google-Smtp-Source: AGHT+IE4lcnvFwAZn4jYeIZdBmKYEjCZJtmfcPgBKIRB2MhlQ4QeIrzh5k67ZucVVYTYmBniCUBgIg== X-Received: by 2002:a17:902:cf07:b0:1ea:ca03:5d8e with SMTP id d9443c01a7336-1ef4404fbecmr181642705ad.44.1715757418737; Wed, 15 May 2024 00:16:58 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.16.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:16:58 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 01/21] zram: move from crypto API to custom comp backends API Date: Wed, 15 May 2024 16:12:38 +0900 Message-ID: <20240515071645.1788128-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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" Crypto API is beautiful and powerful, however, being a generic API, it lacks support for fine-grained per-algorithm configuration. A number of compression algorithms provide various knobs to tune characteristics for particular data patterns. The simplest case is "compression level". A more complicated and interesting case is user-space trained dictionaries (e.g. lz4 and zstd). 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 | 127 +++++++++++++--------------------- drivers/block/zram/zcomp.h | 26 +++++-- drivers/block/zram/zram_drv.c | 9 ++- 4 files changed, 73 insertions(+), 128 deletions(-) diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 7b29cce60ab2..8ecb74f83a5e 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -2,7 +2,6 @@ config ZRAM tristate "Compressed RAM block device support" depends on BLOCK && SYSFS && MMU - depends on CRYPTO_LZO || CRYPTO_ZSTD || CRYPTO_LZ4 || CRYPTO_LZ4HC || CRY= PTO_842 select ZSMALLOC help Creates virtual block devices called /dev/zramX (X =3D 0, 1, ...). @@ -15,45 +14,9 @@ config ZRAM =20 See Documentation/admin-guide/blockdev/zram.rst for more information. =20 -choice - prompt "Default zram compressor" - default ZRAM_DEF_COMP_LZORLE - depends on ZRAM - -config ZRAM_DEF_COMP_LZORLE - bool "lzo-rle" - depends on CRYPTO_LZO - -config ZRAM_DEF_COMP_ZSTD - bool "zstd" - depends on CRYPTO_ZSTD - -config ZRAM_DEF_COMP_LZ4 - bool "lz4" - depends on CRYPTO_LZ4 - -config ZRAM_DEF_COMP_LZO - bool "lzo" - depends on CRYPTO_LZO - -config ZRAM_DEF_COMP_LZ4HC - bool "lz4hc" - depends on CRYPTO_LZ4HC - -config ZRAM_DEF_COMP_842 - bool "842" - depends on CRYPTO_842 - -endchoice - config ZRAM_DEF_COMP string - default "lzo-rle" if ZRAM_DEF_COMP_LZORLE - default "zstd" if ZRAM_DEF_COMP_ZSTD - default "lz4" if ZRAM_DEF_COMP_LZ4 - default "lzo" if ZRAM_DEF_COMP_LZO - default "lz4hc" if ZRAM_DEF_COMP_LZ4HC - default "842" if ZRAM_DEF_COMP_842 + default "unset-value" =20 config ZRAM_WRITEBACK bool "Write back incompressible or idle page to backing device" diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 8237b08c49d8..0d0d2e6dbaa9 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -15,31 +15,16 @@ =20 #include "zcomp.h" =20 -static const char * const backends[] =3D { -#if IS_ENABLED(CONFIG_CRYPTO_LZO) - "lzo", - "lzo-rle", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_LZ4) - "lz4", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_LZ4HC) - "lz4hc", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_842) - "842", -#endif -#if IS_ENABLED(CONFIG_CRYPTO_ZSTD) - "zstd", -#endif +static struct zcomp_backend *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->backend->destroy_ctx(zstrm->ctx); vfree(zstrm->buffer); - zstrm->tfm =3D NULL; + zstrm->ctx =3D NULL; zstrm->buffer =3D NULL; } =20 @@ -47,60 +32,55 @@ static void zcomp_strm_free(struct zcomp_strm *zstrm) * 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->backend->create_ctx(); + /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ zstrm->buffer =3D vzalloc(2 * PAGE_SIZE); - if (IS_ERR_OR_NULL(zstrm->tfm) || !zstrm->buffer) { - zcomp_strm_free(zstrm); + if (!zstrm->ctx || !zstrm->buffer) { + zcomp_strm_free(comp, zstrm); return -ENOMEM; } return 0; } =20 +static struct zcomp_backend *lookup_backend(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(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,8 +95,8 @@ 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 @@ -132,21 +112,19 @@ int zcomp_compress(struct zcomp_strm *zstrm, * the dst buffer, zram_drv will take care of the fact that * compressed buffer is too big. */ - *dst_len =3D PAGE_SIZE * 2; + size_t dlen =3D PAGE_SIZE * 2; + int ret; =20 - return crypto_comp_compress(zstrm->tfm, - src, PAGE_SIZE, - zstrm->buffer, dst_len); + ret =3D comp->backend->compress(zstrm->ctx, src, 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->backend->decompress(zstrm->ctx, src, src_len, dst); } =20 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) @@ -158,7 +136,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 +148,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 +177,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->backend =3D lookup_backend(alg); + if (!comp->backend) { + 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..757b85017e23 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -12,13 +12,26 @@ struct zcomp_strm { local_lock_t lock; /* compression/decompression buffer */ void *buffer; - struct crypto_comp *tfm; + void *ctx; +}; + +struct zcomp_backend { + int (*compress)(void *ctx, const unsigned char *src, + unsigned char *dst, size_t *dst_len); + + int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, + unsigned char *dst); + + void *(*create_ctx)(void); + void (*destroy_ctx)(void *ctx); + + const char *name; }; =20 /* dynamic per-device compression frontend */ struct zcomp { struct zcomp_strm __percpu *stream; - const char *name; + struct zcomp_backend *backend; struct hlist_node node; }; =20 @@ -33,10 +46,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 3acd7006ad2c..38afc2c23108 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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.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 D82F745958 for ; Wed, 15 May 2024 07:17:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757423; cv=none; b=JR9mawInjz2kUNpS4IqlxxEF1yHFBS/GEglEnwbKbCqKO41QqxsMZW8ebhnoq6kgho4KcpHTtmtUf6JRU8jLVuNihZ9b7oeRc6QtOKwuTvmdcbP8X3Bo2G2F36j/rxy8jtZWAKfB3k+9qlGLnp7fgg/42WE5Ue9WeVeRnudeKwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757423; c=relaxed/simple; bh=SQspApLzR6A+qI3ABji2AwHeyysKKTXjPbdBT7c8Ig8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t5ak9Bxeawj8YY1NxHpcKMKNw4BqCk/21JvRDAu3fQYmw8pjlZFKDIddS84ZIYZfGUzudAEylmZbtfGgXpl2NnZf6jg9mffT9KvNTqY+z5i81DZpAaVkKqUQKcnnDNyWQ+EuMEwfjjUdaHSQOo56LqhC80H3awxOoCRXnQ9pBVE= 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=aGT3GKz7; arc=none smtp.client-ip=209.85.214.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="aGT3GKz7" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1ee7963db64so54141555ad.1 for ; Wed, 15 May 2024 00:17:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757421; x=1716362221; 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=zHiH39OlVbbyYOoV0PVG81/IjMwGnGQnqALJjuzf7+o=; b=aGT3GKz7+tMGUzCxJW/Ezcs3m9E++MTurLqHSz5AOQOrIUipU1671dzGqM1nXcP61w 6r1+TqTp/+GmxYqAV4tmyt1zosJBeNmibXN3l1+Ri7umUkgsXjwM7Rls5MM9ChDSnjVF Wle+YjbC54Kdqd31XWNU4A0v6nDcS1SmHPGeo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757421; x=1716362221; 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=zHiH39OlVbbyYOoV0PVG81/IjMwGnGQnqALJjuzf7+o=; b=kPSW2wFQR0VgdUPjvb5EVv4bgvA9e5A+T8AFHdEni5OzEa0DEmMgWNOGT+GIlVPQw0 TAjuzfyEis9OhxkVKQxqjONwDw/yQWRjbuMfN0fXCqEhGTw/OMzTVJGI1G/75TiXvrTm sRGnbENhVGaqiGEor/bXDWve/W6I7t5uKWsdHouzUkm1ghLsKewQraPYuazmO8Oa2ycc V209q5gFo9BOD3YfwFRgTFlJrsne+WPI5XBXKyQA7FSsZzNjaC+uPWRk+i0af4kfO7Tm ke2mQ5ECQeIlY/wanggymyLWDPXOvkzR6TA7z8KycHU3ugllom75peFUovjqyuFbaI2J p3sw== X-Gm-Message-State: AOJu0Yxtt3nPsBOHpaoJVOXoTLAx6cvKNbg97qcJ2N/vYkLtLL1beXN5 G2FVl4ejJvhObm2OJTCWk+jc5LSM1KHKgx3EKF7yiUJHW1DYr2UV16qAOy0hxA== X-Google-Smtp-Source: AGHT+IFL9UyLu26jE4g+X6OYAAQOaCxw87D8rJNv/C2yKEFY7GXkl4F5s/LdrGfAqTySIEcbf+3Imw== X-Received: by 2002:a17:902:7b87:b0:1ea:9585:a1d7 with SMTP id d9443c01a7336-1ef43e293d9mr148335675ad.37.1715757421264; Wed, 15 May 2024 00:17:01 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.16.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:00 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 02/21] zram: add lzo and lzorle compression backends support Date: Wed, 15 May 2024 16:12:39 +0900 Message-ID: <20240515071645.1788128-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 44 +++++++++++++++++++++++++++++ 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, 141 insertions(+) create mode 100644 drivers/block/zram/backend_lzo.c create mode 100644 drivers/block/zram/backend_lzo.h create mode 100644 drivers/block/zram/backend_lzorle.c create mode 100644 drivers/block/zram/backend_lzorle.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 8ecb74f83a5e..5d329a887b12 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -14,8 +14,31 @@ config ZRAM =20 See Documentation/admin-guide/blockdev/zram.rst for more information. =20 +config ZRAM_BACKEND_LZO + bool "lzo and lzo-rle compression support" + depends on ZRAM + select LZO_COMPRESS + select LZO_DECOMPRESS + +choice + prompt "Default zram compressor" + default ZRAM_DEF_COMP_LZORLE + depends on ZRAM + +config ZRAM_DEF_COMP_LZORLE + bool "lzo-rle" + depends on ZRAM_BACKEND_LZO + +config ZRAM_DEF_COMP_LZO + bool "lzo" + depends on ZRAM_BACKEND_LZO + +endchoice + config ZRAM_DEF_COMP string + default "lzo-rle" if ZRAM_DEF_COMP_LZORLE + default "lzo" if ZRAM_DEF_COMP_LZO default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index de9e457907b1..2a3db3368af9 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only + zram-y :=3D zcomp.o zram_drv.o =20 +zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o + obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c new file mode 100644 index 000000000000..b88b408964cd --- /dev/null +++ b/drivers/block/zram/backend_lzo.c @@ -0,0 +1,44 @@ +// 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, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D lzo1x_1_compress(src, PAGE_SIZE, 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 =3D PAGE_SIZE; + int ret; + + ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +struct zcomp_backend 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..377ccb7389e2 --- /dev/null +++ b/drivers/block/zram/backend_lzo.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZO_H__ +#define __BACKEND_LZO_H__ + +#include "zcomp.h" + +extern struct zcomp_backend 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..9bf1843021b0 --- /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, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D lzorle1x_1_compress(src, PAGE_SIZE, 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 =3D PAGE_SIZE; + int ret; + + ret =3D lzo1x_decompress_safe(src, src_len, dst, &dst_len); + return ret =3D=3D LZO_E_OK ? 0 : ret; +} + +struct zcomp_backend 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..5c1db65a38a4 --- /dev/null +++ b/drivers/block/zram/backend_lzorle.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZORLE_H__ +#define __BACKEND_LZORLE_H__ + +#include "zcomp.h" + +extern struct zcomp_backend backend_lzorle; + +#endif /* __BACKEND_LZORLE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 0d0d2e6dbaa9..58fb3ac91f4b 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -15,7 +15,14 @@ =20 #include "zcomp.h" =20 +#include "backend_lzo.h" +#include "backend_lzorle.h" + static struct zcomp_backend *backends[] =3D { +#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) + &backend_lzorle, + &backend_lzo, +#endif NULL }; =20 --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.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 9391948CC6 for ; Wed, 15 May 2024 07:17:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757426; cv=none; b=S9g3uxoL4iKKPo8PdiW4RDwCzGRcZVZ8yI2pV9tFHf/4myJtVcPp62sRBUMqwoL82PCNEXaKWhC/JzB4PSytJQNtapjOvP9sjrocqXJevJfMMAHHzP3/ldDTP611R8pS0iaZsDh1KZyNENQJp2sZoaH5qPtB4gftCLrwTTqtnYY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757426; c=relaxed/simple; bh=YnePQvm5yTrRFyDy+nrRta3ObTgqKOo4iqn1FqtURHk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bM6cak/y9wBS4JhB6vbXh+Jyrpnpx7n6zTwtApJlo49GTuCJ1oB/itllgLGBcbjCCzEjRgujY0haWURvpvPOcoc5zKu2QRhUeW23oZF51hmCj5AO0UqkrdlEP0/4OfOeA65a3iVTUptayiNbjjBqL8+Q7a6H89fYZUg9C7M9lf4= 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=Vw+WBCOZ; arc=none smtp.client-ip=209.85.214.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="Vw+WBCOZ" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1ec41d82b8bso61699925ad.2 for ; Wed, 15 May 2024 00:17:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757424; x=1716362224; 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=5y1JEx/byw+/lYPDinjRUJ1Lo0uZERSy7KI3xtlcbP0=; b=Vw+WBCOZaKo9SWdEdeLIPfENpcr8UAHjh3BRSzFyrj9WX2igxbRzDaDPXR/1kFESa4 ZKQ7sdIlW3SMwiPk8Tlz94WtGScKDAP7jWLTxCY59b1TySsQhU0ML7ZmZcTy+fOlXHK7 T34iemPWtcpVZxQWJemp/wtuUJR6DPepUVw/E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757424; x=1716362224; 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=5y1JEx/byw+/lYPDinjRUJ1Lo0uZERSy7KI3xtlcbP0=; b=Dfrn+LOo4HLk3dDFV37WmbWVeH7GYlkWauswOS1qYqY8J0zBF/Vb0TQlZogcSy7/Ef 5JUo6N3XeJEQ5fiTBvBrj++rA4nRQIz1amDuqPge1YMG697c6FUbWA1a+CN+p4iXghuG /LXbJ+RJuZ188SG4x0R5ehlq+Syf4/ueLtooClfh/cYYF94eqrUnIZni5t6V8DibBXa9 MgX9bThs7NNx96BRzzLLnOeHuRXuyfmoeAcLOuH0nTLiGu4gQYMdEeAYGRFQwx8+yuOG wkla+28j35Fm2DwvBEdTUXBoC72UiySjDzfaF3M8fpOy4tc5sd828EHm4IyNv3BpICJ9 c5zQ== X-Gm-Message-State: AOJu0YwJJru0dHXO80/lGBTv+71Cr3dWaTItURRlRPwr1GxqoBEtD8BI QCVpE4KdlUI9ZxN1sRfaiN273qWwhqbf+c4tblbnw4SiY0r2aHDHwUuNHsmomOUZf/yBpl/cHJM = X-Google-Smtp-Source: AGHT+IFpWjl6eRWiof5dtv+ykNbLzv4SU4wXOuUgvzR9ccRXR+//FCr7TGf87zxYfy5eESFA9z9pJw== X-Received: by 2002:a17:902:b111:b0:1eb:d914:64e4 with SMTP id d9443c01a7336-1ef43e25f72mr142390235ad.32.1715757423975; Wed, 15 May 2024 00:17:03 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:03 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 03/21] zram: add lz4 compression backend support Date: Wed, 15 May 2024 16:12:40 +0900 Message-ID: <20240515071645.1788128-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 73 ++++++++++++++++++++++++++++++++ drivers/block/zram/backend_lz4.h | 10 +++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 99 insertions(+) create mode 100644 drivers/block/zram/backend_lz4.c create mode 100644 drivers/block/zram/backend_lz4.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 5d329a887b12..f1e76fc8431a 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -20,6 +20,12 @@ config ZRAM_BACKEND_LZO select LZO_COMPRESS select LZO_DECOMPRESS =20 +config ZRAM_BACKEND_LZ4 + bool "lz4 compression support" + depends on ZRAM + select LZ4_COMPRESS + select LZ4_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -33,12 +39,17 @@ config ZRAM_DEF_COMP_LZO bool "lzo" depends on ZRAM_BACKEND_LZO =20 +config ZRAM_DEF_COMP_LZ4 + bool "lz4" + depends on ZRAM_BACKEND_LZ4 + endchoice =20 config ZRAM_DEF_COMP string default "lzo-rle" if ZRAM_DEF_COMP_LZORLE default "lzo" if ZRAM_DEF_COMP_LZO + default "lz4" if ZRAM_DEF_COMP_LZ4 default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 2a3db3368af9..567f4434aee8 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -3,5 +3,6 @@ zram-y :=3D zcomp.o zram_drv.o =20 zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c new file mode 100644 index 000000000000..6ea67511d782 --- /dev/null +++ b/drivers/block/zram/backend_lz4.c @@ -0,0 +1,73 @@ +#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, + unsigned char *dst, size_t *dst_len) +{ + struct lz4_ctx *zctx =3D ctx; + int ret; + + ret =3D LZ4_compress_fast(src, dst, PAGE_SIZE, *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) +{ + int dst_len =3D PAGE_SIZE; + int ret; + + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (ret < 0) + return -EINVAL; + return 0; +} + +struct zcomp_backend 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..a5fb5564835c --- /dev/null +++ b/drivers/block/zram/backend_lz4.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZ4_H__ +#define __BACKEND_LZ4_H__ + +#include "zcomp.h" + +extern struct zcomp_backend backend_lz4; + +#endif /* __BACKEND_LZ4_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 58fb3ac91f4b..902bdaf7e299 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -17,11 +17,15 @@ =20 #include "backend_lzo.h" #include "backend_lzorle.h" +#include "backend_lz4.h" =20 static struct zcomp_backend *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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2E1C4E1C3 for ; Wed, 15 May 2024 07:17:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757428; cv=none; b=FHnxVLkax5CTgQKpgSiwG7zkUpJ7V2GZcsS/goqEqGZIKC0YjTTLI1AzOYRtruVKFA7HoA6/DinFOeZ9oJam76NAHPQ5yXVzsd+DNThtd+FlF3K1Y5BNh8aWhcDC3GEH3odSd2HiFjw0j4bywzECTETkV6/EMiGrO9buPcSOWyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757428; c=relaxed/simple; bh=QIqKpR6W+iYpBKRdE8LyZOci6XU5F9QsGlMydzcKw90=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GOjIpW6KDxiNu+49WFKyBxuZkDJieOmI5LFZJNpDJSXbLwNB47TGJ5BhE0U8fbF9Eq/ri0/+eQcfZri5m3ElzfEt5CdnFNbrEslBtX5UhdGWB7OLHlaZyLAE0eRN0J01rO/mb6HkWRIQUp+/2a3Z9yu33cS+AAr46K97AMmadmQ= 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=TqKtLYPJ; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="TqKtLYPJ" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-1ecd3867556so50280145ad.0 for ; Wed, 15 May 2024 00:17:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757426; x=1716362226; 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=i/3U4lC6hcVdfnHTL8Mc0HJ1E1QNWG67FTnBC8OLuFc=; b=TqKtLYPJJzfGx3mpymohFTwUklUkkKIHSdVKWhJAsSz8aW4dOO+OaKam8x6KfC889x NLSXtm+OXQDkNaOmG0+PcXXlX6ca+RvBY7ej8nMVcNddFoGd/CNY5Tl1TQGv8BlWn/RN 1btDHINGL6t0k0+NDlPVD0D80Zvv9iIzl6og0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757426; x=1716362226; 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=i/3U4lC6hcVdfnHTL8Mc0HJ1E1QNWG67FTnBC8OLuFc=; b=GiWqxuTw/AcZPyiUVr+S9pGEiH3sWGNeOv8DkIAY/rr27dpfpEgxWcHuS63h83UFDb pa6Ng5NK6Yp2OOwgthERfJG1bj+iqKhMZoipTpaS1wWHaC2AkaB9+ImAwtzIcOgdWB7x d9lSUT4w4TA1KsINn1EdhTJgO5PUH4wgd/NbaHVhIirIjWqSounElRIL32J4HJXgTsJl 5bib6tfN1QHrtjYe5/+EuRMfeBIHdUSIjLVtOV09p3AAOKRvzdkHFr9GEi2+Gl9KB28j WvDXjWYUhHXidI0IyuHL3HXiYBUo8mOWvAIrmRAZpszRRyZ3Ha3YbxsWVuH/MHRR0Lc9 H3ig== X-Gm-Message-State: AOJu0YyLev6FO3se7S4xmp7g3QGTXR62RN7seXOCBU/PHmymo0mL5RLw CJezd1lB/PSRE1VMfk/giq9s3VSPI5GeWe+GXG0ab1jygQ9GbZUXfUbIRBzuwg== X-Google-Smtp-Source: AGHT+IFhFHm0P8O5jX9tenmwIWFZOdHgBJqiZN6RIu4mGkRSmngvUyxYc09i0GDOD/kiHYBPTyaQyA== X-Received: by 2002:a17:902:ec89:b0:1eb:58d2:8739 with SMTP id d9443c01a7336-1ef43d0a009mr183267855ad.3.1715757426418; Wed, 15 May 2024 00:17:06 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:06 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 04/21] zram: add lz4hc compression backend support Date: Wed, 15 May 2024 16:12:41 +0900 Message-ID: <20240515071645.1788128-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 73 ++++++++++++++++++++++++++++++ drivers/block/zram/backend_lz4hc.h | 10 ++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 drivers/block/zram/backend_lz4hc.c create mode 100644 drivers/block/zram/backend_lz4hc.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index f1e76fc8431a..0d890a8d2dc4 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -26,6 +26,12 @@ config ZRAM_BACKEND_LZ4 select LZ4_COMPRESS select LZ4_DECOMPRESS =20 +config ZRAM_BACKEND_LZ4HC + bool "lz4hc compression support" + depends on ZRAM + select LZ4HC_COMPRESS + select LZ4_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -43,6 +49,10 @@ config ZRAM_DEF_COMP_LZ4 bool "lz4" depends on ZRAM_BACKEND_LZ4 =20 +config ZRAM_DEF_COMP_LZ4HC + bool "lz4hc" + depends on ZRAM_BACKEND_LZ4HC + endchoice =20 config ZRAM_DEF_COMP @@ -50,6 +60,7 @@ config ZRAM_DEF_COMP default "lzo-rle" if ZRAM_DEF_COMP_LZORLE default "lzo" if ZRAM_DEF_COMP_LZO default "lz4" if ZRAM_DEF_COMP_LZ4 + default "lz4hc" if ZRAM_DEF_COMP_LZ4HC default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 567f4434aee8..727c9d68e3e3 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -2,7 +2,8 @@ =20 zram-y :=3D zcomp.o zram_drv.o =20 -zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o -zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c new file mode 100644 index 000000000000..9bcc5aa19a2b --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.c @@ -0,0 +1,73 @@ +#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, + unsigned char *dst, size_t *dst_len) +{ + struct lz4hc_ctx *zctx =3D ctx; + int ret; + + ret =3D LZ4_compress_HC(src, dst, PAGE_SIZE, *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) +{ + int dst_len =3D PAGE_SIZE; + int ret; + + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (ret < 0) + return -EINVAL; + return 0; +} + +struct zcomp_backend 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..29c428a850e2 --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_LZ4HC_H__ +#define __BACKEND_LZ4HC_H__ + +#include "zcomp.h" + +extern struct zcomp_backend backend_lz4hc; + +#endif /* __BACKEND_LZ4HC_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 902bdaf7e299..f04f5844a23c 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -18,6 +18,7 @@ #include "backend_lzo.h" #include "backend_lzorle.h" #include "backend_lz4.h" +#include "backend_lz4hc.h" =20 static struct zcomp_backend *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -26,6 +27,9 @@ static struct zcomp_backend *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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6C495103D for ; Wed, 15 May 2024 07:17:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757431; cv=none; b=CAzsdYsVFu81g8cmoeDf6tdIiq8pVvBEa4waIJXewm+oLdvij/JPBavjKQqFQ86YapuSHmvCn6Vu2JbuqFcT/qT4E3Crc9FGbu9VblTBewpS/h7nDVfUjkdtwFDw4mTw7SbJ5umSfhIeL2G88e5rzZk2fMUr+DjhUPrF4Am1iSw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757431; c=relaxed/simple; bh=qp4pzB90m9g55C+fAL/JlDtKkb1iY2MFD8dmhT5+bXM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mSnscgW8jhdIt6pynR9GrCIfR7uMNQlTA14Oy45Fbd2bsy2W5pMNZAlWgvb3Umgy05Ugj8BhJOp6OUey24N75yos1ifFRZHGmGkYmE4XDpYYYi+5/f/ZBkdjzmMgC4gNrbRVLqSUer3gI4qhRSDxzRA91Q1jdq1i7AdkxBeMVCk= 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=So7SAHfS; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="So7SAHfS" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-1eb24e3a2d9so57048935ad.1 for ; Wed, 15 May 2024 00:17:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757429; x=1716362229; 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=J/F4eHWC20T9jERmFYhVQI8aXCSk3r/5sAst+t3cPEA=; b=So7SAHfSG1tRJ+ZYNXTpChZVTSHS1gZDbC3+LlPMQowXPa+fKV+UZ135EB9+edEZgO CjNV2ZbhlxhReSr7BYkRM5wXAXbvTGV/VsWOyWctenZyWaBBQknbZFmQi1wo6He5vkTx vXOyJWOf+UU+GvLbFxaU6mfmr0BKCYtNO2GnE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757429; x=1716362229; 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=J/F4eHWC20T9jERmFYhVQI8aXCSk3r/5sAst+t3cPEA=; b=rB5y8ww5J2Pc0EW82JLgMlfsVxFfp+4g7L5rm6b/p8QqAMInfTv4FCshBX3lW72+Fz /ZRAcdd/F43yAY1u3mSXHss37McBcTiuIczOJ+USrWXUPUUuiGLw/DKtHRsDeBd+Ytdt LWVp9+9FNecjQjCi6q5J5B0pcEr3MGGlNyhVFunZzXTyQT5y6GOSnaSSpsMN/QFak9wa EbHfVHBkuc0p6g33NN7adt9lXBIPoc1e7Pd0H3w8b3/g4A3BHE2k/7K/i/c9tQ2M2iJ5 I7ZtwDPbb+l7VReYyn3HyKDvf4zoCc8cSuHct4hTvLcXl95dTu2bN4J46ZiE660ku+Zv /XBw== X-Gm-Message-State: AOJu0YyfCXNZwgLnGejeM7SCWH1TbrKAls73WeNg9psgPEi8v3MDbPB3 UO2zKA0pidDEUkToR3jmbYmi/6nECBeHTJEsfzhngykP9v7w3IlJP7uzO5qIvQ== X-Google-Smtp-Source: AGHT+IFR8beUNV/civmOKa/JzrQT21TYGy2xDo+9rfsbtHXdFVJDdpYHoSOshN3+CoSvN5XhewZdRA== X-Received: by 2002:a17:902:d64c:b0:1e3:e1d5:c680 with SMTP id d9443c01a7336-1ef4404e097mr174785415ad.63.1715757429001; Wed, 15 May 2024 00:17:09 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:08 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 05/21] zram: add zstd compression backend support Date: Wed, 15 May 2024 16:12:42 +0900 Message-ID: <20240515071645.1788128-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w zstd compression. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 ++++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_zstd.c | 97 +++++++++++++++++++++++++++++++ drivers/block/zram/backend_zstd.h | 10 ++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 123 insertions(+) create mode 100644 drivers/block/zram/backend_zstd.c create mode 100644 drivers/block/zram/backend_zstd.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 0d890a8d2dc4..71cd0d5d8f35 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -32,6 +32,12 @@ config ZRAM_BACKEND_LZ4HC select LZ4HC_COMPRESS select LZ4_DECOMPRESS =20 +config ZRAM_BACKEND_ZSTD + bool "zstd compression support" + depends on ZRAM + select ZSTD_COMPRESS + select ZSTD_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -53,6 +59,10 @@ config ZRAM_DEF_COMP_LZ4HC bool "lz4hc" depends on ZRAM_BACKEND_LZ4HC =20 +config ZRAM_DEF_COMP_ZSTD + bool "zstd" + depends on ZRAM_BACKEND_ZSTD + endchoice =20 config ZRAM_DEF_COMP @@ -61,6 +71,7 @@ config ZRAM_DEF_COMP default "lzo" if ZRAM_DEF_COMP_LZO default "lz4" if ZRAM_DEF_COMP_LZ4 default "lz4hc" if ZRAM_DEF_COMP_LZ4HC + default "zstd" if ZRAM_DEF_COMP_ZSTD default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 727c9d68e3e3..a2ca227e199c 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -5,5 +5,6 @@ zram-y :=3D zcomp.o zram_drv.o zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o +zram-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c new file mode 100644 index 000000000000..bfe836844232 --- /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, + 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, PAGE_SIZE, ¶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) +{ + struct zstd_ctx *zctx =3D ctx; + size_t ret; + + ret =3D zstd_decompress_dctx(zctx->dctx, dst, PAGE_SIZE, src, src_len); + if (zstd_is_error(ret)) + return -EINVAL; + return 0; +} + +struct zcomp_backend 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..75d2d2c02768 --- /dev/null +++ b/drivers/block/zram/backend_zstd.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_ZSTD_H__ +#define __BACKEND_ZSTD_H__ + +#include "zcomp.h" + +extern struct zcomp_backend backend_zstd; + +#endif /* __BACKEND_ZSTD_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index f04f5844a23c..c16eb038f608 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -19,6 +19,7 @@ #include "backend_lzorle.h" #include "backend_lz4.h" #include "backend_lz4hc.h" +#include "backend_zstd.h" =20 static struct zcomp_backend *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -30,6 +31,9 @@ static struct zcomp_backend *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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D380E55E5B for ; Wed, 15 May 2024 07:17:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757433; cv=none; b=ddnO6sJwZWdlVBMXJbZMXNEQnF4ENkiZkY09mP2Zza7myt5w60whZo9VUu9KuMHZggDs9bZ4IyxQPmTHULKIxMcOdg7xedMN0ssazGfBLwTLRvocDF2vuQPkiefxvSRv7/8SuRBzfk05Uyc9t09dqpMeUvmqrlDHMa+wPriao74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757433; c=relaxed/simple; bh=NfNIjYe0R8m8g+PZ0SlYD1aU6GoRy1xQlpR4Iu21ap4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XBFOjIOgPSkes+a5gROXPkEd7mi+7xJaZ/vaKfg98e2jb2KwhKBuXRMZfGFOgqJdLPfOmQ5i/gC6NcIIw8z/kUJ0dO/C5JHeREwga20yxO9PHG6K+ERKqBdcZnS04Us+qz3GQoU50/VVa7MxKtperBUWSmmamdaZ3cjoJh98Pso= 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=CN5XvkMc; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="CN5XvkMc" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-1ecc23e6c9dso43073755ad.2 for ; Wed, 15 May 2024 00:17:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757431; x=1716362231; 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=CKysrwqZlMwVUU8fiuTWrWkRyKYxV6Zxfm3TNnO+6jg=; b=CN5XvkMcvsVZxxf/c50nuKiByew5wDs3YGQ6sG59SAfQ+WqRBaSSgVOkXyaA1t7TED rrvS5DwDzzubQ6VDyEvHG36glPUI//4McE/8PspWacnWMiQgSW2ZuEgj/O6CKZW+bg6/ WE64SRs9ojutSPlsnVY5+y63jm0r3KUASLlXg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757431; x=1716362231; 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=CKysrwqZlMwVUU8fiuTWrWkRyKYxV6Zxfm3TNnO+6jg=; b=vMlwxVr27P2Z9EU+BjShg96DEbESixTB+aoWVaqJJ/cUbM9ijmluZwe+0jxy87CjTB EbuvA5wRs6z2icWdAt76dfuewfiHypMlEighWKWnmcn72NTseUXiSZTqxUf5J3CJVlx8 AiqJRcfRVJ/qlrRP7qqDM2AfOa96cqSQHQVQmQ26NFqQcUlQFrRjGGesewdkHCo+LLKf zSP2hWdRcNUWLeN0MoeeAJjYG8X39ER6si3fTpjDW8O4QwXzi/R+6F5A+wKVU6lGEjH1 eYw8qWph/4gV15k4ldFnP7v6KSBHRUoATnr5BtY+B6iGxwIhCv2ia6TWujSpSMFpcHA7 +EFg== X-Gm-Message-State: AOJu0YxA+7icKc3Z8erJM7OsAfT0HOi2iGROCG9RwDofO4Xq0XGgnuxL lr85E5afOcyX7r5mOaJ7T6AoKw690NtLtlQxdMuv4vdppPSTKhcI5e8PXUPnFQ== X-Google-Smtp-Source: AGHT+IGDnOeAF1FL804TtRjppmHScnFvlydpSaTIsnO+VLF+Nn6sN4yHuLdVS3qjMSH7/M91C1F0BQ== X-Received: by 2002:a17:902:c145:b0:1ec:659c:95fb with SMTP id d9443c01a7336-1ef43e25e5cmr138560735ad.32.1715757431472; Wed, 15 May 2024 00:17:11 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:11 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 06/21] zram: pass estimated src size hint to zstd Date: Wed, 15 May 2024 16:12:43 +0900 Message-ID: <20240515071645.1788128-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 bfe836844232..f930e9828be2 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, 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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCC3259B68 for ; Wed, 15 May 2024 07:17:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757436; cv=none; b=bkhHF3SbZ2k8wMR+CziE2LefdJuoExl6cpAk4I1Y1iPmt0xf+ie4g5eMIB+/L+aF8a3beh5TFSr1Y/fFn4VhpAs4J8CTGnDsffiQHVm+xqe481TfxSkOIodTJbikvy1rNcFYZD9mVaxQ7Ab6rlalgqPNMEY1iTM6MrimcWLIk/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757436; c=relaxed/simple; bh=KCnNcRrdNNXPCLyOiCquIu29kMdtXA8DR2xEEGBW8rU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Py2cWa2B59pw29e4bNSTFMDMA4EwmqxCbpp2aSw2qu+QX3KVBWs742d524Qtx9gWXnp6vwQoeQRIGhJ9YEPbdRmUaZUPdrErvep04TfQrx3Lq8brRSYEz9Mc2IVc2FYwkVbVS89pdctXuWGoXJUnXgUvyhZh+KuodA2GLoeyDxw= 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=m4Rm2UYo; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="m4Rm2UYo" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-602801ea164so4516786a12.0 for ; Wed, 15 May 2024 00:17:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757434; x=1716362234; 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=y95jRkO+GQnVvfMlitMFd5UTtBybaGLJy7YbFRNgOjw=; b=m4Rm2UYo6OPV4yeac4SynDYQZwAT0/5Vvw0IAJLs0ajQf8rKDf5L5wbOpXKnfpTYN1 n9OvV2v+Z8+JO0LkoxZD6q07sMR2TziMr3pNvPJWJQdbmFp2Cz3GT9KcB1eiWq/dHYO/ NidIxRqBxDXe0h+jRSM/KrblHlVZjza1ae+rU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757434; x=1716362234; 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=y95jRkO+GQnVvfMlitMFd5UTtBybaGLJy7YbFRNgOjw=; b=mcaORn/UYdM1lEEdrDZwiXKAKknT13qOIuT/LX9HGkBYRK22a5g4Awc54EFxySK+uC hpDIUlEVg64Em7b5KoUWlMs8ya03Pq4vm7CDfHdgHjgDxEshcesy5mgb50A5w1DIHRv4 qtYdawirOdMfuND8e7gYWe5YwebDGXK/OTWiTMYqP4YVnsqNZrelAEwIe7d1R4k6WUWc tBbLC7xs1VE6QWl5AdatnOUmmsYH4DG/J9Qqn0BLIvVhfZ3OJzMWvsetEfesAD+30H+n /cUzE5ncCo52cSEWfM2NyA3OZzqNFolRpPxYxVt1j1BqE9ylZIHvDX8qiGvwdJQyXOzF 8Zvw== X-Gm-Message-State: AOJu0YwlSYN22pflzn0+wPtaAp5P2+ojnVfd5AOGT4ax/vs1/DTeB72r u4o8hYAnAPXHApW7WqcgwzEIplLWoXzx8A6WDGTIkav6b8vbulAljiOk3qJyiF6uJkHAd8dlZ0k = X-Google-Smtp-Source: AGHT+IFLzF62if52qJ1KBXdicGFtIwJvmc9KJjo8zwyiW54iJHmUAuxAjnUDL7j7CHzBCzunheLUcg== X-Received: by 2002:a05:6a20:3d84:b0:1a9:84f6:dcb6 with SMTP id adf61e73a8af0-1afde1d91dfmr15784036637.57.1715757434238; Wed, 15 May 2024 00:17:14 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:13 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 07/21] zram: add zlib compression backend support Date: Wed, 15 May 2024 16:12:44 +0900 Message-ID: <20240515071645.1788128-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 130 +++++++++++++++++++++++++++ drivers/block/zram/backend_deflate.h | 10 +++ drivers/block/zram/zcomp.c | 4 + 5 files changed, 156 insertions(+) create mode 100644 drivers/block/zram/backend_deflate.c create mode 100644 drivers/block/zram/backend_deflate.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 71cd0d5d8f35..9dedd2edfb28 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -38,6 +38,12 @@ config ZRAM_BACKEND_ZSTD select ZSTD_COMPRESS select ZSTD_DECOMPRESS =20 +config ZRAM_BACKEND_DEFLATE + bool "deflate compression support" + depends on ZRAM + select ZLIB_DEFLATE + select ZLIB_INFLATE + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -63,6 +69,10 @@ config ZRAM_DEF_COMP_ZSTD bool "zstd" depends on ZRAM_BACKEND_ZSTD =20 +config ZRAM_DEF_COMP_DEFLATE + bool "deflate" + depends on ZRAM_BACKEND_DEFLATE + endchoice =20 config ZRAM_DEF_COMP @@ -72,6 +82,7 @@ config ZRAM_DEF_COMP default "lz4" if ZRAM_DEF_COMP_LZ4 default "lz4hc" if ZRAM_DEF_COMP_LZ4HC default "zstd" if ZRAM_DEF_COMP_ZSTD + default "deflate" if ZRAM_DEF_COMP_DEFLATE default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index a2ca227e199c..266430548437 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -6,5 +6,6 @@ zram-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o back= end_lzo.o zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o zram-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o +zram-$(CONFIG_ZRAM_BACKEND_DEFLATE) +=3D backend_deflate.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c new file mode 100644 index 000000000000..949d402ea3dd --- /dev/null +++ b/drivers/block/zram/backend_deflate.c @@ -0,0 +1,130 @@ +// 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, + 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 PAGE_SIZE; + 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) +{ + 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 PAGE_SIZE; + + ret =3D zlib_inflate(inflate, Z_SYNC_FLUSH); + if (ret !=3D Z_STREAM_END) + return -EINVAL; + + return 0; +} + +struct zcomp_backend 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..49cef8fc1e77 --- /dev/null +++ b/drivers/block/zram/backend_deflate.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_DEFLATE_H__ +#define __BACKEND_DEFLATE_H__ + +#include "zcomp.h" + +extern struct zcomp_backend backend_deflate; + +#endif /* __BACKEND_DEFLATE_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index c16eb038f608..9fc5477a6259 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -20,6 +20,7 @@ #include "backend_lz4.h" #include "backend_lz4hc.h" #include "backend_zstd.h" +#include "backend_deflate.h" =20 static struct zcomp_backend *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -34,6 +35,9 @@ static struct zcomp_backend *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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.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 7EEDA5BAC1 for ; Wed, 15 May 2024 07:17:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757439; cv=none; b=dHYRL8u5UavhzOTuLUjySADW2zsYqhNMCI+08pgk/0fGFTbzNOqQhfCde5ItIHxEoCaTn2v10CYtAoIm783kumla1PobkQP9+BHAgb2VxXWCLWrNR1m6+dniRvKgSI7slQ9+KIq2QOr18oUYBEj2H7gqNPKCkFdkBmLaeZyGRzQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757439; c=relaxed/simple; bh=a+rQHeyHWJr5E88fLAaNVtGpfAm1FcfbIk5kcHXBMNA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bgUSj7ViCeX77l3bsf8SD1kf1Zl93nLVESqYnRfaqZXQ2rU/S79w/YWmBoyjmSuL/tUVYF/tQinbLlNFhn4fy+nXOMXsrV835oAH0KVF6Nq4fWbyYsggu+yIrkop++KFRgiDUKJxWWzjkNDI2asPOy1WwHt+8Qur8GdVWBADMms= 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=lJ+dQfGo; arc=none smtp.client-ip=209.85.214.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="lJ+dQfGo" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1eb24e3a2d9so57050095ad.1 for ; Wed, 15 May 2024 00:17:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757437; x=1716362237; 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=R1BvSeNbTbBx82yan2V/RhWZavK2/Nwn3AwN6PoYkyI=; b=lJ+dQfGoknPf202DLVf0jTPVBcrR/7DNOXRUXwWsOokvW/u7EuVnY4BSJBtkugtJal W/vi8b/waDV2pZZdsTq7tQ1fwnxgBRQRpJa968Tx4lpkJ3N5/q2Bv0OFg1+r1G7gxSh9 mM55uHd8l3Ihr2n7khEHvDJUaZg0kBh6vCql0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757437; x=1716362237; 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=R1BvSeNbTbBx82yan2V/RhWZavK2/Nwn3AwN6PoYkyI=; b=lCno1HyEB24RNXDjXG6U5DY7vRsbt1Z8+9K+X1weSC/l62hEG4HXzKLDXDNivjSVA2 qQYZglquu4MX/A+/Uz/OKYC5dwo6ddOxnm141rq+GE3h9zcc6lJSk3QWfTvSOzedp3QZ /jR/W4mD6+V1dH1SEQz/OQJ1AZxn5GvUuzD5i6wiK3W5/8F16aOlFcY5OFqIVV0YvtrO w7KFGs/v5g8zPjif6zF8M8f0tZfCcLkTQJBPqPdGNZL8yS1kyExTEaD1bdEhMcZ/1zjM HJ7nCXn91LCiUvLouGL3snDB7kvg43jKJEGlTTsIfnbH1ZAMUTh7c4qsdmzXmcY4U7Ws BQEA== X-Gm-Message-State: AOJu0Yz9dHFYGZ4xTXoB1ctoCQJAiCKv9AlFGmplRtCx60xOgBj3JgB7 MADiXFC7jxfnzNYfQ+2Pxs8efwoBS24WCgrjJGWNtiuN15WM/a8MPIMSNpY1bw== X-Google-Smtp-Source: AGHT+IHl9yzwzSALZfi0o/HPHNzCxu6wZ+RNh+cMmfX5oJ73uVNFYO9l4NG6YzfeqIT88y6WcZ1L0A== X-Received: by 2002:a17:902:e74a:b0:1e0:2977:9dfc with SMTP id d9443c01a7336-1ef43f4ea08mr235269795ad.55.1715757436880; Wed, 15 May 2024 00:17:16 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:16 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 08/21] zram: add 842 compression backend support Date: Wed, 15 May 2024 16:12:45 +0900 Message-ID: <20240515071645.1788128-9-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add s/w 842 compression support. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 11 ++++++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_842.c | 68 ++++++++++++++++++++++++++++++++ drivers/block/zram/backend_842.h | 10 +++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 94 insertions(+) create mode 100644 drivers/block/zram/backend_842.c create mode 100644 drivers/block/zram/backend_842.h diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 9dedd2edfb28..1e0e7e5910b8 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -44,6 +44,12 @@ config ZRAM_BACKEND_DEFLATE select ZLIB_DEFLATE select ZLIB_INFLATE =20 +config ZRAM_BACKEND_842 + bool "842 compression support" + depends on ZRAM + select 842_COMPRESS + select 842_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -73,6 +79,10 @@ config ZRAM_DEF_COMP_DEFLATE bool "deflate" depends on ZRAM_BACKEND_DEFLATE =20 +config ZRAM_DEF_COMP_842 + bool "842" + depends on ZRAM_BACKEND_842 + endchoice =20 config ZRAM_DEF_COMP @@ -83,6 +93,7 @@ config ZRAM_DEF_COMP default "lz4hc" if ZRAM_DEF_COMP_LZ4HC default "zstd" if ZRAM_DEF_COMP_ZSTD default "deflate" if ZRAM_DEF_COMP_DEFLATE + default "842" if ZRAM_DEF_COMP_842 default "unset-value" =20 config ZRAM_WRITEBACK diff --git a/drivers/block/zram/Makefile b/drivers/block/zram/Makefile index 266430548437..0fdefd576691 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -7,5 +7,6 @@ zram-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o zram-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o zram-$(CONFIG_ZRAM_BACKEND_DEFLATE) +=3D backend_deflate.o +zram-$(CONFIG_ZRAM_BACKEND_842) +=3D backend_842.o =20 obj-$(CONFIG_ZRAM) +=3D zram.o diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c new file mode 100644 index 000000000000..8ea7a230b890 --- /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, + 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, PAGE_SIZE, 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) +{ + unsigned int dlen =3D PAGE_SIZE; + + return sw842_decompress(src, src_len, dst, &dlen); +} + +struct zcomp_backend 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..c03a2396d7b2 --- /dev/null +++ b/drivers/block/zram/backend_842.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BACKEND_842_H__ +#define __BACKEND_842_H__ + +#include "zcomp.h" + +extern struct zcomp_backend backend_842; + +#endif /* __BACKEND_842_H__ */ diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 9fc5477a6259..2a38126f4da3 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -21,6 +21,7 @@ #include "backend_lz4hc.h" #include "backend_zstd.h" #include "backend_deflate.h" +#include "backend_842.h" =20 static struct zcomp_backend *backends[] =3D { #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) @@ -38,6 +39,9 @@ static struct zcomp_backend *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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.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 146635F47D for ; Wed, 15 May 2024 07:17:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757442; cv=none; b=ecYdz3gbDhrUkL7tWEaw3C67wFIiYP9XadNBP7D6lCOd+f+wv4Qmqw8vagVYjtvGRdKVUde45BlTG8jbxSwnv4VJp+wuDtIrzYvDftaabGAMuYt6TzszLhl3hCEr5jVUVoOvaKfO5YoDjnOQmvCCQP2P3XHRKqJFjXhuK8z0DaY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757442; c=relaxed/simple; bh=fkmGnp5H4sYk5AcEucbfVYS4PjNz7ma3EYQ0ecKZnDQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jLPXX3HKDFmyJAwelmpFxprrQm81SxsMK+A679ObErPNTu3GFahfk0PK7cBtZwxFtKPspRWGOR19iKs1GkQQmcJHiaaZpkXNAzxP+tHhAKzFr4oFARSG778SKK9ePJQPGHHJV2l8iLqvEzGBSpZGdIJyvlvOSbjsjEzQP6RsUFc= 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=XOXQbRcc; arc=none smtp.client-ip=209.85.214.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="XOXQbRcc" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-1ed0abbf706so47979145ad.2 for ; Wed, 15 May 2024 00:17:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757439; x=1716362239; 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=0eIYrOQ3BkMXJCk6zuaDE2ECawMW63bMTlaOVOjCrZU=; b=XOXQbRcc/5Eftf81qGGiSFwKljbAd4Yaidd1Ll+OYJc1YSaOujkIsUt95xcblTUgGa V+P41TKB3jvve5g/CeVM5fTaP+t/MKEeA0RT2uJbXUSzOVHZVgd4zCVkX4ygALurVlqO 1SLZeoSzKdm7kodbWBX5OvYelcO4/ssndEb50= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757439; x=1716362239; 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=0eIYrOQ3BkMXJCk6zuaDE2ECawMW63bMTlaOVOjCrZU=; b=iihMZbhxOJnEsPKIw3SaINnB4koulYEvXprnDSeJbeDu0cM0JGcmsnfNSzyTPzTbdj q7TQffQ/bmCuusZHrqe939Io5kSuqtMHofnckLGA+4jz7vIcaurNLONfGR6QG3e5n0EY w1mkcRanf1Vv1fIoJRuicxJ97pfH9LE23AIJoFQKSpvB0cWBMp71TuYhKD4v4tMQ4SLB 0AvndRZrg3PSePPpu1Y54IC1hsrkSWWpk5RNOIShMs1wjW0T2YDRFPdtlh3KILJsuoIp zhvbOyLdLwJZ1k2qjDLEnl68xE5X1KBeDoF7F1hCa5llvkPlocQowB2FEqN2YoE+eZtm t3dw== X-Gm-Message-State: AOJu0YyWhjhFcryy3Q6msxwyXg6m1aHXRxWb747jI5Gs/ar7MjoXZH9U 7O83yxQsprLUPT8x8q/0Yytet3x9jNa0Qox/UMoUVd8ekm439Vdc8dfTo13APg== X-Google-Smtp-Source: AGHT+IFvQPQbFdswaG8pKMdD1k7IMUK032+vZt0K46ITPMQuokgurkpbNqiMOKMg6mMbkrns6C8dzQ== X-Received: by 2002:a17:902:bcc4:b0:1ee:c491:ab62 with SMTP id d9443c01a7336-1ef43d2ea47mr134926055ad.25.1715757439167; Wed, 15 May 2024 00:17:19 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:18 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 09/21] zram: check that backends array has at least one backend Date: Wed, 15 May 2024 16:12:46 +0900 Message-ID: <20240515071645.1788128-10-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make sure that backends array has anything apart from the sentinel NULL value. We also select LZO_BACKEND if none backends were selected. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 19 +++++++++++++------ drivers/block/zram/zcomp.c | 8 ++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 1e0e7e5910b8..6aea609b795c 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -14,12 +14,6 @@ config ZRAM =20 See Documentation/admin-guide/blockdev/zram.rst for more information. =20 -config ZRAM_BACKEND_LZO - bool "lzo and lzo-rle compression support" - depends on ZRAM - select LZO_COMPRESS - select LZO_DECOMPRESS - config ZRAM_BACKEND_LZ4 bool "lz4 compression support" depends on ZRAM @@ -50,6 +44,19 @@ config ZRAM_BACKEND_842 select 842_COMPRESS select 842_DECOMPRESS =20 +config ZRAM_BACKEND_FORCE_LZO + depends on ZRAM + def_bool !ZRAM_BACKEND_LZ4 && !ZRAM_BACKEND_LZ4HC && \ + !ZRAM_BACKEND_ZSTD && !ZRAM_BACKEND_DEFLATE && \ + !ZRAM_BACKEND_842 + +config ZRAM_BACKEND_LZO + bool "lzo and lzo-rle compression support" if !ZRAM_BACKEND_FORCE_LZO + depends on ZRAM + default ZRAM_BACKEND_FORCE_LZO + select LZO_COMPRESS + select LZO_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 2a38126f4da3..d49791f724e9 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -209,6 +209,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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.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 3FCB044376 for ; Wed, 15 May 2024 07:17:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757444; cv=none; b=MS5R5B3a2IxkVIOsCppWgR76KPdjgXsQp6xdRPCPEBUYr+YMRlxRFgh+aaf/A0RY0soMpqvfN3W3f3y4MYNHzJ+fB7VRQKCAigk/4EoFoO33vaaGpTT72HjaFTo4Lxu6+JhudGayc+5k8mC7+1vUOmA0fNmLF5ACPigu+KlDDg0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757444; c=relaxed/simple; bh=4TR3qcfJHoDHqbXJJ3W7Q7XPODavCGAvmdqEyE6Irws=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fX1H+f30irZYkPoTpAAVUeDEculjxUrhw/CXhM95Id33wpD/ox7TO2WOxu56yY6c8qPadXObjtMWOytda21/N8Z8zA/hy42nIhEKcoICmdH2p0Z8QK4NBil54rsivg+mcQL7msITLHk7q//15axA214uWQRfnvRg0NnNAaFTieg= 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=dWpMaU/J; arc=none smtp.client-ip=209.85.214.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="dWpMaU/J" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-1eca195a7c8so53255235ad.2 for ; Wed, 15 May 2024 00:17:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757441; x=1716362241; 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=ylr3jp2oOM/Qv+5Rzo3O/r/CyrGBpC7ZOv+1y6H5M+s=; b=dWpMaU/JxykJog3Lv39wkauy1UVePPOWA8BXNLl7PIXEI4T9Cwf8xduBL9e/DlJqiN QFfwNC3WKKOpM3eHdpvrWcAu8ndRU+mw9VuOcyRt+0zV4gwVJz3+31Cbq/9w1T/YxN3v HnabcnyAKGWBmN+F0zfYx1ht4xrLkE66fcLKo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757441; x=1716362241; 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=ylr3jp2oOM/Qv+5Rzo3O/r/CyrGBpC7ZOv+1y6H5M+s=; b=lLeUK2AZzIOeR4VoqCprbfIhs28DBn+XqE4KeA5fUfXJqgtuCC62YYU4zJTFMlUbAt jVZsFF8to+37/NADti3Syzq0ASrqrmNt+x7wO7js+kBorzKl4ETf6aMdvHcvcF4GhUIy bedF3QTNA7i/9JAmhMKyW6fjh19J+fLj8NrLMJVgHWxfkF9mnvVR7b7RAHgn/+P8jtXk uX4WuROHZjq+EY5gxrUFhBgtaf5rqJuc2C1i3NzCzehdnXQh245dOm1Y3xnUY5nKdvGG /7Q6DhYZImbyW2HZdm0ENZzHqbviE8+Bk9w8Zcj2Fl9obADXz7EzjVLExHvC7sCkaR1h KyUA== X-Gm-Message-State: AOJu0YxqqDWb2uD+dXW4+7setq8vkqoHj4XxpXBmzKf0SzGbuDJ6VZ8+ Y543CQuT4ogzjVE2CJMzYP9c9wGIIuoMXEL0uXB0AxsnKdW8tCSag+lGB09jLA== X-Google-Smtp-Source: AGHT+IEuqUbMH1dVaUqG9mvERkiQ2Ee7dAVCVB672+cKA0XgZvskGuWFwOFiCoOhsDXfHUCvCcgHYA== X-Received: by 2002:a17:903:984:b0:1eb:7746:4248 with SMTP id d9443c01a7336-1ef440495abmr176193975ad.54.1715757441574; Wed, 15 May 2024 00:17:21 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:21 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 10/21] zram: introduce zcomp_config structure Date: Wed, 15 May 2024 16:12:47 +0900 Message-ID: <20240515071645.1788128-11-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 8 ++++++-- 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, 62 insertions(+), 19 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 8ea7a230b890..12e716deb763 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_config *config) { struct sw842_ctx *ctx; =20 diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index 949d402ea3dd..83c660adc722 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_config *config) { 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 (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) + ctx->level =3D config->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 6ea67511d782..df0753fd8180 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_config *config) { 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 (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) + ctx->level =3D config->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 9bcc5aa19a2b..2f03ca5809c7 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_config *config) { 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 (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) + ctx->level =3D config->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 b88b408964cd..79ecfae9c4c5 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_config *config) { 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 9bf1843021b0..b0937103b5fb 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_config *config) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); } diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index f930e9828be2..d392d364ad2c 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -24,7 +24,7 @@ static void zstd_destroy(void *ctx) kfree(zctx); } =20 -static void *zstd_create(void) +static void *zstd_create(struct zcomp_config *config) { zstd_parameters params; struct zstd_ctx *ctx; @@ -34,7 +34,11 @@ static void *zstd_create(void) if (!ctx) return NULL; =20 - ctx->level =3D zstd_default_clevel(); + if (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) + ctx->level =3D config->level; + else + ctx->level =3D zstd_default_clevel(); + params =3D zstd_get_params(ctx->level, PAGE_SIZE); sz =3D zstd_cctx_workspace_bound(¶ms.cParams); ctx->cctx_mem =3D vzalloc(sz); diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index d49791f724e9..3f990a715487 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -61,7 +61,7 @@ static void zcomp_strm_free(struct zcomp *comp, struct zc= omp_strm *zstrm) */ static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm) { - zstrm->ctx =3D comp->backend->create_ctx(); + zstrm->ctx =3D comp->backend->create_ctx(comp->config); =20 /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the @@ -204,7 +204,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_config *config) { struct zcomp *comp; int error; @@ -221,6 +221,7 @@ struct zcomp *zcomp_create(const char *alg) if (!comp) return ERR_PTR(-ENOMEM); =20 + comp->config =3D config; comp->backend =3D lookup_backend(alg); if (!comp->backend) { kfree(comp); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 757b85017e23..345c78bc76db 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -5,6 +5,7 @@ =20 #ifndef _ZCOMP_H_ #define _ZCOMP_H_ + #include =20 struct zcomp_strm { @@ -15,6 +16,14 @@ struct zcomp_strm { void *ctx; }; =20 +#define ZCOMP_CONFIG_NO_LEVEL INT_MIN + +struct zcomp_config { + s32 level; + size_t dict_sz; + void *dict; +}; + struct zcomp_backend { int (*compress)(void *ctx, const unsigned char *src, unsigned char *dst, size_t *dst_len); @@ -22,7 +31,7 @@ struct zcomp_backend { int (*decompress)(void *ctx, const unsigned char *src, size_t src_len, unsigned char *dst); =20 - void *(*create_ctx)(void); + void *(*create_ctx)(struct zcomp_config *config); void (*destroy_ctx)(void *ctx); =20 const char *name; @@ -32,6 +41,7 @@ struct zcomp_backend { struct zcomp { struct zcomp_strm __percpu *stream; struct zcomp_backend *backend; + struct zcomp_config *config; struct hlist_node node; }; =20 @@ -40,7 +50,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_config *config); 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 38afc2c23108..75ecdb885d91 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_configs(struct zram *zram) +{ + u32 prio; + + for (prio =3D 0; prio < ZRAM_MAX_COMPS; prio++) { + struct zcomp_config *config =3D &zram->configs[prio]; + + vfree(config->dict); + config->level =3D ZCOMP_CONFIG_NO_LEVEL; + config->dict_sz =3D 0; + config->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_configs(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->configs[prio]); if (IS_ERR(comp)) { pr_err("Cannot initialise %s compressing backend\n", zram->comp_algs[prio]); @@ -2256,6 +2273,7 @@ static int zram_add(void) if (ret) goto out_cleanup_disk; =20 + zram_reset_comp_configs(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..c3c7475d6517 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_config configs[ZRAM_MAX_COMPS]; struct gendisk *disk; /* Prevent concurrent execution of device init */ struct rw_semaphore init_lock; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.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 8D16D46424 for ; Wed, 15 May 2024 07:17:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757446; cv=none; b=siUYfTuTx2o3noe/YEWKtjJ5uaLlL06UyAAWfMBApZlLJI4DLfoImp2AUPV2VEJldGD4F7nxjbcR+/3kVQjBSTpbcpUDuPp3R2l19+gW0G+KE70FHIO5JsvWXik2Yh2bYcvSHLQscgyEK7M6yM31bpGYk117yPvEnKJJwBFxSY4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757446; c=relaxed/simple; bh=YnHUtLMZwpVLI0sVuuwwM6o13HO9vMtZxnKMkrUR/KQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q8yAx2i7V3jL7gZ6CjhdNFohi0+xDnftPn8YEeE9bexwYq1w7lZlbb0Jt5oqRGsNSN8jzEkpoaZEZTS4z76cf+f2M5RJQzzZmiDm0hZrgPh+RZ1f1U+ZHBV17M1SdA9MmCIc7EK1uhXH96tzKgrwmCJWj/NNTK51vm/3fJFosu0= 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=LO5Z3Q9t; arc=none smtp.client-ip=209.85.214.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="LO5Z3Q9t" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-1ec486198b6so49882595ad.1 for ; Wed, 15 May 2024 00:17:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757444; x=1716362244; 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=EKVs+B+0cyVVZhjjQw1NRD02y131beAoNCpGUQE22Zo=; b=LO5Z3Q9tbMtRLgU4hrriUYiXGWQbatUGRHUqdFQ8GmElEulIilhJdczdqhlD7j24r3 Wg/vfrFw+2UCMJ192IWDIvfpG+JpW2wvHIka38x8ZEDgoMHGJpXMTOQjr61At/weeEUp M46cAzb6F+/xfEPCrEstxU8oArfne0fJ2p8As= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757444; x=1716362244; 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=EKVs+B+0cyVVZhjjQw1NRD02y131beAoNCpGUQE22Zo=; b=SoyS/zzTXh/isNh10b4C0ZXkkh/KIJ42NFPsKfU599lIniYibUw70Zb4SkhRNG1Rp/ OUPi+hriPjUOD+peJ4lB60LJLfIB4geVuZ97evENJF90wKuWT8jJqxJotyqfdlUpxDcE 7TUJgBZTzJMIIYHyEnuiJsS5l1MeZMaB22zKifMFSdGCHuCGg5pb8sVDSc1IBEkB06/C xC4SL5HyBuUCnoqKTV46RigR5p6bOBKS35FbLKWU6JQ0hyXXOxPxeQ6FILRThJGF7Z/K qj4WDNK0ctrIOw1xpYWoylqPFnscsFAmIgwRg1/Bq3NdeM1JKoIIbIziV9F/DXFoeulN T5Uw== X-Gm-Message-State: AOJu0YxIXo+iSTjVSlBSD5a0/NMtcr3FkgbZqN6JXYG2EGYXv2QiMR6T IREZXU+VlmYBIz8TqIEAAdHxNQc1uzcrzFy/1ppNFI56Ox4PRhRcdyWDAHQ02A== X-Google-Smtp-Source: AGHT+IE8qiXvQd9erZoKg5Z5UhnAOTEuylXJnZ57+lB5IHA55FEIIAx2uTY4ujRkG+u9767ycaP2LQ== X-Received: by 2002:a17:902:cec3:b0:1ee:b23b:ad5 with SMTP id d9443c01a7336-1ef43d2e1e8mr177002205ad.5.1715757443909; Wed, 15 May 2024 00:17:23 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:23 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 11/21] zram: extend comp_algorithm attr write handling Date: Wed, 15 May 2024 16:12:48 +0900 Message-ID: <20240515071645.1788128-12-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 75ecdb885d91..7eb500c8fdaa 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1013,9 +1013,33 @@ 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; 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 (!alg) + return -EINVAL; + + ret =3D __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); return ret ? ret : len; } =20 --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D6B345BAFC for ; Wed, 15 May 2024 07:17:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757448; cv=none; b=NPwrBJHKV8nuSHBCeYo7RJoYyE+ao6xHgkGEsxhw+flxM2+PJj+w3xh6cIpkgRMeaqMUk/WAN6jqv4Vz2SGrwiO5UrYml9vPPBxilfBRQvITy0AmT02b7OdaGAxKu7zCNXnMMGVy7NvQeXc54nADSfFw4m8U+xnBEuCG6ElbHkY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757448; c=relaxed/simple; bh=NSsCiPGcIxF0zOQ6vdufDUaR67+LlToiDZLTG5tQTr0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EKQlHEldBCGjZF8Vc0Wfk7+KattgRp7FXzEI5I44DzPh+HYg2Nzf2pAR7yX4u3N4WjYOncpl+ulEU6oI789sUOLIQZ5mfd6OoyNEeDBxIIsi00+/1NlkhP5Tcg555rZCXkhYrum5Uix0hplMRGusFttAK36wfStDYqV783bUWb0= 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=Gx3LeW9i; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Gx3LeW9i" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1f082d92864so16527275ad.1 for ; Wed, 15 May 2024 00:17:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757446; x=1716362246; 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=7bmm+z3Y++HgLKjqUQ1k19xvJfVuFLOPQwKCzZQr8AY=; b=Gx3LeW9iM9+zmkNIGCPmc35XkwEQn2XcILyOSg9atjScgmafLHd2uMc1E3NnjIsjEi CALrMw1t6+7leFD8H2qJj0ZJZ7ikkBrsXgjd7+2BJzsQtlzaD3YOWZfZ3LoLdjrXFz2n efgxwgrHjEHQJ1DjBW4GNolYqmi3u+U/W4kr4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757446; x=1716362246; 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=7bmm+z3Y++HgLKjqUQ1k19xvJfVuFLOPQwKCzZQr8AY=; b=va3jrkGZF7Twbee2Vk55PrNvhgUUM8ztdGccwHFsLIwnCSNoO9fAGw6x41yTGSmbAt +r17KIIgP1OvJHGhJOHbNwX0HE9CrsW7YWkcAoPpR1/5alwcP3X3z1hSLXyBrtfzTU3H 51adCKal2aQJi8qRnaVxOMUriW2d4jf3BevlEgovO+oPxVOdW+kBCRImt26IIXIajapv XFRh/fZZCbHKrHFTe8tnvbwv2EPKAXDmFS0++L/R8GxnSNjr6MkTBf1emN19xL3acSiw hyWLKQ36EjzY3dLRkyF3sGtPfTZaIJFhYASjfwhuOOkSWboWacC0dZvutmwsa5Gw+yRE newQ== X-Gm-Message-State: AOJu0YxuUUk80zKYoDrOK+BokcnEapHIgkmyElhe/iQeSGou7IkbLsa2 EVsr9/2fRoZkQ+VPzs/KoOMILoIs8MFYJmQFTXc9TGKs/3Lxdengnu/RGwJACw== X-Google-Smtp-Source: AGHT+IFqYYiz6/dbTR0wwd7ijHcmxpeWPZVSroUIYlUMxCGV540oRKNRsxU3YgCNTEN6VkVK7MOiHA== X-Received: by 2002:a17:902:ce11:b0:1e7:d482:9e32 with SMTP id d9443c01a7336-1ef43c0e8d6mr184387855ad.7.1715757446224; Wed, 15 May 2024 00:17:26 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:25 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 12/21] zram: support compression level comp config Date: Wed, 15 May 2024 16:12:49 +0900 Message-ID: <20240515071645.1788128-13-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 support for compression level level=3DN comp configuration to comp_algorithm and recomp_algorithm knobs. Note that zram cannot verify ranges, it's a task of corresponding backends to make sure that level makes sense. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 7eb500c8fdaa..91706889b63f 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_config_store(struct zram *zram, u32 prio, s32 level) +{ + zram->configs[prio].level =3D level; + return 0; +} + static ssize_t comp_algorithm_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -1015,6 +1021,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; + s32 level =3D ZCOMP_CONFIG_NO_LEVEL; int ret; =20 args =3D skip_spaces(buf); @@ -1034,12 +1041,21 @@ static ssize_t comp_algorithm_store(struct device *= dev, alg =3D val; continue; } + + if (!strcmp(param, "level")) { + ret =3D kstrtoint(val, 10, &level); + if (ret) + return ret; + continue; + } } =20 if (!alg) return -EINVAL; =20 - ret =3D __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); + ret =3D comp_config_store(zram, ZRAM_PRIMARY_COMP, level); + if (!ret) + ret =3D __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); return ret ? ret : len; } =20 @@ -1072,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_CONFIG_NO_LEVEL; int ret; =20 args =3D skip_spaces(buf); @@ -1092,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) @@ -1100,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_config_store(zram, prio, level); + if (!ret) + ret =3D __comp_algorithm_store(zram, prio, alg); return ret ? ret : len; } #endif --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.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 2233E47A79 for ; Wed, 15 May 2024 07:17:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757451; cv=none; b=M2+8oCJZmCAdip21VpnR3IW5bdV7ZkNcwoQHfq/3ZB2DlkAXa4TUHFBNR67ZhE8XWiePNA2B4rs7PZX0Zz8nYOOgqrqf+EMtYpllw62EUlJNzUq90SJ78oytl9vNaWkuD3eoUMyTOSYL/KooiObqPTuMvjOMvg6684Qdn+kYVKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757451; c=relaxed/simple; bh=lOpECWNUVFdB4uflmaL917YB3kCc2WBAsq/OEf5OpTE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OAbAxuX7s+0L/JHxiyHifcKN17IFwxfPsrPn77sk+VmoyDA0Fs4YrqqgfbXAi33se1F8OHFhT/mkiyQtVvYece4zl1LLFunRmGRLV9tfUNBegwILR4aZr2YtettiwxBWDprlio+wNltp/YlrbfRpoWRsYxYUy83F/GokP47lkoU= 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=GGRlDign; arc=none smtp.client-ip=209.85.214.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="GGRlDign" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-1eca195a7c8so53256215ad.2 for ; Wed, 15 May 2024 00:17:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757448; x=1716362248; 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=4La/wbPPFJXkOrGYwK5uu1FW9Id7puPhRkViZ/LZt3Q=; b=GGRlDignRfYmnYlC3l25nP0NSXAdeAA0fFaCDTPlRzqmu2R00HMa+xFseWbiAYZecY krqyHz7O1GrlfcD9VCc0DpRxEehCZAANxUucua0wOLGQiB4VPyuZ+ph8H7W9/MqJBKCi SCkKj5SidVFWJR0lkM2Hskh4G6Vm9WRqemLFA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757448; x=1716362248; 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=4La/wbPPFJXkOrGYwK5uu1FW9Id7puPhRkViZ/LZt3Q=; b=E++Lt5UXe7HDGwoSXz9cGhuU2tb2EPEZy5XetxBQuJ2A/ZRyIJZTcXPb76Uclk09dl 9ZDmdagUwes7J3q/bxn5PA6HhhKL6pPYB+1zsn1m6nIfmR2XVKTCa/zlM1TtdTPDJDed wC22uI97jY41bslWEw8G2wX84oot2IufJz4eP0bT3+IOLy2wLAEqXaQOXKT5u3N582db oiDhDHukekm7wSupNCeiCwl2x67nr4b5DKMzeB/e/UWlJMLU45vIxpQgx1qHrmy5M1gC lS8HCw+B+upytkynthFontNeLDUvGo2fe5ph0GnSETt3wJGqqSe9rnhPtrsLBvZqKjvu aTXA== X-Gm-Message-State: AOJu0YxffFVA4U98yGQm5Gh2oj/Jg+setdVdj8qFN8iLw/QSJnF/Oipq JrkjjrG2s0K7XNq1DwMqgrdLAZthmb5IXceByceaIlzRClQHLUJ/0QKTxmJTEw== X-Google-Smtp-Source: AGHT+IF1uuv1Ow3yvq8pHb/zFsmRaet2oXT4g/kID1xMXGAMF0E6Hhv0qQeFV2atbjmsxgzSnd8SRQ== X-Received: by 2002:a17:902:e889:b0:1eb:c3d4:349c with SMTP id d9443c01a7336-1ef43d2ec0bmr187724195ad.30.1715757448368; Wed, 15 May 2024 00:17:28 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:28 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 13/21] zram: add support for dict comp config Date: Wed, 15 May 2024 16:12:50 +0900 Message-ID: <20240515071645.1788128-14-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 54 ++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 91706889b63f..216686a5f3f0 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,9 +999,35 @@ static int __comp_algorithm_store(struct zram *zram, u= 32 prio, const char *buf) return 0; } =20 -static int comp_config_store(struct zram *zram, u32 prio, s32 level) +static void __reset_comp_config(struct zram *zram, u32 prio) { + struct zcomp_config *config =3D &zram->configs[prio]; + + vfree(config->dict); + config->level =3D ZCOMP_CONFIG_NO_LEVEL; + config->dict_sz =3D 0; + config->dict =3D NULL; +} + +static int comp_config_store(struct zram *zram, u32 prio, s32 level, + const char *dict_path) +{ + ssize_t sz =3D 0; + + __reset_comp_config(zram, prio); + + if (dict_path) { + sz =3D kernel_read_file_from_path(dict_path, 0, + &zram->configs[prio].dict, + INT_MAX, + NULL, + READING_POLICY); + if (sz < 0) + return -EINVAL; + } + zram->configs[prio].level =3D level; + zram->configs[prio].dict_sz =3D sz; return 0; } =20 @@ -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_CONFIG_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_config_store(zram, ZRAM_PRIMARY_COMP, level); + ret =3D comp_config_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_CONFIG_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_config_store(zram, prio, level); + ret =3D comp_config_store(zram, prio, level, dict_path); if (!ret) ret =3D __comp_algorithm_store(zram, prio, alg); return ret ? ret : len; @@ -2034,12 +2071,7 @@ static void zram_reset_comp_configs(struct zram *zra= m) u32 prio; =20 for (prio =3D 0; prio < ZRAM_MAX_COMPS; prio++) { - struct zcomp_config *config =3D &zram->configs[prio]; - - vfree(config->dict); - config->level =3D ZCOMP_CONFIG_NO_LEVEL; - config->dict_sz =3D 0; - config->dict =3D NULL; + __reset_comp_config(zram, prio); } } =20 --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.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 B94226214E for ; Wed, 15 May 2024 07:17:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757453; cv=none; b=u46LpLCiyDgn3MovnZDBSn0dAYqGBHPt4at8QozkHAilVELqwRR3CpHS6afI0R7fx2LZL5GAac1U6My9cU7vo3hQpFcRnQDUjNUVisDz3ZH0uihI9D6NkorpgaRCX453r/lIwVr9C8Yq9euV9wBvoFndBoPJp+95dcOLBzNL2x0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757453; c=relaxed/simple; bh=dGZx0+acqv0CZi2wH7InQ4R8O8AcdvZYdUe91hxxiWY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nSN0JJuL4+kqD8wkwQ/xsxDn3US7SofLsmP7QM+ZHA21D5QV0FQmIj0XWdmLrAQzNWcbgtH4C23NYrXOFYCTdUdJbLdiQj8U6F1Ei2QojuTR+fWJOTyCkDeMdcXnQJPSJILG84T1UejYi/fmWt4QW4yCuDMGkytWaW3xOcw241I= 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=XYhwxIUM; arc=none smtp.client-ip=209.85.215.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="XYhwxIUM" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-5d3907ff128so5438413a12.3 for ; Wed, 15 May 2024 00:17:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757451; x=1716362251; 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=/z5a3E5tjsWd2v3yZqDEd2ZFUX29EqdmRojLDBz4OHQ=; b=XYhwxIUM8or1FxDmvVN5glOWFu63z/QCHG1Ml26EstgH79SW1uXwEBvolud6QX6cdr 2+dXRPM+1lza3dA2tPVvNhIQrMIsTCCoKiEZOzBED75+gaQ1/9SWjjsxVuJV0tQVwQOQ n0dmXtvze4CwhLT/6loisp/6N0yo4cD6NuT5s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757451; x=1716362251; 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=/z5a3E5tjsWd2v3yZqDEd2ZFUX29EqdmRojLDBz4OHQ=; b=SsyUmZAvdXD9Kq961OW7wD6wb3sK+TQ6UH0TJ0OHIv+922Yn5uflpoMtVpFb9r+3Jv jNhnU0cep4YpB5uM8SmYnb4cD0voOsixG8LQgmZpGxiez3Pyegs9HfnCHzK6n8fofY3C qny6fxh/R0WY2nCCvzoa9nEH0nKTOlK+ax+EUOWRjAjVktTzcmAxMJfHdfU0WJKMRIA5 Bp+8vYVcq5uf4y3RIgIH4kUsAYMfFsQeBcU9L1yuTjvflYHPFDOqXKDeYZPGJRyW01fP YIFLE2842ySmW77PsQVx+sn2V4VmVz5mPa6jWhtvDjNXmEsOJVrlNVBCZFNZaeq3o3b8 hzeA== X-Gm-Message-State: AOJu0Ywdcce0l3qmD1PVA04BSeljbXadAdq/MvcId2NUxpBkdLtIC1NR wrGJp3f/WaPWgJEkRnBNDQJDJyPyveawcQwo8HbiKrPtgML58PIzZeih8sPFXAE5VQRNTHjz5YU = X-Google-Smtp-Source: AGHT+IGv1Omsyk9TRAdIngjWvd5a6uW973xBM8/wHVw3kf6S3NTLue+rsCGPi9x1UgDL0rvIAAuHOQ== X-Received: by 2002:a05:6a20:f38f:b0:1aa:a6cc:39c5 with SMTP id adf61e73a8af0-1afde0824f6mr18701539637.7.1715757451053; Wed, 15 May 2024 00:17:31 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:30 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv4 14/21] lib/zstd: export API needed for dictionary support Date: Wed, 15 May 2024 16:12:51 +0900 Message-ID: <20240515071645.1788128-15-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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. Signed-off-by: Sergey Senozhatsky Cc: Nick Terrell --- include/linux/zstd.h | 165 ++++++++++++++++++++++++++++++ lib/zstd/zstd_compress_module.c | 52 ++++++++++ lib/zstd/zstd_decompress_module.c | 38 +++++++ 3 files changed, 255 insertions(+) diff --git a/include/linux/zstd.h b/include/linux/zstd.h index f109d49f43f8..18260a354231 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,70 @@ 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_advanced() - 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. + * + * Return: NULL on error, pointer to compression dictionary + * otherwise. + */ +zstd_cdict *zstd_create_cdict_advanced(const void *dict, size_t dict_size, + zstd_dict_load_method dict_load_method, + zstd_dict_content_type dict_content_type, + 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 +321,70 @@ 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_advanced() - 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. + * + * Return: NULL on error, pointer to decompression dictionary + * otherwise. + */ +zstd_ddict *zstd_create_ddict_advanced(const void *dict, size_t dict_size, + zstd_dict_load_method dict_load_method, + zstd_dict_content_type dict_content_type, + 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..a5edf59334df 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,36 @@ 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_advanced(const void *dict, size_t dict_size, + zstd_dict_load_method dict_load_method, + zstd_dict_content_type dict_content_type, + zstd_compression_parameters cparams, + zstd_custom_mem custom_mem) +{ + return ZSTD_createCDict_advanced(dict, dict_size, dict_load_method, + dict_content_type, cparams, + custom_mem); +} +EXPORT_SYMBOL(zstd_create_cdict_advanced); + +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 +144,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..6a0f464609bc 100644 --- a/lib/zstd/zstd_decompress_module.c +++ b/lib/zstd/zstd_decompress_module.c @@ -44,6 +44,35 @@ 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_advanced(const void *dict, size_t dict_size, + zstd_dict_load_method dict_load_meth= od, + zstd_dict_content_type dict_content_= type, + zstd_custom_mem custom_mem) +{ + return ZSTD_createDDict_advanced(dict, dict_size, dict_load_method, + dict_content_type, custom_mem); + +} +EXPORT_SYMBOL(zstd_create_ddict_advanced); + +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 +88,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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.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 D1AE3481A7 for ; Wed, 15 May 2024 07:17:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757455; cv=none; b=txYigFw4n5GZYVZSTB/Z8zrMh6x90pgxiLaNgl1cA42dGvYiX5M+ZFNzbLL1aMA9cbpbZ9K1kiOr5QbIfHBEmBSwSoRzxWwX4+K29cdbuGSDSX/NC+xwmsbl18CruYeagIfzqWeNsQZVvNUExzfVCRAiM11PaF+K5UF+0tp3qN0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757455; c=relaxed/simple; bh=qPxpMzrLexeajXOvydJh+v3ubpdPbmLqWgxknedh2Uk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UGpXADOfB3rCuy0yX+UHN27XAHMOr8ze8d4ceVDr3GeRAL8W1+xk6pQzfZPpsWOyIbHacGMYNGHC+1IkzvjoBMeomQOnEWPfYpXb/t3s5yV7CkaEsaLGLGDliwNvhv0b9UfFZdAIEKwKvMEkVMGqhPzsoH0p9Sz/ULdLbtmLdB4= 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=Xdt8p9hv; arc=none smtp.client-ip=209.85.215.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="Xdt8p9hv" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-53fbf2c42bfso4724081a12.3 for ; Wed, 15 May 2024 00:17:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757453; x=1716362253; 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=e1Q92/50oEzsFAIXeAasi/lhjVaiDz6wVjSMUCSkV98=; b=Xdt8p9hvR9TFDNsREHSqFGtB4LrvWY6k3grut4Jh2mc67rjUSKE6UncsmCO6Lc5F/q 7q8FhbvOcx+XLoPR+yglbhlOfFlycwo9lgVqS6Mmdfvvvw5icjO9/p1zNM5frFZNuulB QBXRdiJqUWmsdPOCwa8nlNr3UmFwQCV1tiXL4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757453; x=1716362253; 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=e1Q92/50oEzsFAIXeAasi/lhjVaiDz6wVjSMUCSkV98=; b=M4Ifgkbehn0L1gJ4lRLybmMRua2CP+jwSuUIfRJxq1VR2cIFnsals+eGVRFHJwd1Bj OpvBp7eTDIfpMab+NdcKmu1cTzrom4z9ENdcjtuytUct5JdCmyaNA3lemtyhEjMFSDwl K3sFbCNH1Q3HFs1+aFQ15Yr88P7SC6BwHEZ+8GWd7OCO9sm0FUdAEFMH6wig8ttb0oZC 8t+lElWJIqYWEs5ehtMMrycM+90t7NRiW2aZ74ofNZLLyO9GcqOPjf54Z8989yGs16fY WHcEWwW5A+IM5m6mGpf2daqJsW3D3K5WwH5xdM6EXJVa7HKXC1MbmAWXnCLOLtj0kPgU nJeg== X-Gm-Message-State: AOJu0YzjS6MrBsHO9v+V8HNUlPwUdLeinMB/VS8sIZaWjZZ6KIQzWq1C 90Z7FkfdvOkvZRfLo0ZiqdehOr+10gbXvmeOpjGVYubCcDhSR2pgVorY16mb+g== X-Google-Smtp-Source: AGHT+IFoXN+G8OBVIyHl2dhkr+cK7yJTsa+IDe8Y4EgCK8SM3Nz6RhZgJrZp6Vf7WOYHuo5IjVDf2g== X-Received: by 2002:a05:6a20:5504:b0:1a9:8152:5102 with SMTP id adf61e73a8af0-1afde0d54c9mr14256096637.24.1715757453236; Wed, 15 May 2024 00:17:33 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:32 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 15/21] zram: add dictionary support to zstd backend Date: Wed, 15 May 2024 16:12:52 +0900 Message-ID: <20240515071645.1788128-16-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 loaded once (per-config) and then loaded to Cctx and Dctx by reference, so we don't allocate extra memory. Regarding GFP_ATOMIC in Cctx customAlloc(), we probably would want to do something about it. Either make sure that we always (somehow) fully setup all Cctx contexts from non-atomic context before we attempt to use them, come up with some sort of custom allocator or stop calling zcomp_compress() from atomic context. TEST =3D=3D=3D=3D - default zstd /sys/block/zram0/mm_stat 1750315008 504602831 514256896 0 514256896 1 0 3420= 4 34204 - zstd level=3D7 dict=3D/etc/dictionary /sys/block/zram0/mm_stat 1750310912 432540606 441712640 0 441712640 1 0 3418= 7 34187 [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 | 126 ++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 25 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index d392d364ad2c..4be149370e0b 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -12,23 +12,52 @@ struct zstd_ctx { zstd_dctx *dctx; void *cctx_mem; void *dctx_mem; + zstd_custom_mem ctx_mem; + zstd_cdict *cdict; + zstd_ddict *ddict; s32 level; }; =20 +/* + * Cctx allocator.customAlloc() can be called from zcomp_compress() under + * local-lock (per-CPU compression stream), in which case we must use + * GFP_ATOMIC. + */ +static void *zstd_ctx_alloc(void *opaque, size_t size) +{ + if (!preemptible()) + return kvzalloc(size, GFP_ATOMIC); + + return kvzalloc(size, GFP_KERNEL); +} + +static void zstd_ctx_free(void *opaque, void *address) +{ + kvfree(address); +} + static void zstd_destroy(void *ctx) { struct zstd_ctx *zctx =3D ctx; =20 - vfree(zctx->cctx_mem); - vfree(zctx->dctx_mem); + 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); + + zstd_free_cdict(zctx->cdict); + zstd_free_ddict(zctx->ddict); kfree(zctx); } =20 static void *zstd_create(struct zcomp_config *config) { - zstd_parameters params; struct zstd_ctx *ctx; - size_t sz; =20 ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) @@ -39,24 +68,62 @@ static void *zstd_create(struct zcomp_config *config) else ctx->level =3D zstd_default_clevel(); =20 - 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) - 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; + ctx->ctx_mem.customAlloc =3D zstd_ctx_alloc; + ctx->ctx_mem.customFree =3D zstd_ctx_free; + + if (config->dict_sz =3D=3D 0) { + zstd_parameters params; + size_t sz; + + 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) + 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; + } else { + zstd_compression_parameters params; + + ctx->cctx =3D zstd_create_cctx_advanced(ctx->ctx_mem); + if (!ctx->cctx) + goto error; + + ctx->dctx =3D zstd_create_dctx_advanced(ctx->ctx_mem); + if (!ctx->dctx) + goto error; + + params =3D zstd_get_cparams(ctx->level, PAGE_SIZE, + config->dict_sz); + + ctx->cdict =3D zstd_create_cdict_advanced(config->dict, + config->dict_sz, + ZSTD_dlm_byRef, + ZSTD_dct_auto, + params, + ctx->ctx_mem); + if (!ctx->cdict) + goto error; + + ctx->ddict =3D zstd_create_ddict_advanced(config->dict, + config->dict_sz, + ZSTD_dlm_byRef, + ZSTD_dct_auto, + ctx->ctx_mem); + if (!ctx->ddict) + goto error; + } =20 return ctx; =20 @@ -72,8 +139,12 @@ static int zstd_compress(void *ctx, const unsigned char= *src, 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, - src, PAGE_SIZE, ¶ms); + if (!zctx->cdict) + ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, + src, PAGE_SIZE, ¶ms); + else + ret =3D zstd_compress_using_cdict(zctx->cctx, dst, *dst_len, + src, PAGE_SIZE, zctx->cdict); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; @@ -86,7 +157,12 @@ static int zstd_decompress(void *ctx, const unsigned ch= ar *src, size_t src_len, struct zstd_ctx *zctx =3D ctx; size_t ret; =20 - ret =3D zstd_decompress_dctx(zctx->dctx, dst, PAGE_SIZE, src, src_len); + if (!zctx->ddict) + ret =3D zstd_decompress_dctx(zctx->dctx, dst, PAGE_SIZE, + src, src_len); + else + ret =3D zstd_decompress_using_ddict(zctx->dctx, dst, PAGE_SIZE, + src, src_len, zctx->ddict); if (zstd_is_error(ret)) return -EINVAL; return 0; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.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 31CBC6A005 for ; Wed, 15 May 2024 07:17:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757457; cv=none; b=ClhW/w2b/yTY9jRaKqpIC62GVRFPI3yy9T85kcSnVTjbi9Zd0NVpxESsu//jNSn75OcncZOpHABloJPadU1vFJuwTdwokNYN0CzzBHo9TyNu4EvwE7VMbuexnxg7Qs4+wAfGua2kmbqrgtLR88/lxSpDcbWoMRhoK1yZRZPxmXQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757457; c=relaxed/simple; bh=EdcVeRKP/KQ7J2vOPlmfMisYBBpem1rc+IBT0Rrt74I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Trhyx3oBPSJtLft/Hq4s2FDv2IR93XbcuvebTj/PgSIUzJ+rfVGMWL5zGpAQuWnM0svVUTecv8VpFVcaUkDrWp7PxS0rzXNSda5x2UMmVyAYH/E7QRlrEnqooK2k2Hz5+dipjoVClBxf4zQfhzCfD/auvn72a8Cm6hXsgJxE/KM= 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=LYOGCI/y; arc=none smtp.client-ip=209.85.214.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="LYOGCI/y" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1eeb1a4c10aso39642615ad.3 for ; Wed, 15 May 2024 00:17:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757455; x=1716362255; 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=KqMJS5agkLEOzJWW1AUSO+pWta3iupztSYk/iAWBNyc=; b=LYOGCI/yIuAyRPoBAN9Lhn3v1z52/Tj8mf633vwkwvzNGMv2Jcg7rYe/JyUJA9bgK6 bbCJW4kiYIc5NzxoFGBozGvRP+BHGZa2z6IIXQdTpYCeU9KpuJ2e/7cLFtZOpGcoil5i TY7HgCvmkTtBcpEDI79AQ0Zeb+AOU3uRV0HAE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757455; x=1716362255; 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=KqMJS5agkLEOzJWW1AUSO+pWta3iupztSYk/iAWBNyc=; b=hXCIF17YpLAsvC1Y4EHcU7CaXdgD5aeUqgHMvVOVzM053QOa/F0MRi34SWR2PvSzXS 5A75WGExjeioSV6jzotcdjB+vFl8uTPEJHhZONUDdfg5hsxpcLj2MU62TFxUHwrTmALo 7j44VvgtluhW3BvDO0hudl4dFgAQLaVqKcRHPHKMQQixfdtsss1g3Uikv7Jm6GM7sngt A9Dwh8G+HoJKzRaFPoetlxJblCtrwOYZ1FUMz9WkH+0iqn0aqilIZOhvvBX/vCWTogi+ E+gUOD10qvZZmlOFme3xCE98nynR2nsOsGAhSf6wx/i8c0Vpur6HK4v5VxIvwd4a1xDz y2Fw== X-Gm-Message-State: AOJu0YyOahieK93bs4XrjouaT+D5Ubj0yxTmK1QJaJA+zf5IEV3Jg6VK KGC47QgNHHtQXkRQKgMxhAegzUw5ukbqPTcT++GuVFm1TYlNOyVsWdUKvjzl5g== X-Google-Smtp-Source: AGHT+IEqDaF2jnae7dsuVOOBN2n95AgJH3VLf55Gs8FaRkx1MfHX06Cxat1HEPBqfloibFYY9DeFyg== X-Received: by 2002:a17:903:283:b0:1e3:e081:e7f5 with SMTP id d9443c01a7336-1ef4404bf29mr165136805ad.66.1715757455517; Wed, 15 May 2024 00:17:35 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:35 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 16/21] zram: add config init/release backend callbacks Date: Wed, 15 May 2024 16:12:53 +0900 Message-ID: <20240515071645.1788128-17-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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" Some backends can create a backend-specific private data for comp config, e.g. parse a dictionary and use it to init all of the ctx-s later on. Introduce two zcomp_config callbacks to create and destroy per-config backend private data. This is also the place where config can be validated. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_842.c | 11 +++++++++++ drivers/block/zram/backend_deflate.c | 20 +++++++++++++++----- drivers/block/zram/backend_lz4.c | 20 +++++++++++++++----- drivers/block/zram/backend_lz4hc.c | 20 +++++++++++++++----- drivers/block/zram/backend_lzo.c | 11 +++++++++++ drivers/block/zram/backend_lzorle.c | 11 +++++++++++ drivers/block/zram/backend_zstd.c | 20 +++++++++++++++----- drivers/block/zram/zcomp.c | 6 ++++++ drivers/block/zram/zcomp.h | 4 ++++ drivers/block/zram/zram_drv.c | 3 +++ 10 files changed, 106 insertions(+), 20 deletions(-) diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_= 842.c index 12e716deb763..1522aa88ac35 100644 --- a/drivers/block/zram/backend_842.c +++ b/drivers/block/zram/backend_842.c @@ -11,6 +11,15 @@ struct sw842_ctx { void *mem; }; =20 +static int init_config_842(struct zcomp_config *config) +{ + return 0; +} + +static void release_config_842(struct zcomp_config *config) +{ +} + static void destroy_842(void *ctx) { struct sw842_ctx *zctx =3D ctx; @@ -64,5 +73,7 @@ struct zcomp_backend backend_842 =3D { .decompress =3D decompress_842, .create_ctx =3D create_842, .destroy_ctx =3D destroy_842, + .init_config =3D init_config_842, + .release_config =3D release_config_842, .name =3D "842", }; diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/back= end_deflate.c index 83c660adc722..2e166b507f5a 100644 --- a/drivers/block/zram/backend_deflate.c +++ b/drivers/block/zram/backend_deflate.c @@ -17,6 +17,18 @@ struct deflate_ctx { s32 level; }; =20 +static int deflate_init_config(struct zcomp_config *config) +{ + if (config->level =3D=3D ZCOMP_CONFIG_NO_LEVEL) + config->level =3D Z_DEFAULT_COMPRESSION; + + return 0; +} + +static void deflate_release_config(struct zcomp_config *config) +{ +} + static void deflate_destroy(void *ctx) { struct deflate_ctx *zctx =3D ctx; @@ -42,11 +54,7 @@ static void *deflate_create(struct zcomp_config *config) if (!ctx) return NULL; =20 - if (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) - ctx->level =3D config->level; - else - ctx->level =3D Z_DEFAULT_COMPRESSION; - + ctx->level =3D config->level; sz =3D zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); ctx->cctx.workspace =3D vzalloc(sz); if (!ctx->cctx.workspace) @@ -129,5 +137,7 @@ struct zcomp_backend backend_deflate =3D { .decompress =3D deflate_decompress, .create_ctx =3D deflate_create, .destroy_ctx =3D deflate_destroy, + .init_config =3D deflate_init_config, + .release_config =3D deflate_release_config, .name =3D "deflate", }; diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index df0753fd8180..cf39bfc30f5b 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -10,6 +10,18 @@ struct lz4_ctx { s32 level; }; =20 +static int lz4_init_config(struct zcomp_config *config) +{ + if (config->level =3D=3D ZCOMP_CONFIG_NO_LEVEL) + config->level =3D LZ4_ACCELERATION_DEFAULT; + + return 0; +} + +static void lz4_release_config(struct zcomp_config *config) +{ +} + static void lz4_destroy(void *ctx) { struct lz4_ctx *zctx =3D ctx; @@ -26,11 +38,7 @@ static void *lz4_create(struct zcomp_config *config) if (!ctx) return NULL; =20 - if (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) - ctx->level =3D config->level; - else - ctx->level =3D LZ4_ACCELERATION_DEFAULT; - + ctx->level =3D config->level; ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); if (!ctx->mem) goto error; @@ -72,5 +80,7 @@ struct zcomp_backend backend_lz4 =3D { .decompress =3D lz4_decompress, .create_ctx =3D lz4_create, .destroy_ctx =3D lz4_destroy, + .init_config =3D lz4_init_config, + .release_config =3D lz4_release_config, .name =3D "lz4", }; diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 2f03ca5809c7..428b393371d7 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -10,6 +10,18 @@ struct lz4hc_ctx { s32 level; }; =20 +static int lz4hc_init_config(struct zcomp_config *config) +{ + if (config->level =3D=3D ZCOMP_CONFIG_NO_LEVEL) + config->level =3D LZ4HC_DEFAULT_CLEVEL; + + return 0; +} + +static void lz4hc_release_config(struct zcomp_config *config) +{ +} + static void lz4hc_destroy(void *ctx) { struct lz4hc_ctx *zctx =3D ctx; @@ -26,11 +38,7 @@ static void *lz4hc_create(struct zcomp_config *config) if (!ctx) return NULL; =20 - if (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) - ctx->level =3D config->level; - else - ctx->level =3D LZ4HC_DEFAULT_CLEVEL; - + ctx->level =3D config->level; ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); if (!ctx->mem) goto error; @@ -72,5 +80,7 @@ struct zcomp_backend backend_lz4hc =3D { .decompress =3D lz4hc_decompress, .create_ctx =3D lz4hc_create, .destroy_ctx =3D lz4hc_destroy, + .init_config =3D lz4hc_init_config, + .release_config =3D lz4hc_release_config, .name =3D "lz4hc", }; diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index 79ecfae9c4c5..75e0e3d297aa 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 int lzo_init_config(struct zcomp_config *config) +{ + return 0; +} + +static void lzo_release_config(struct zcomp_config *config) +{ +} + static void *lzo_create(struct zcomp_config *config) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); @@ -40,5 +49,7 @@ struct zcomp_backend backend_lzo =3D { .decompress =3D lzo_decompress, .create_ctx =3D lzo_create, .destroy_ctx =3D lzo_destroy, + .init_config =3D lzo_init_config, + .release_config =3D lzo_release_config, .name =3D "lzo", }; diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backe= nd_lzorle.c index b0937103b5fb..d1dc2e35061b 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 int lzorle_init_config(struct zcomp_config *config) +{ + return 0; +} + +static void lzorle_release_config(struct zcomp_config *config) +{ +} + static void *lzorle_create(struct zcomp_config *config) { return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); @@ -40,5 +49,7 @@ struct zcomp_backend backend_lzorle =3D { .decompress =3D lzorle_decompress, .create_ctx =3D lzorle_create, .destroy_ctx =3D lzorle_destroy, + .init_config =3D lzorle_init_config, + .release_config =3D lzorle_release_config, .name =3D "lzo-rle", }; diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 4be149370e0b..9d2cc27d4c9d 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -36,6 +36,18 @@ static void zstd_ctx_free(void *opaque, void *address) kvfree(address); } =20 +static int zstd_init_config(struct zcomp_config *config) +{ + if (config->level =3D=3D ZCOMP_CONFIG_NO_LEVEL) + config->level =3D zstd_default_clevel(); + + return 0; +} + +static void zstd_release_config(struct zcomp_config *config) +{ +} + static void zstd_destroy(void *ctx) { struct zstd_ctx *zctx =3D ctx; @@ -63,11 +75,7 @@ static void *zstd_create(struct zcomp_config *config) if (!ctx) return NULL; =20 - if (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) - ctx->level =3D config->level; - else - ctx->level =3D zstd_default_clevel(); - + ctx->level =3D config->level; ctx->ctx_mem.customAlloc =3D zstd_ctx_alloc; ctx->ctx_mem.customFree =3D zstd_ctx_free; =20 @@ -173,5 +181,7 @@ struct zcomp_backend backend_zstd =3D { .decompress =3D zstd_decompress, .create_ctx =3D zstd_create, .destroy_ctx =3D zstd_destroy, + .init_config =3D zstd_init_config, + .release_config =3D zstd_release_config, .name =3D "zstd", }; diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 3f990a715487..a7013a4b6575 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -187,18 +187,24 @@ static int zcomp_init(struct zcomp *comp) if (!comp->stream) return -ENOMEM; =20 + ret =3D comp->backend->init_config(comp->config); + 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->backend->release_config(comp->config); free_percpu(comp->stream); return ret; } =20 void zcomp_destroy(struct zcomp *comp) { + comp->backend->release_config(comp->config); cpuhp_state_remove_instance(CPUHP_ZCOMP_PREPARE, &comp->node); free_percpu(comp->stream); kfree(comp); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 345c78bc76db..aa604e5db7ad 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -22,6 +22,7 @@ struct zcomp_config { s32 level; size_t dict_sz; void *dict; + void *private; }; =20 struct zcomp_backend { @@ -34,6 +35,9 @@ struct zcomp_backend { void *(*create_ctx)(struct zcomp_config *config); void (*destroy_ctx)(void *ctx); =20 + int (*init_config)(struct zcomp_config *config); + void (*release_config)(struct zcomp_config *config); + const char *name; }; =20 diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 216686a5f3f0..ce63c3f12f58 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1003,6 +1003,9 @@ static void __reset_comp_config(struct zram *zram, u3= 2 prio) { struct zcomp_config *config =3D &zram->configs[prio]; =20 + /* config->private should be freed by the backend */ + WARN_ON_ONCE(config->private); + vfree(config->dict); config->level =3D ZCOMP_CONFIG_NO_LEVEL; config->dict_sz =3D 0; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B2156CDD5 for ; Wed, 15 May 2024 07:17:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757460; cv=none; b=AViRltXCX57wEZaYth5kG4CxRBL5R1cwFrONwYJpNyMLkaDmQrIYLgNisAWD0J2GqOBmGLiMgz9ec6hYIuxRa96oNM+8SoIjpL2MyeN2KFtjnjJEVhGd/T4ia62Y+IGgTvDAzU/ZniCXYeiDmoFF2/DmcsITiDMIGhTVQ77AfCA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757460; c=relaxed/simple; bh=27D84d9fXLJIjEidlYnHwUN44hOlRv9gnV3y+W6WffA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QC7zDsI8j63uK/GHTCy7kTksAtLwvD11MNEsh8zxFD3OxvfUMKqJlWGdtQupZsvwJX2CD0b7PJyPQCBsARyBUMe4J0sJfJ4h1LPMCh9lz84eX+rCp3CR3bp/kz5h0s1tEfPf9zexEAyRdgBjVF94iFhSVopEg54OJ+1yNj5TpNM= 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=cf+6dqrd; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="cf+6dqrd" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1ee7963db64so54145925ad.1 for ; Wed, 15 May 2024 00:17:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757458; x=1716362258; 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=1NDMJY3isqUp1Ew8boWj0krAQJNa5FH6QFiRGHLN6Vo=; b=cf+6dqrdu3Tq1OTezw3qOVjOrFhtLLoHjo3nt3iGZtzq83y9P04BG5WLsVXq1sw/BY aoloOrBTZbEhJ7E08d8fl0YcphjchIRzE6E5XLSxfR8VV03yRWlVCpKrFV2Y81i3xZJG dNdvHwnOAncDJxlRc4+7TDz24qzCqoCDgfiN0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757458; x=1716362258; 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=1NDMJY3isqUp1Ew8boWj0krAQJNa5FH6QFiRGHLN6Vo=; b=dOnAyspr8ombMbsezP9JfPxjCwyy+gKckS+whKmPK44vfqIVwzPWHJ+YKpVFLgT4AG w50p/YngnPyeuy/Tlsld+PC8F5rKKQATuKfcS/dAxFuEEVZscL6CNxqYa90wqgDtbwql Io3ImrQpi2GA7GMQKCa+RJ6vvVDpsvuDS7Xf/QPNCZQ74mDomS1nhUW17+HPSiY6zIXc kttP3TW/6G7VkyQOg4hJxo2VmsLtCFMAdQfX85XKpDCMznoewdFRuBWLHYidXb/oAggD F/ABwGBlxe4Xg1Cb5eN1y15t9po40GerIP9jU57gYzGfot2EnXaKV75RYoGDZvJZhmr5 MgJw== X-Gm-Message-State: AOJu0Yw+y/hH8fYfYst4DqmnQGDMsUShz15avXQnK3HiPj8AM/dnfrWs VxJlawVuTZlVrnAxLNmf8DmuXaGNDu54I8Z7VKR0i4zHkANq7oKNOrH5P0XkAQ== X-Google-Smtp-Source: AGHT+IHeoSK5yxNBWrJqyEizK8yAwDS+DFO/v6xnM5tOk4j5OWsHulkeJfcNBaP6LY2IvO2BEnwfXg== X-Received: by 2002:a17:902:ecc7:b0:1e8:c994:b55b with SMTP id d9443c01a7336-1ef43d15786mr210891335ad.7.1715757457712; Wed, 15 May 2024 00:17:37 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:37 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 17/21] zram: share dictionaries between per-CPU contexts Date: Wed, 15 May 2024 16:12:54 +0900 Message-ID: <20240515071645.1788128-18-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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's CDict and DDict are accessed read-only during compression and decompression, so instead of allocation per-context dictionaries we can create just one CDict and DDict in init_config() and make per-CPU contexts use them. This saves quite a lot of memory: on my system CDict requires 408128 bytes and DDict requires 27352 bytes. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_zstd.c | 108 ++++++++++++++++++++---------- 1 file changed, 72 insertions(+), 36 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index 9d2cc27d4c9d..836de2af7c11 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -7,14 +7,18 @@ =20 #include "backend_zstd.h" =20 +struct zstd_ctx_data { + zstd_custom_mem ctx_mem; + zstd_cdict *cdict; + zstd_ddict *ddict; +}; + struct zstd_ctx { zstd_cctx *cctx; zstd_dctx *dctx; void *cctx_mem; void *dctx_mem; - zstd_custom_mem ctx_mem; - zstd_cdict *cdict; - zstd_ddict *ddict; + struct zstd_ctx_data *ctx_data; s32 level; }; =20 @@ -38,32 +42,81 @@ static void zstd_ctx_free(void *opaque, void *address) =20 static int zstd_init_config(struct zcomp_config *config) { + struct zstd_ctx_data *ctx_data =3D config->private; + zstd_compression_parameters params; + + /* Already initialized */ + if (ctx_data) + return 0; + if (config->level =3D=3D ZCOMP_CONFIG_NO_LEVEL) config->level =3D zstd_default_clevel(); =20 + if (config->dict_sz =3D=3D 0) + return 0; + + ctx_data =3D kzalloc(sizeof(*ctx_data), GFP_KERNEL); + if (!ctx_data) + return -ENOMEM; + + ctx_data->ctx_mem.customAlloc =3D zstd_ctx_alloc; + ctx_data->ctx_mem.customFree =3D zstd_ctx_free; + + params =3D zstd_get_cparams(config->level, PAGE_SIZE, config->dict_sz); + + ctx_data->cdict =3D zstd_create_cdict_advanced(config->dict, + config->dict_sz, + ZSTD_dlm_byRef, + ZSTD_dct_auto, + params, + ctx_data->ctx_mem); + if (!ctx_data->cdict) + goto error; + + ctx_data->ddict =3D zstd_create_ddict_advanced(config->dict, + config->dict_sz, + ZSTD_dlm_byRef, + ZSTD_dct_auto, + ctx_data->ctx_mem); + if (!ctx_data->ddict) + goto error; + + config->private =3D ctx_data; return 0; + +error: + zstd_free_cdict(ctx_data->cdict); + zstd_free_ddict(ctx_data->ddict); + kfree(ctx_data); + return -EINVAL; } =20 static void zstd_release_config(struct zcomp_config *config) { + struct zstd_ctx_data *ctx_data =3D config->private; + + if (!ctx_data) + return; + + config->private =3D NULL; + zstd_free_cdict(ctx_data->cdict); + zstd_free_ddict(ctx_data->ddict); + kfree(ctx_data); } =20 static void zstd_destroy(void *ctx) { struct zstd_ctx *zctx =3D ctx; =20 + /* Don't free zctx->ctx_data, it's done in release_config() */ 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); - - zstd_free_cdict(zctx->cdict); - zstd_free_ddict(zctx->ddict); kfree(zctx); } =20 @@ -75,9 +128,8 @@ static void *zstd_create(struct zcomp_config *config) if (!ctx) return NULL; =20 + ctx->ctx_data =3D config->private; ctx->level =3D config->level; - ctx->ctx_mem.customAlloc =3D zstd_ctx_alloc; - ctx->ctx_mem.customFree =3D zstd_ctx_free; =20 if (config->dict_sz =3D=3D 0) { zstd_parameters params; @@ -102,35 +154,15 @@ static void *zstd_create(struct zcomp_config *config) if (!ctx->dctx) goto error; } else { - zstd_compression_parameters params; + struct zstd_ctx_data *ctx_data =3D ctx->ctx_data; =20 - ctx->cctx =3D zstd_create_cctx_advanced(ctx->ctx_mem); + ctx->cctx =3D zstd_create_cctx_advanced(ctx_data->ctx_mem); if (!ctx->cctx) goto error; =20 - ctx->dctx =3D zstd_create_dctx_advanced(ctx->ctx_mem); + ctx->dctx =3D zstd_create_dctx_advanced(ctx_data->ctx_mem); if (!ctx->dctx) goto error; - - params =3D zstd_get_cparams(ctx->level, PAGE_SIZE, - config->dict_sz); - - ctx->cdict =3D zstd_create_cdict_advanced(config->dict, - config->dict_sz, - ZSTD_dlm_byRef, - ZSTD_dct_auto, - params, - ctx->ctx_mem); - if (!ctx->cdict) - goto error; - - ctx->ddict =3D zstd_create_ddict_advanced(config->dict, - config->dict_sz, - ZSTD_dlm_byRef, - ZSTD_dct_auto, - ctx->ctx_mem); - if (!ctx->ddict) - goto error; } =20 return ctx; @@ -144,15 +176,17 @@ static int zstd_compress(void *ctx, const unsigned ch= ar *src, unsigned char *dst, size_t *dst_len) { struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx_data *ctx_data =3D zctx->ctx_data; const zstd_parameters params =3D zstd_get_params(zctx->level, PAGE_SIZE); size_t ret; =20 - if (!zctx->cdict) + if (!ctx_data) ret =3D zstd_compress_cctx(zctx->cctx, dst, *dst_len, src, PAGE_SIZE, ¶ms); else ret =3D zstd_compress_using_cdict(zctx->cctx, dst, *dst_len, - src, PAGE_SIZE, zctx->cdict); + src, PAGE_SIZE, + ctx_data->cdict); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; @@ -163,14 +197,16 @@ static int zstd_decompress(void *ctx, const unsigned = char *src, size_t src_len, unsigned char *dst) { struct zstd_ctx *zctx =3D ctx; + struct zstd_ctx_data *ctx_data =3D zctx->ctx_data; size_t ret; =20 - if (!zctx->ddict) + if (!ctx_data) ret =3D zstd_decompress_dctx(zctx->dctx, dst, PAGE_SIZE, src, src_len); else ret =3D zstd_decompress_using_ddict(zctx->dctx, dst, PAGE_SIZE, - src, src_len, zctx->ddict); + src, src_len, + ctx_data->ddict); if (zstd_is_error(ret)) return -EINVAL; return 0; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.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 9A1C86F06D for ; Wed, 15 May 2024 07:17:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757462; cv=none; b=KejKklbJo2BYxm/lOK/zAqN1GRIsvvD8huREN+LvQuP0k/YEjsgnpfMIJk+W3l94zQh2thaRYQMCYCRG43R6J+YxLpq3EjCEmVIWPXwkCZSmZI6TO2RZI8BOt4P2fD8Sc/EFhefCp+sGifsp/AMZqvyF1ezXilszngPjyMyyl/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757462; c=relaxed/simple; bh=MpumSGwS57AOBN7ZGr4e9nw0AvNHL1Xtn57eoC3mKTM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Swl/hXzIE9Ms79+Y3i3C2HTb/gARdJUAPKX4Kwdi2HJfj/hLxq1oExrjvlX5JFXiBeap/rNMrTQbh4UFIvb7YDNws1PJk9qwlSc6vse0EYYEgvWz5MBOu18j1FMa13LGoBpDx/3E9kWFKVq4AQ0AZdJH1Kxt3WFkybQPxAJhVG0= 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=NXrrCK2d; arc=none smtp.client-ip=209.85.214.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="NXrrCK2d" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-1ecd3867556so50284095ad.0 for ; Wed, 15 May 2024 00:17:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757460; x=1716362260; 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=uMJ82RyKF+6qXGhhZplFfcbZEx2r4rtHTVfrRVwN5n0=; b=NXrrCK2dZVHCswEwYlimpfveWN88+wE22uHa+YQaslqB5AS1fJ4BC9AmYGAlDqrzIQ 9SW2vdMVOB/GFpvZDAGhB2Ttgyi3YHtauV5A/XC3ugUSl1yUpJgklY5ZNvygiB3RcF3H 5lED72TAQ8o6X+/fWe7q3nm9BWHhh/1ra3Q8w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757460; x=1716362260; 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=uMJ82RyKF+6qXGhhZplFfcbZEx2r4rtHTVfrRVwN5n0=; b=KlpCOPZ4C9QMMLKXfd8WryDO1ZWBS/8C7CUuI6VdbxvF5dBIz2rAoeq8B7U2cLyoTQ V50NMCgyRjoGPgoZ9EUlcW2sXJlrqvV/s2c1N0tIm5YpyTRXvuqyELp5Cq5O2jhWvlcO pX87oQ4QeuVPFvDaAg7ZIxd8P8eFicUaaGgs+y6Ttc9RAa69eecFAXO9HdDlbN6Ee1MS qUX6S8pHyaBmAIxMj+tDYlEIK9syrXMG3SNzaKorIFEEAFWA0jtV7a/WeVH2in7844Im k1/mtUuPakNH9U1teQ5ejkELx1/CNar9JLILfMwGC2Shdjh+9OoHstVno+nDZyGiswIh I/4w== X-Gm-Message-State: AOJu0YwHdBjs3ecNQOfgkVGwxTqdH3Ej1XmA7ieiJvC57/+uJzjx3AZp XFaHG30C3RZs+letoGOD3YucUoTqOmTeq5H4rECegMjSgdyCVL94RCKYLXQWgQ== X-Google-Smtp-Source: AGHT+IFWK5yzmfV2TgdVGKOyYOrHWxkziGiQydgnTP8gYfOW1Be1F/ocsMetxNXGL/KQ6FtS97/Wvg== X-Received: by 2002:a17:902:f60a:b0:1e7:b6b5:1f05 with SMTP id d9443c01a7336-1ef43d1b00fmr170185825ad.18.1715757459970; Wed, 15 May 2024 00:17:39 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:39 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 18/21] zram: add dictionary support to lz4 Date: Wed, 15 May 2024 16:12:55 +0900 Message-ID: <20240515071645.1788128-19-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 - default lz4 /sys/block/zram0/mm_stat 1750323200 664258735 676990976 0 676990976 2 0 3428= 8 34288 - lz4 dict=3D/etc/dictionary /sys/block/zram0/mm_stat 1750310912 620608254 632852480 0 632852480 1 0 3428= 8 34288 [1] https://github.com/lz4/lz4/issues/557 Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_lz4.c | 54 ++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c index cf39bfc30f5b..47d0e719d5d7 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -8,6 +8,12 @@ struct lz4_ctx { void *mem; s32 level; + LZ4_streamDecode_t *dstrm; + LZ4_stream_t *cstrm; + + /* Shared between C/D streams */ + void *dict; + size_t dict_sz; }; =20 static int lz4_init_config(struct zcomp_config *config) @@ -26,6 +32,8 @@ static void lz4_destroy(void *ctx) { struct lz4_ctx *zctx =3D ctx; =20 + kfree(zctx->dstrm); + kfree(zctx->cstrm); vfree(zctx->mem); kfree(zctx); } @@ -39,9 +47,22 @@ static void *lz4_create(struct zcomp_config *config) return NULL; =20 ctx->level =3D config->level; - ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); - if (!ctx->mem) - goto error; + if (!config->dict) { + ctx->mem =3D vmalloc(LZ4_MEM_COMPRESS); + if (!ctx->mem) + goto error; + } else { + ctx->dstrm =3D kzalloc(sizeof(*ctx->dstrm), GFP_KERNEL); + if (!ctx->dstrm) + goto error; + + ctx->cstrm =3D kzalloc(sizeof(*ctx->cstrm), GFP_KERNEL); + if (!ctx->cstrm) + goto error; + + ctx->dict =3D config->dict; + ctx->dict_sz =3D config->dict_sz; + } =20 return ctx; error: @@ -55,8 +76,18 @@ static int lz4_compress(void *ctx, const unsigned char *= src, struct lz4_ctx *zctx =3D ctx; int ret; =20 - ret =3D LZ4_compress_fast(src, dst, PAGE_SIZE, *dst_len, - zctx->level, zctx->mem); + if (!zctx->cstrm) { + ret =3D LZ4_compress_fast(src, dst, PAGE_SIZE, *dst_len, + zctx->level, zctx->mem); + } else { + /* Cstrm needs to be reset */ + ret =3D LZ4_loadDict(zctx->cstrm, zctx->dict, zctx->dict_sz); + if (ret !=3D zctx->dict_sz) + return -EINVAL; + ret =3D LZ4_compress_fast_continue(zctx->cstrm, src, dst, + PAGE_SIZE, *dst_len, + zctx->level); + } if (!ret) return -EINVAL; *dst_len =3D ret; @@ -66,10 +97,21 @@ static int lz4_compress(void *ctx, const unsigned char = *src, static int lz4_decompress(void *ctx, const unsigned char *src, size_t src_len, unsigned char *dst) { + struct lz4_ctx *zctx =3D ctx; int dst_len =3D PAGE_SIZE; int ret; =20 - ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (!zctx->dstrm) { + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + } else { + /* Dstrm needs to be reset */ + ret =3D LZ4_setStreamDecode(zctx->dstrm, zctx->dict, + zctx->dict_sz); + if (!ret) + return -EINVAL; + ret =3D LZ4_decompress_safe_continue(zctx->dstrm, src, dst, + src_len, dst_len); + } if (ret < 0) return -EINVAL; return 0; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.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 40C44745D9 for ; Wed, 15 May 2024 07:17:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757464; cv=none; b=JX0pXeriJ62RdUpJtF52p36ciUrp0DMw0b/iNFIzon4y+3ooYX78lNY1/XmqoeTBg2+LKIlWcyZ5AmglWkbdaTwjN3hhlaN+LUdkpQRJjbsqhNtzVzBI1OgdAx8tDJXJrqr8GYXp6LZtBNt01WI8LGuJNLZFxrBAf85mWv3t0ro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757464; c=relaxed/simple; bh=vwOiFI5WYyrjHytmKrfcWdUOay50C5Amcx9THlRsWqQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hyhfop7tvfpvZpowVdbMpidzqELghpLXem+G+ncL4B8v+849V/zS+wnnQobSVWN6swXUOin2a3L7ScBRUftBOcqQMDTu7Da+5foQ1jF39LsDTc+ZVUiwzZgUiWug7jLdauwcegUNHFGJtSUyDoC0iBOZ6VLo0wZJc9g9cZIw1T0= 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=bTXAM2h+; arc=none smtp.client-ip=209.85.214.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="bTXAM2h+" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-1f082d92864so16528875ad.1 for ; Wed, 15 May 2024 00:17:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757462; x=1716362262; 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=NWMx/siR7FY9UCYUHf6j2VRPjDt1sZ3YrZXGDzQRlXs=; b=bTXAM2h+GhS9bRINMcGOldAw3OpEZEMGRHDRC1FifNDeNhfo3OJYmzpJGHaWJ8Ksei Hu6WsJeiWQjcqMkIPGu2YoDWPxzcytREKOZun2lRdj/zdNs+5ZWnjI27UPhX+RGjon0H X3vaF7/4KDKSRsiBa9CDkRHtUT8I5PcTnLyL0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757462; x=1716362262; 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=NWMx/siR7FY9UCYUHf6j2VRPjDt1sZ3YrZXGDzQRlXs=; b=OcZ+Z8qghOcyhjk4jCH2djveKAClMGhRf4TnI2GhRzkVJ5vVC+5GYZ0c1H5VPhMC1M M5NBU00Ts1GlSQM/hzdL9iuL3OJqPwhZwGQ0E3hII4ep1DGKHYXwxpvvOjQVN6k6IwAM mU78qbP8cloK4TGn426PrlOZ538gHDhMlTCjXxIRNwO+MzaN2p54nBC99aYsjfaEklWA l+lRGrDDrPrsuelv/xQXkIM0z7EHZ92+T/9Sr5iVJS+AEdFFTLf2KTH355K0mgp0wvd8 bDDuql2uf+yEo/bCiVZyXrRtopoqQiSsya/AHvFB9cO+qVuRrP8nSrnfmcAvPjS8fj5v 0WfA== X-Gm-Message-State: AOJu0Yz1vRYSrIwuBBO76RzMNzg04dh88A3DtHI67w8STrcJbzl6cDQ4 jsvFDVa46Hpjbij5OnYB7Stbx846V2omtPRVY+9FmqcfGAbQD9o1gY2h+oOptg== X-Google-Smtp-Source: AGHT+IEAZvvWI3L3dp2OnVta0kR0smXesfqE4//K2Eg9tSM/PQOb96+KhvywxjLh/WRSanjCEV8rcw== X-Received: by 2002:a17:903:1209:b0:1eb:6477:f2e3 with SMTP id d9443c01a7336-1ef44049595mr180248885ad.49.1715757462340; Wed, 15 May 2024 00:17:42 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:42 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky , Nick Terrell Subject: [PATCHv4 19/21] lib/lz4hc: export LZ4_resetStreamHC symbol Date: Wed, 15 May 2024 16:12:56 +0900 Message-ID: <20240515071645.1788128-20-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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. Signed-off-by: Sergey Senozhatsky Cc: Nick Terrell --- 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.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.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 5D59676023 for ; Wed, 15 May 2024 07:17:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757467; cv=none; b=Jh/hZumLNL4qMZvaIK980AoYe6AobcgOogF5TPTujw6tTpzRxtZn0CmjmURht/DicVRQXn4k1LNJArSxgj0d4l+gWetOdzV5dD2+ItHlBvfyR+Zz8fK7qTqKasaUUGWhnKDKQcbWIWhEmqGmscCK9g9QHuxPCD7WreBoubyOqIg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757467; c=relaxed/simple; bh=qtvmUsQREyXmjeLbpuxebnWi3agfG2+3rkkIDgBbtXg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fHJDfHM/EFBpy2AQwk26Qay7BeaQW5dVrHTot1Mt+tUJezHqfz8F1D2Aknr4nBvqs6Ii2xIIrjUyNnBlz6MngF7nhoHOFW2FIf2POF94M6c9aJUfSYkPnd9/5o2P4KPZ8Nl5SOvQU58vO2137nPOKR+lildL0UpNh3YSvt8DrvI= 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=Fdh7B8/Z; arc=none smtp.client-ip=209.85.214.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="Fdh7B8/Z" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1f08442b7bcso14077165ad.1 for ; Wed, 15 May 2024 00:17:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757465; x=1716362265; 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=fHfG35o7+8/7OU1lSE40PRM3WsVXKsxMJUAQYr8zh6U=; b=Fdh7B8/ZhcGrI2v5MO0se01y9b5gbob6rKAnF1fJY7gwhE8c0SUAhpUFtyHzHOSq3Y 0hugWD0WUKa+/NJByWV/RAad3bt4YtwXF3YVLhXA+F1sFpRKzVymT0gXY6Js+QCyGkkk ZOfnWzBX5WjLBwZVK+j9FzJzfuZvGYydJNZGI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757465; x=1716362265; 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=fHfG35o7+8/7OU1lSE40PRM3WsVXKsxMJUAQYr8zh6U=; b=UZIKd0u/AWIT6cwMSgivx+WHfhVXKsNHXiNcUprQwRM6x/AkJPE6+qSKAYHIxHYtxi tb8qAtynwEN4OMjNAXNEX/nlYI++ZtW9wfLtkxuaHAWXPnjaXWUSYrlBYRZI6rJyH8aH ZD1GGXzbgVC+IkobsBlIF/ekLpMgk5OR+eIlLT1wAGmYhJlfOQTBbyEVW054YDOaDlDI kDDSxKyTV5Wk00I8UKdm1fHqUYMUipXNSag1q676z1suHnHjbUzlKMFKdzhJEkV9wtQo Y33P3vgiGvAUY2BxeysKoMfgSENUWwCE9YH84V7NtFV4z713UY8n46GJ7i5RzV/yLqhX vlpQ== X-Gm-Message-State: AOJu0Yw90UaccmtDL92DP3OLYFHgu3GUlcxnZVEZNiUWrAK+03syOhIr 2lmjc9zATq2nYM/rWRZelaUIoIpuyfk+Kok+Uyczis0rqchtk0a84jSI1ISBxg== X-Google-Smtp-Source: AGHT+IFWdGVgCe1JBmXZ3hDnpc6dFO9Vvt71Vj0tCFKh+5tnuApc6QuAnmJpi2vhaAxChIPFAqL2cQ== X-Received: by 2002:a17:902:8542:b0:1e2:be4b:dd9f with SMTP id d9443c01a7336-1ef43d29670mr140437795ad.15.1715757464806; Wed, 15 May 2024 00:17:44 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:44 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 20/21] zram: add dictionary support to lz4hc Date: Wed, 15 May 2024 16:12:57 +0900 Message-ID: <20240515071645.1788128-21-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 - default lz4hc /sys/block/zram0/mm_stat 1750315008 609010918 621006848 0 621006848 2 0 3428= 8 34288 - lz4hc dict=3D/etc/dictionary /sys/block/zram0/mm_stat 1750319104 499629401 509485056 0 509485056 1 0 3428= 8 34288 [1] https://github.com/lz4/lz4/issues/557 Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/backend_lz4hc.c | 54 ++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 428b393371d7..c928f94f30df 100644 --- a/drivers/block/zram/backend_lz4hc.c +++ b/drivers/block/zram/backend_lz4hc.c @@ -8,6 +8,12 @@ struct lz4hc_ctx { void *mem; s32 level; + LZ4_streamDecode_t *dstrm; + LZ4_streamHC_t *cstrm; + + /* Shared between C/D streams */ + void *dict; + size_t dict_sz; }; =20 static int lz4hc_init_config(struct zcomp_config *config) @@ -26,6 +32,8 @@ static void lz4hc_destroy(void *ctx) { struct lz4hc_ctx *zctx =3D ctx; =20 + kfree(zctx->dstrm); + kfree(zctx->cstrm); vfree(zctx->mem); kfree(zctx); } @@ -39,9 +47,22 @@ static void *lz4hc_create(struct zcomp_config *config) return NULL; =20 ctx->level =3D config->level; - ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); - if (!ctx->mem) - goto error; + if (!config->dict) { + ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!ctx->mem) + goto error; + } else { + ctx->dstrm =3D kzalloc(sizeof(*ctx->dstrm), GFP_KERNEL); + if (!ctx->dstrm) + goto error; + + ctx->cstrm =3D kzalloc(sizeof(*ctx->cstrm), GFP_KERNEL); + if (!ctx->cstrm) + goto error; + + ctx->dict =3D config->dict; + ctx->dict_sz =3D config->dict_sz; + } =20 return ctx; error: @@ -55,8 +76,18 @@ static int lz4hc_compress(void *ctx, const unsigned char= *src, struct lz4hc_ctx *zctx =3D ctx; int ret; =20 - ret =3D LZ4_compress_HC(src, dst, PAGE_SIZE, *dst_len, - zctx->level, zctx->mem); + if (!zctx->cstrm) { + ret =3D LZ4_compress_HC(src, dst, PAGE_SIZE, *dst_len, + zctx->level, zctx->mem); + } else { + /* Cstrm needs to be reset */ + LZ4_resetStreamHC(zctx->cstrm, zctx->level); + ret =3D LZ4_loadDictHC(zctx->cstrm, zctx->dict, zctx->dict_sz); + if (ret !=3D zctx->dict_sz) + return -EINVAL; + ret =3D LZ4_compress_HC_continue(zctx->cstrm, src, dst, + PAGE_SIZE, *dst_len); + } if (!ret) return -EINVAL; *dst_len =3D ret; @@ -66,10 +97,21 @@ static int lz4hc_compress(void *ctx, const unsigned cha= r *src, static int lz4hc_decompress(void *ctx, const unsigned char *src, size_t src_len, unsigned char *dst) { + struct lz4hc_ctx *zctx =3D ctx; int dst_len =3D PAGE_SIZE; int ret; =20 - ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + if (!zctx->dstrm) { + ret =3D LZ4_decompress_safe(src, dst, src_len, dst_len); + } else { + /* Dstrm needs to be reset */ + ret =3D LZ4_setStreamDecode(zctx->dstrm, zctx->dict, + zctx->dict_sz); + if (!ret) + return -EINVAL; + ret =3D LZ4_decompress_safe_continue(zctx->dstrm, src, dst, + src_len, dst_len); + } if (ret < 0) return -EINVAL; return 0; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Tue Feb 10 16:22:05 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.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 9E34F4C631 for ; Wed, 15 May 2024 07:17:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757469; cv=none; b=kqvTr073vN6SEEO5bejkxo2nzYXdsew+sGczcQCNVy2TKYr2IFZNgcdPC3zDlQWR5f2Vd73jEb4CWL6/qSfg5YQdK6kGUtxU7KAzuRFqy2BakybKqSZd1kXiu/0SSRTKcSworXIibmRx0C93xj5y7bpYEBlJ6r1EY0p2WQHVlSM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715757469; c=relaxed/simple; bh=0QKD/VRLqE4UJhTMThwx4W0GPaxzgatlvvK+3EE9Gd0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ictz6hF1GcdpUj9PRkuzQX6jmRtVoFxCkqHAqI7beLai8ojoEvnWrh3uqAfgvRTc9unZ8FdWu/rp2fagtY3VRuFrfNO+uykk5q+6N0PHn0cIGsgTKc2r7rHe36SZGWCQzvpr1ElfDfOVJa/XEsHguYHIpQ3BmamfbQ0s1UyEsas= 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=YHQzgsw2; arc=none smtp.client-ip=209.85.214.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="YHQzgsw2" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-1f05b669b6cso36652445ad.3 for ; Wed, 15 May 2024 00:17:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715757467; x=1716362267; 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=ow2rUHFnrcYhlTotFbBj4Gwxyq4hSnuB9nn9e+mMxIY=; b=YHQzgsw2miaw+A94pdrS9zbw6+Yen4uDKAHCSsd+5Pv/WyQAA41PeR3hs1rChZ6Yc9 CPSflOIuyfyGCdPWV0kx5WKzNQ/E8BsOREcSthOX/Vb58PcCkQ7RNy/on1u5NRyRWuxV 10TMPfYFcNtQe4w9M+ZBzIRuCTEv6/IFvkLd8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715757467; x=1716362267; 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=ow2rUHFnrcYhlTotFbBj4Gwxyq4hSnuB9nn9e+mMxIY=; b=LcGpkSi1fgpdMZzjx1GCunGr9GuZvEf0KPWu45tdKq6w0nJDP+GspK2elR6Hq9e3Bi V7eEv/aNFVf8moQg9u2uwP2twKEbgrF8qHU1Uh3hfv6D/6w4YUYhmCm5uam5cFN3ZV3n cIRaIIgJ2qZ0Do1+nXubils2mMEPEPztNjKybkPpcyGbEBQdsOVB+4CaveI2HzI9zuSI yQY11/d+pN+Hi3SVRYIL7Rpn2xiqrbXqQ8KYMkodLhP8NQSgoDQ8DFFDtLEDrdmxJzGQ Ke9KlVr/wzw/YYFBqz6v6Gaeqq/IUOp9s8+Zk0tTAIbPUT7eETax5Z3kXf1Tv2GACU4l iiiw== X-Gm-Message-State: AOJu0Yy9Gii8ux7khGQWJSOrUgyUwDrhh/2PRPEsRZNh7EBQZLrF9T5E nlSlwgBjuxiF2rjdpC9mpavC4CrsN5Nl0NtUlCaaKIdpWA2JZp3s3tfGqQA66HkcRizijtyl6QI = X-Google-Smtp-Source: AGHT+IFUXSL8PagKambUAn3JNk1vaS0WDwvdWErdRIsdpbLz+NRveFk3xgU/oe2NPDEqLe4EoIXhzg== X-Received: by 2002:a17:903:984:b0:1eb:7746:4248 with SMTP id d9443c01a7336-1ef440495abmr176201825ad.54.1715757466991; Wed, 15 May 2024 00:17:46 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:111d:a618:3172:cd5b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0c136d53sm110941605ad.254.2024.05.15.00.17.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 May 2024 00:17:46 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 21/21] Documentation/zram: add documentation for algorithm parameters Date: Wed, 15 May 2024 16:12:58 +0900 Message-ID: <20240515071645.1788128-22-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240515071645.1788128-1-senozhatsky@chromium.org> References: <20240515071645.1788128-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 | 38 ++++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 091e8bb38887..58d79f9099e3 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -102,15 +102,26 @@ 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 =20 4) Set Disksize =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -442,6 +453,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.0.rc1.225.g2a3ae87e7f-goog