From nobody Wed Dec 17 21:02:29 2025 Received: from mail-oa1-f49.google.com (mail-oa1-f49.google.com [209.85.160.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73D8B14F133 for ; Fri, 3 May 2024 09:18:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727921; cv=none; b=tkw4nrvK9QH8H2YLYo8zSvl+2b8g6L5zpfJ/35drUcHTf336SIcAKI2x6flpZtSOEFh0DWY2e5WLUFZrvV94o3/9BxJ7IlWUjqzbM47A9CF5hXPt9oOAtn2WMfxY+bglGW1/pSybwMTXsHEtNeI16iw3uUVZbvqpPAQGllJsCMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727921; c=relaxed/simple; bh=8qI5x0BGUJs1JbjZreFI8Kvjdzxo5r4XEf1ADBnlo2w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q7QM3jm6B00fRwg9QmNtkkKDn3gIHu0w7MWo9LEebEc1kdp8Tn1N9jq16JJTJNsnVBnNLtskFaP4METTHR50FMNz1KeMe1aQuy8Z9ewn77/NUFz2HZ0vAPf2sB9doaTd2XmGeKHOe9PotJVowB6d5Z6OlmPoY5plD9Dkee6aI4E= 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=c9+UA03u; arc=none smtp.client-ip=209.85.160.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="c9+UA03u" Received: by mail-oa1-f49.google.com with SMTP id 586e51a60fabf-23d1c4c14ceso2084560fac.0 for ; Fri, 03 May 2024 02:18:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727917; x=1715332717; 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=cJ4glZLOzUHMCYOraHYCv1mLDw/pz7BmHlcE0TlYg0c=; b=c9+UA03uvUs1V2R+ZCHejrNQRpkcOXBobzuR+L7cteT4uCILpWq3h4WNDub9DwHffn t9H/EmHAn7Fl1cNOP4KlVYGiaec3xJMGyeuv+5vfAK+G35DJPxV0smGl/MrUrWnKjE8q UlAJI3aORIrG15jD01e7tQpa0RMBbhJnx7o24= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727917; x=1715332717; 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=cJ4glZLOzUHMCYOraHYCv1mLDw/pz7BmHlcE0TlYg0c=; b=w33sNnxDcvkIhd/gITq/380CoNFKRLv5nVF7DaaQ9zd0Jf11sJuDY7jvUuyo3F64hH 6rjAX/XZQkRVWYY0i/pECFm9q7bBeAy1wSmk8D+z1ZkPOMEjNVBC5/pT80Fe3lyo5EMU z7UM8OHaIkOrPnihltvaYlmndzf0BJhgY/G4uGR0cXdeRsTAKKF3viXVqdagbcC3nSCm G4bjPdtW+IX9IUJHsPNi6uXT+4MEy+WFCpjypPoZ4Jl0YMCWSXVevXPWUVTHHRDiLdMm gbJX2WpezjXg/VpzdY8+AnBS79JITLYbp8k3iZNCpqMEKSchQqLS0admYG0FvQwDIssR W4YA== X-Gm-Message-State: AOJu0Yxda7Kz7Ivn/BpLhyLocmhQXhoO4G8J9mn7fLpLArDKBbpTpat7 LG4AG2oFCTl95qbYKkcUhp7QhXVjcl1AIc1VKtgOOnCl+UhqBGG90EBZFUgTRA== X-Google-Smtp-Source: AGHT+IG3/DOPyEruvDY4xyjmMPgKLII65oEhHN9e9xgH4i9GM6Fy5jlXQWaJES0dOYOMr50Hv1mKlw== X-Received: by 2002:a05:6870:c194:b0:23c:f506:4b67 with SMTP id h20-20020a056870c19400b0023cf5064b67mr2584581oad.33.1714727917370; Fri, 03 May 2024 02:18:37 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18: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: [PATCH 01/14] zram: move from crypto API to custom comp backends API Date: Fri, 3 May 2024 18:17:26 +0900 Message-ID: <20240503091823.3616962-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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 4cf38f7d3e0a..298ef0e97e03 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1342,7 +1342,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]); } @@ -1429,7 +1430,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)) { @@ -1616,7 +1618,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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.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 AF38F14F9C6 for ; Fri, 3 May 2024 09:18:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727923; cv=none; b=HqVYOQCNEqGm4Ee8WyJafPeiry+HcdAyYNnGTFpx0iRMaAk0tpNFiIHcArZ3ydnE4t13WGNcwv60ii8CkyPMf1obQpFnAqjjor1mEOFattDOI2BGfLLwlNChm6MyTSerO7yithZarqGXwT5K1WN9BJlhCrHTF466bLZ0MndgJ6Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727923; c=relaxed/simple; bh=mEwa89al010i30vmHvrIanhFp5RXfZdT6uAc3nZPiu0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C6YytLTnW9+z8qRIH9CUWvvGbeGeKPncT1Hjm5KBLvDenvhfyJX6pcauNN7zX1PUQzHI5RDVeGjKhDzimyYES1QrGQIPqtfbOqnTd+q/joBLff+TJD4B7KAkqS2gEVDzcR9k79Bjw2LIOLP+JGiRblVlTbi/8Ghy40a2YN7x3DM= 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=fuKCh0K/; arc=none smtp.client-ip=209.85.210.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="fuKCh0K/" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-6f4178aec15so3007020b3a.0 for ; Fri, 03 May 2024 02:18:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727921; x=1715332721; 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=rsYTiLxr0Q8ahUxAJy9KMUOYceFG4XaXgzEH0fKzHJw=; b=fuKCh0K/lgIHzQ5VG4Ncz+ZTmBx8JxzY6es3phvPtgVcu6HpcWdLpoAb9yMLAVcjI0 r4EUhKPYRTG3vMST4X3aYjUflVGiwL/n48DGKgo4JYwsqda+rk/ldj8JZYlyZZGzSf7+ m95b7YcjZQN8vOyB2pnxOMuI1lXdI8QdM4Hok= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727921; x=1715332721; 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=rsYTiLxr0Q8ahUxAJy9KMUOYceFG4XaXgzEH0fKzHJw=; b=Hepy6UF86srXX59YOlrBxBL7cyfzX9zXwORZ38DhWQvOmIFEDdYPFGGq5McKg9JTkr AiX3dvzaByXEKvR58dC/CZ/P7tbSEOlzHYtgn52hLFdwyMcElN3IC7/eA/hoEL/q0DU8 jwVUyWvHKGIg58eB8XIN5c02smwhqlvIoo/kwXn6TBaY+5rw7sY5TMLRe99jegw5Eapa cUMeWy7UCUDUd7H2iTfLHW8JXF8GvTAueYO3hOgmF0TGUQuYmM/2AtFc0Ti8Yh48G0xf rRL4JVMNz5WVlkMZW4nOSWHCI58e6tI36oNcWMfGflVL6BaSwDuAyFcbqbH7GMQq+a4h DZbA== X-Gm-Message-State: AOJu0Yxd6kKtykD587PkQp7tDzZbRjogxvZbvAmp6qQSz0ecFh3Omdg5 +1AwCO3xjYL23r+xQ2aYEWrt81MfVSLFJwBU74w+Q60CIxVto6eg734LUrlnR+il+0IAa7rnmUk = X-Google-Smtp-Source: AGHT+IGxiRB7vnvbkRHjvRHbvxxuWmfnDZ/iS/JstbN0VYZKn5HHEsL5Fm4jdS2OZ5SG/gAbZyIyLg== X-Received: by 2002:a05:6a20:d493:b0:1af:363d:64f5 with SMTP id im19-20020a056a20d49300b001af363d64f5mr2379485pzb.39.1714727920866; Fri, 03 May 2024 02:18:40 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:40 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 02/14] zram: add lzo and lzorle compression backends support Date: Fri, 3 May 2024 18:17:27 +0900 Message-ID: <20240503091823.3616962-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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" Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 24 ++++++++++++++++ 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, 142 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..a1fe8b989ee2 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -14,8 +14,32 @@ 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 + default n + 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..2dcbc9b75d91 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only + +obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o + zram-y :=3D zcomp.o zram_drv.o =20 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..d9a003fbb360 --- /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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB89214F9F2 for ; Fri, 3 May 2024 09:18:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727925; cv=none; b=owjebyxXsIBas9oos5w+KtUQ8HN1Bgm6C8mfCpVNt5v4FNunBs+yRZuybp4HRm9UN0PoU26tsdJEazLJpZUAoZ6V95R9NLZkTcpTnlg6g+f3A0X1dMX3yH/Tnqp+CbVFEWgCTYnV5UFNwnskGuv7jfW+FwRj5gIa8VM3GrtJJ9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727925; c=relaxed/simple; bh=EKAT1WJh1EliVsTf5ivSjhdf0Ww0Lxw//zNfOlfD/R4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F1/XvIY+nWaGUNgKfnlN+HiwhMO5l0fBexJLVyaNYuSoa2SFiSBhdcpHp07trj49c0l4wml1yf/hFkoTKCuARZWHt6y85OszKrDZ0s1OCEj7GskhnW9DOqtpkAVfWvd3v7/QxFng9Iza06WB77juLfOl0MdqtH6QM2UudAOITPg= 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=gvfitemo; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="gvfitemo" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-6ee12766586so2228481b3a.0 for ; Fri, 03 May 2024 02:18:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727923; x=1715332723; 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=jVS3+TSlg0IqVrQHwIV1m7p4VAUVoaOGVLA7sdPdngs=; b=gvfitemoeBBMYIjFQz43cgxT49nmrxppM1yjkSPhjE23jj8KkvbI5LV9K/UW/hIhD8 /dvFGcY0OT+jGwn6f4+BfYfyh/VOdVTDxKMNE8FFNYry/ckxNwaNC5bVn/UMnQ6+VGJD DwowwjT1Rb+1kfZPG3Fw9KW1VbPRvi4sZNfOo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727923; x=1715332723; 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=jVS3+TSlg0IqVrQHwIV1m7p4VAUVoaOGVLA7sdPdngs=; b=EVEuq+JUKBc+Rs05qPqEXY43jWiZ+DVvZEbFJTZwdg6rKFWypbQZw+zf7ov4bIaXdA +uXqE2lsJ1eA7D3935clXLY+DqPc7gFBf6KM4rEtkqdPHkTzlXrfLriwyd6ES9XKQtOE lJyDBT/PoGZFPCw7qEJcnFHTciUhQd1pijhg77bVjdTjwyEECO5AEkM040bt8B/Tnd7S czA/joT8FhMbR43wq+nvitNMKOwxAoe50RrVAxFpUnKAUMIzlYIdECG9ISn/+ptkTGIh kvkAse07URjd37UKv95TUa5BK3BIBHIqZgTAwJQan3J17PBFON9MK3YXX8WPyoha8HFr ZbJQ== X-Gm-Message-State: AOJu0YxGkXBFp7lrc7F1cMsP9uXw5O4p3+Ls/IsURAWy96idSjC0jNa2 AnX1jcMNwSHdMXuMO5kUFKPcwUjT+BlupeBjTvR+BOmlFbFpBlIYi/TsGIi/0w== X-Google-Smtp-Source: AGHT+IHpun0/Mf7vhFFOo7XO2Awdr9+kxI65A2c+6ONOuFY9pNRz/FqYS7TM3psXW6WeZSYOCJ5Lqw== X-Received: by 2002:a05:6a20:c91c:b0:1a9:509c:eba6 with SMTP id gx28-20020a056a20c91c00b001a9509ceba6mr2972873pzb.25.1714727923145; Fri, 03 May 2024 02:18:43 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:42 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 03/14] zram: add lz4 compression backend support Date: Fri, 3 May 2024 18:17:28 +0900 Message-ID: <20240503091823.3616962-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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" Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 12 ++++++++ drivers/block/zram/Makefile | 1 + drivers/block/zram/backend_lz4.c | 47 ++++++++++++++++++++++++++++++++ drivers/block/zram/backend_lz4.h | 10 +++++++ drivers/block/zram/zcomp.c | 4 +++ 5 files changed, 74 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 a1fe8b989ee2..02d20a30bf6c 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -21,6 +21,13 @@ config ZRAM_BACKEND_LZO select LZO_COMPRESS select LZO_DECOMPRESS =20 +config ZRAM_BACKEND_LZ4 + bool "lz4 compression support" + depends on ZRAM + default n + select LZ4_COMPRESS + select LZ4_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -34,12 +41,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 2dcbc9b75d91..1be5d2657960 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only =20 obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +obj-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o =20 zram-y :=3D zcomp.o zram_drv.o =20 diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_= lz4.c new file mode 100644 index 000000000000..697592dbabe2 --- /dev/null +++ b/drivers/block/zram/backend_lz4.c @@ -0,0 +1,47 @@ +#include +#include +#include + +#include "backend_lz4.h" + +static void *lz4_create(void) +{ + return vmalloc(LZ4_MEM_COMPRESS); +} + +static void lz4_destroy(void *ctx) +{ + vfree(ctx); +} + +static int lz4_compress(void *ctx, const unsigned char *src, + unsigned char *dst, size_t *dst_len) +{ + int ret; + + ret =3D LZ4_compress_default(src, dst, PAGE_SIZE, *dst_len, ctx); + 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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 365A31509A1 for ; Fri, 3 May 2024 09:18:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727927; cv=none; b=gJ/czeQP/lUD4dXuQnwuBucvTgHts3xi38w0+tnePL7GmbBuQ2leXO7lFcljuWBld4vq/wWn/rcZawT56EpCMpjoOYnMpKvgEdYa7HROPMZFsVkL2JPnzyfbdSAcvN8EtUmgVZqCTOq6nZTItCr0s2rkd3kFTgXDEPyvcQFn134= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727927; c=relaxed/simple; bh=41WGShYHYQ8vBwtm0qoCyiFMZwVAWOWL3iNh5+RpFK8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o3ibTuQlSC5Pir1TT+IOkqOW4WTcJBEPzP2HX4xyD2XseJ/rEKo43CjfoWniMh+V+eeIWBxjbo9dfJdSbdxomffQvd68efs4nRGLbuURUqr2o07MmQbKXT67NWhqq0P6lXjOYVyAFi8QkFM3tyJDXGeIUe5eatgSRJeAojuFKz8= 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=Rda2xC4z; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Rda2xC4z" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-6edb76d83d0so7800372b3a.0 for ; Fri, 03 May 2024 02:18:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727925; x=1715332725; 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=B7PfZsfM+KAkHMFzQDzf1KFOCZ0ztSCuLUJnOMeN/zg=; b=Rda2xC4zzY3NEUxcjnoO2+S0kV+n87O5ocHnvHRwZigxFip0AfihlLZkaNXf2yCtsz O7orGrMClUxUnQeKuejARwowwSrc5rdAUvz/ieAX8DFhXNeFRCchkYoE7DpbssNSgiR8 zyGt0Vb1KXoJKb/p8n2bCyyN1cowBnbfgBeQ0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727925; x=1715332725; 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=B7PfZsfM+KAkHMFzQDzf1KFOCZ0ztSCuLUJnOMeN/zg=; b=e9Z+54wKvQ+I9ByZtS9XAfAMDou9gMlOpgvGbkbrm1P6jikXzRqLRgfFTm8O5okzJa gnkAt8jkMb6TWLH9sIRyG0PilF1WZCqKEDO1h4/mAO6lwk9Y2Nb37t4rYEmFeOjw4fUg MC7V48t7w8wnRy4LP3Fajswt8vEaEy7nti/XcUOSU9PF42icy1V8eNCr9Bh2lvM7EIHb ONbqvW49H2k6Ch/p0hlDh+hiAnuSdhtr0SOMoQALohKw8yv7UHW5pAXtbFO1t0erBRqn J6mmOEgzBvW2bcI5MhIFu3BIgR0JduMG/zskmr908HQXPaAY7Ti0u2H0N/IMFJ1IdNOs pmaA== X-Gm-Message-State: AOJu0Yyp5U3WG8Jk3OFMeH24oCI7VVlDI7uvX4JaSfJhaib5i0JFCfpg HZLNrJvbo0QwYW87FiWQBLmXP+UwiKCFf5nfeEPOWgBfgZQ131TkAjczJ88xiw== X-Google-Smtp-Source: AGHT+IGYDjEyHh33sVMrjW6dkor3Yv3bjKBgj6DbpVaT8/FuQR7czjo8jql5dr2swcGEFrNBroht+A== X-Received: by 2002:a05:6a00:1704:b0:6f3:854c:dee0 with SMTP id h4-20020a056a00170400b006f3854cdee0mr2304565pfc.21.1714727925445; Fri, 03 May 2024 02:18:45 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:45 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 04/14] zram: add lz4hc compression backend support Date: Fri, 3 May 2024 18:17:29 +0900 Message-ID: <20240503091823.3616962-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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" Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 12 +++++ drivers/block/zram/Makefile | 5 ++- drivers/block/zram/backend_lz4hc.c | 72 ++++++++++++++++++++++++++++++ drivers/block/zram/backend_lz4hc.h | 10 +++++ drivers/block/zram/zcomp.c | 4 ++ 5 files changed, 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 02d20a30bf6c..8a775fd66eb9 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -28,6 +28,13 @@ config ZRAM_BACKEND_LZ4 select LZ4_COMPRESS select LZ4_DECOMPRESS =20 +config ZRAM_BACKEND_LZ4HC + bool "lz4hc compression support" + depends on ZRAM + default n + select LZ4HC_COMPRESS + select LZ4_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -45,6 +52,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 @@ -52,6 +63,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 1be5d2657960..815b45471c7d 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -1,7 +1,8 @@ # SPDX-License-Identifier: GPL-2.0-only =20 -obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o -obj-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +obj-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +obj-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o =20 zram-y :=3D zcomp.o zram_drv.o =20 diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c new file mode 100644 index 000000000000..5c437623aa65 --- /dev/null +++ b/drivers/block/zram/backend_lz4hc.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "backend_lz4hc.h" + +struct lz4hc_ctx { + void *mem; + s32 level; +}; + +static void lz4hc_destroy(void *ctx) +{ + struct lz4hc_ctx *zctx =3D ctx; + + vfree(zctx->mem); + kfree(zctx); +} + +static void *lz4hc_create(void) +{ + struct lz4hc_ctx *ctx; + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return NULL; + + ctx->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); + if (!ctx->mem) { + lz4hc_destroy(ctx); + return NULL; + } + + /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ + ctx->level =3D LZ4HC_DEFAULT_CLEVEL; + return ctx; +} + +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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E75A1514E9 for ; Fri, 3 May 2024 09:18:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727930; cv=none; b=Z330juR2yT90joaKfzsLIyqzWQALCqtuLLJSrZoPFYowhE6eH0Eyw1Ytwd5qfGAJwMOD50P8VRp5bfRHhRIVH/lGR3c9TU1vo35V4n9/CYFRATJVIBCwSvkW2RmG+vICyvU0ASHeFQmdWV7qXsr+y275WFCyEM09RcPyrrZcgN8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727930; c=relaxed/simple; bh=UiQnMZLw8RwVg3ced8tmphDbv+yDA/RRNiSvmNQXoHM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B5+V99g76MmdQThZdtY4J/EtoebeKuoKRsJx4aKbnvFqtHawsw9aeaWoc0rjFvPjO6jrY8SKS4a2FMv79u3q4qlBSv9SMoV1R1hdvTlUuGs8Afl6s4X19LitCpS67lX+RE6/fLioYgzp3mJhsLn0ia2wdw3ua/hzdB+0B/GLlH8= 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=Gs2lgwwa; arc=none smtp.client-ip=209.85.210.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Gs2lgwwa" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-6f45020ac2cso72047b3a.0 for ; Fri, 03 May 2024 02:18:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727928; x=1715332728; 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=xaKaXBAH/caXTF/rNTkmiQFfbGJZCn5VHOotq+7w/ag=; b=Gs2lgwwaqn/Ki4MpP2/mhCOB9YJJhXYaCI0hZgu29EeYEtxSnOMAg2VsfjR03CDu+N WxC5CjXpLrik4aUO17v2apK+Y/QLGGD/rbd56t/O71vN0poFWAjBu5Exqdh8ZgSOTV5y +4kB6V13UkH2jD7xbIoAsUX+lCphrY3m8iZTI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727928; x=1715332728; 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=xaKaXBAH/caXTF/rNTkmiQFfbGJZCn5VHOotq+7w/ag=; b=lqBdxchmdxsdQAaaOEptOkZtEM+LkR9nl/8bRzys/uszt61gcXjV6pBnqGefQwvO+5 HPfkuefPwSB5MkNO/N/9NkaZklRDAs8ZTVaasP1tAX91NOsfmw3dYtqTcjIpqLaAkmlX uPjDRwJdb0Dnl0lSzZxyFq9R/T5g13aJTyEyV8vo76DAonNBNAZsfg2aWk0izUNAVkab sBtOfly95+KXoLlKkvAYPg3hZu8maXklOeMDwjm14izFjuk2iseaexXJrRYKHAJd/mKm mWRwLJxrNDl0KDBZXc8w2NxxBHTmq1cePShKbsBEdx0xj0OS4q8TQgDoiYE7yy/grDaY LTmA== X-Gm-Message-State: AOJu0YwJwLHLaR3fyYcD3PIlO1GCNwsMSi7UDH7AZ96lqgzyNeSPjYMr CeeySRv2wrK5laBz2y9FGmA4l+OI3K1iJ0UTFPhAIsaOaY9mtSr3cI983ZmNDQ== X-Google-Smtp-Source: AGHT+IEXkK9SHy1BKRvW2n1Hi/ESqZBt2nZsW5pDeC0ramDvrL6DtEsic/ibTfkToMn0IEsKMSRBew== X-Received: by 2002:a05:6a00:a15:b0:6ed:21d5:b03a with SMTP id p21-20020a056a000a1500b006ed21d5b03amr2462707pfh.23.1714727927743; Fri, 03 May 2024 02:18:47 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:47 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 05/14] zram: add zstd compression backend support Date: Fri, 3 May 2024 18:17:30 +0900 Message-ID: <20240503091823.3616962-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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" Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 12 ++++ 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, 124 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 8a775fd66eb9..d0f791a8c7bd 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -35,6 +35,13 @@ config ZRAM_BACKEND_LZ4HC select LZ4HC_COMPRESS select LZ4_DECOMPRESS =20 +config ZRAM_BACKEND_ZSTD + bool "zstd compression support" + depends on ZRAM + default n + select ZSTD_COMPRESS + select ZSTD_DECOMPRESS + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -56,6 +63,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 @@ -64,6 +75,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 815b45471c7d..053fe35e346b 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -3,6 +3,7 @@ obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o obj-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o obj-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o +obj-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o =20 zram-y :=3D zcomp.o zram_drv.o =20 diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c new file mode 100644 index 000000000000..4da49626f110 --- /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_defaultCLevel(); + 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 Wed Dec 17 21:02:29 2025 Received: from mail-oa1-f50.google.com (mail-oa1-f50.google.com [209.85.160.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4185152178 for ; Fri, 3 May 2024 09:18:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727933; cv=none; b=GV13KdIumwj4TRUDJAL7oWxzmOwg3duUl0dsTUQ9xXa1fHB/kMATSFPyeNBdCAJfL5Aayuhvj09xKVoChJl/DTNNio484kbBdMGIrUKsQom5srzho72qpmocHZ1eyF5Z6pA0sHIWrAlVpfazorvQ+kuhEba67x6/CF263jA4An4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727933; c=relaxed/simple; bh=FRBhLTt/FHOdPdldPK2JgCScJh/quKT94FOX0NLvGcs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AMzwiA/zVf7S9ygLsgQiUEbxpifrw7uKL0YhIuOtoMhx6PDUmpfUrjvPo0qaOFnVBnRcLqRhQn44BaKp/U3oHBYFJmP6I8w0qsFYP8krDzp3K2Or7PVfzHLG2BpdWh2JpXpPpCJMFGOqq4JJ+TWMkeQDXd+hRbKbyoKi0CN3QTE= 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=EMc7wIC5; arc=none smtp.client-ip=209.85.160.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="EMc7wIC5" Received: by mail-oa1-f50.google.com with SMTP id 586e51a60fabf-23db0b5dd28so1267820fac.2 for ; Fri, 03 May 2024 02:18:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727930; x=1715332730; 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=/EvmWJu/VXtBqzoQye3a2VzbJm8fhR7v5ZjISdbrAiY=; b=EMc7wIC5NUEBvoLR0RghV3ZC9TYqHnwzjIk5Dm6ARTzlnDAco3WSL1FEQ3E8ZDCdVG H1JxCVVRE9bt2MvNxIwk1phVZzUgdndZAyObXpS6ZIRvXYEdbeVb+zsiRQyn5ApjoNUG ai2CyJt+KrM5agpsJophSgiIY8HEfQun/5NI8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727930; x=1715332730; 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=/EvmWJu/VXtBqzoQye3a2VzbJm8fhR7v5ZjISdbrAiY=; b=C2FSAzB/1n7sJrsA2jkSupfQPi4HeI1W+zK1gXPHNT/Qn60m2LUVU3ksBYJFEBXiR9 jzzphqMBIIq9km/XFZ8pXEDzkV18NwBeQ5pyPvR5sPQnPzGOQ3yoZCofF8WowAXlBpDa vcnOFbYPIfqMVkvw9SxJu5zvwOgmAhdkrGbcauw+n+XjUrR66/lOVJr9DtGZSrtxtxxb q9KfIyrHjNw9gbkWdPt535gtsWkwKJcfgrVFKEun7ASpvZ9fmSg9jpo0ShTxuBKrJzER 8AifON/W1+Cmu9+cgfqVfXjvUpwk3QKM81OrchEaKit1bnhJ1IS2CBiEjefNodbGV3Oi 8uiA== X-Gm-Message-State: AOJu0YyxCtL1kKHTpKpA6mzBUwxQ+9H8LHnqVgJs6QASXkUQ/tFWAkba ylLVDKR81AOtqUx5QSJG+cBHCbzNSFOOiG900QYez85/TULm6Gt8nMhfCUp95Q== X-Google-Smtp-Source: AGHT+IGnK+gnZje9X1/6LlLksscKeRfA13xxM/lcnM8jorFHlscGGkr1Hyq2CL4aSNEn3iRHLZEmNg== X-Received: by 2002:a05:6871:3a22:b0:23e:7432:6f12 with SMTP id pu34-20020a0568713a2200b0023e74326f12mr681914oac.45.1714727930031; Fri, 03 May 2024 02:18:50 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:49 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 06/14] zram: pass estimated src size hint to zstd Date: Fri, 3 May 2024 18:17:31 +0900 Message-ID: <20240503091823.3616962-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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 4da49626f110..4a7734aa1a8a 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_defaultCLevel(); - 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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2CEA152190 for ; Fri, 3 May 2024 09:18:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727935; cv=none; b=uL4gTlKcUTXtS1YomZ+pEO4RzIC6ribv89NlVm6xW1GPfOcjB3uSqhxWOGHJBrRVWHba7l7KgYRJVjKkBII+xhEiJK+6L8OGXkmbJfJPOIrkZyL5h6CslxU//MbcQ8WC2m6nRtou8r7l1sEKnVT1OSHzdtaMl4KZoRI1Isjwnpc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727935; c=relaxed/simple; bh=HavFm53SyNwKHu2r7DaiECAhewcs+p7d7Tk8OFwhfg0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hykbBvuBUCN9GLyUD2JGyCvhLQGOeT+t2pI8mjZsrpWMN3V5mP3W5eWIBLDp9Kt3qw/4vJbWqOx6uzGeon1GEzmF6/zuVw93Dm9RY5z9Y8RRMm8D3ac2xuLFCFZOBUWUyRVQUXZ7FmSqaQLJV94IF+Ju8dV0LyBr/UO63IIVBTc= 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=J9QTQ/B/; arc=none smtp.client-ip=209.85.210.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="J9QTQ/B/" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-6f44bcbaae7so360525b3a.2 for ; Fri, 03 May 2024 02:18:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727932; x=1715332732; 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=B7mw/f9+e6QmK/dXzyr5OJ2nwO3O6lt6K2kT9/oX6Mw=; b=J9QTQ/B/8yuwEWCMa3SoViXlMphl5s+9W1mAQQ5ZQXY6acwf3Iqm068DfheA+KDokK z3TeVvc/XJaIw0dvh1mLb9mT3xYRnNQ7F9hwNwD8LtRb9q1t2P9aWQgJ4CKCuwDokZtC k5H6ZhxxXr/E/I51M0Pnuzqx0V5Kitu43QuIY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727932; x=1715332732; 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=B7mw/f9+e6QmK/dXzyr5OJ2nwO3O6lt6K2kT9/oX6Mw=; b=c7rEJfF2qiT5KdcSh5xEAhkXpVlIxM77mvweX8iY8G7HmTwGKMWDNax/tDeKRqGhy+ 8EMUb4P5jq4xIMuoDS20IwYPc0znTr155O7ZQY7idKH/FFjn0iwcxFfxJORIkM2h2kys GwRP7d/3CjuxWI/YMk7RN08q6jeAlRhIRuIDE1NzpMRvN/6OMb5tSlhx0G4fUlxWy/Oa IAg9CLY+Q99o7G4OwoU/uPXIrNGcNug7s+a0Gmhiwv3HcTLnmvNIFcl0ZRhHk6TLYFRT Dv29Nx98+kpcvtOuwh3QFbJqRUEdQwAx/v0OruUZKxaMjtpr+uF3X+866wBixKOilxKn qOdw== X-Gm-Message-State: AOJu0Yx6DEOtJodhXN3qLVQus5rUEJxZjMg88Wj9kcCtraz1zp7OT9jv jBCwRGZjknd6ez26g5dNrTClRW4ANLaa6HIu3Mwidh11dMRtuuWpeaUttAXfPA== X-Google-Smtp-Source: AGHT+IEBbR1rQRFf3Ph3wwjmpiiez6SSRvPKu7VXClGnjwH+shf/geHutn5dpVF739mOajIRz67jDg== X-Received: by 2002:a05:6a20:2d27:b0:1ae:84b3:bb62 with SMTP id g39-20020a056a202d2700b001ae84b3bb62mr2815071pzl.12.1714727932288; Fri, 03 May 2024 02:18:52 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:52 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 07/14] zram: add zlib compression backend support Date: Fri, 3 May 2024 18:17:32 +0900 Message-ID: <20240503091823.3616962-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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" Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 12 +++ drivers/block/zram/Makefile | 9 +- drivers/block/zram/backend_deflate.c | 130 +++++++++++++++++++++++++++ drivers/block/zram/backend_deflate.h | 10 +++ drivers/block/zram/zcomp.c | 4 + 5 files changed, 161 insertions(+), 4 deletions(-) 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 d0f791a8c7bd..7155a23d66de 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -42,6 +42,13 @@ config ZRAM_BACKEND_ZSTD select ZSTD_COMPRESS select ZSTD_DECOMPRESS =20 +config ZRAM_BACKEND_DEFLATE + bool "deflate compression support" + depends on ZRAM + default n + select ZLIB_DEFLATE + select ZLIB_INFLATE + choice prompt "Default zram compressor" default ZRAM_DEF_COMP_LZORLE @@ -67,6 +74,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 @@ -76,6 +87,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 053fe35e346b..91c07595d8b4 100644 --- a/drivers/block/zram/Makefile +++ b/drivers/block/zram/Makefile @@ -1,9 +1,10 @@ # SPDX-License-Identifier: GPL-2.0-only =20 -obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o -obj-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o -obj-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o -obj-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o +obj-$(CONFIG_ZRAM_BACKEND_LZO) +=3D backend_lzorle.o backend_lzo.o +obj-$(CONFIG_ZRAM_BACKEND_LZ4) +=3D backend_lz4.o +obj-$(CONFIG_ZRAM_BACKEND_LZ4HC) +=3D backend_lz4hc.o +obj-$(CONFIG_ZRAM_BACKEND_ZSTD) +=3D backend_zstd.o +obj-$(CONFIG_ZRAM_BACKEND_DEFLATE) +=3D backend_deflate.o =20 zram-y :=3D zcomp.o zram_drv.o =20 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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3AC96152519 for ; Fri, 3 May 2024 09:18:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727936; cv=none; b=l/DSCIYeOB0Qw+VqtVP9nhsasgEE1M0ZfCI3klQTEQqzaXSp3yVJ7P2VWrqPrgkTjUeSL9ZvdN5AJCO6QduzTwomMweYRMYjpul9r8Mxn/XLo8TTJbDuH+7Dj7oFW7zgXEJrG7OnJuEHJSumeXdniV/nMdRin0/jg1yvp0W6lHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727936; c=relaxed/simple; bh=4ArJY7PZnBnDWCMCM15GfOZS5AjpeHaFMcDoWz/RQU8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UfQUkfLrD+9g1Ym1y/38MlTVInuJKLKhSs9NwpFjC3Nxbx7p6okLe2r0xsllrSHSJ/SHjUY31wF7R4mXofs0b4a8VVVPqGRirWIijtIWwcIzl/CrYHw8YTeYZ7tvOZ9hkMO8+WG4JFrQJIlH9lZEnaujQm/5AjUuauoj5w5gZq4= 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=fjCBSDLc; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="fjCBSDLc" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-6f44390e328so1157370b3a.2 for ; Fri, 03 May 2024 02:18:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727934; x=1715332734; 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=RO5gNR3hr1OwBA2XPvPltsruJYPfqcocof4eacOx3kQ=; b=fjCBSDLcXrBjgqIArQB5S1METL2+kNVYqZnt3HiorwnY6cJ+xLt4Tb1SxeX0q8vcw/ YC/30eNMNrnaKERQxsvfsZ5DErFgNdPnpMZW/mce0M1ia4LlXeiukzYC0BZoAQvuTQ1J SdOBabZYNf4JMjewO+JhJ4zt9A/Gbo5TFkLQk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727934; x=1715332734; 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=RO5gNR3hr1OwBA2XPvPltsruJYPfqcocof4eacOx3kQ=; b=Ivl3QpPTwMq2LV8NPOgQ/teQ2lm7F4MbvqXk1yTlSag/amaMdn1dv0LDp7Skt0f0Vg vNrMdhLT0N6BA0QTtwsIOmhi4q2HWFlgpDhpw+Lhwj2QynMTNqG/hUOKnK/MtB1UJc7K /RwoawcxEON+n+rR7lI56b6wETe6bFeIBmR/JswUNFOrHt8QZrBRBrnNke3PP9lvsGwq TrX0cVyl4Q8w9Ve/Oi4xZNE338SLXf8tW50+Yf0Mb4CXEniDm/WQGxTodP9l4aW8lVql IiPDWZAUiFDE8OcNA5E4Ya9wxtUf+9icu6+v9Ir9srw8KwUYuAlXq64vHOvaMqr19ugk yntQ== X-Gm-Message-State: AOJu0Yy8//BCWdzcuUJPkzs5s0PXvZVniIG9cuZD3+xHBwy5QtsjpTPY lRf/avhEbADgmQHxMP1s9G/AwYt1oaAiZLCukzauxTEKf3EyOp6qNwBkQ7A2rg== X-Google-Smtp-Source: AGHT+IG4npoeCWRzW4EH6xMMRmxyJm0jnpgnxemDntXCzMN1NWwaqjbQjf5ya2v1snd9z3WPC+pxbA== X-Received: by 2002:a05:6a00:2295:b0:6ea:f351:1df9 with SMTP id f21-20020a056a00229500b006eaf3511df9mr2343695pfe.23.1714727934592; Fri, 03 May 2024 02:18:54 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:54 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 08/14] zram: check that backends array has at least one backend Date: Fri, 3 May 2024 18:17:33 +0900 Message-ID: <20240503091823.3616962-9-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zcomp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 9fc5477a6259..fdf06fc6b364 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -205,6 +205,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 Wed Dec 17 21:02:29 2025 Received: from mail-ot1-f41.google.com (mail-ot1-f41.google.com [209.85.210.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1ABE1534E4 for ; Fri, 3 May 2024 09:18:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727939; cv=none; b=hA7MDezZee5kqEWbUK6DXItrnB6H6Yl+5h8qJC3AcWJvjn76VdB8IPiIKcsqKsCZZdVl1025DGnqQg18GJ1BjVOC986KJ9H8ddi+B1J+UjRpYvf1WEn1YmvnTm0LtiH7MdZ17KMunbVzAr8fpRn9KN4/VsfRP+dLMHNbQXbT6y0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727939; c=relaxed/simple; bh=YnP0vVSisRTPEbtmrXjJHIL3Jcyv7aP26RJXhVEmW+M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MQsBJguevUF5FU0iJUeByLG/DuiGldr/fE2uBHn9V8rmTDdMyWCgvaSebBftAH90NoVVr6R3Q1AmODUqAKtRpG7cfL6lEPVNXJWEOp+9FhuYunoWjRLpC06oAsCphK3WytfktbsVTFM5M4AOlAOYHArlEEdmc1KKVMAPO2FVhWc= 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=h+cVZ/BY; arc=none smtp.client-ip=209.85.210.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="h+cVZ/BY" Received: by mail-ot1-f41.google.com with SMTP id 46e09a7af769-6ef88ce8701so1973976a34.2 for ; Fri, 03 May 2024 02:18:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727937; x=1715332737; 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=iwRLVjXgWWLXjDVCb4fkeW1Vrz1sREosaV/gl6sSJuc=; b=h+cVZ/BYiXnQkt59fdEa86/jY1WHnN6aqmKIUGY6sxTGgn6cpfKcuOlm18rkKG8Q0P Muijzy6bTVBzW/6me4tTnufLMxyOQQBXr+Eovm7si8AdOBcWDyBf31AkH/cR1xsAaizV 0uXj3Skf38vw3ipk7cfTToXzNyjNXZcQyqurM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727937; x=1715332737; 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=iwRLVjXgWWLXjDVCb4fkeW1Vrz1sREosaV/gl6sSJuc=; b=HERgRH0k2tOM+4yV2kRxEEJt5TGAjVwxrrbITCNJhexf95r2iNaqyRoUZMf0JgRd2E wfV7D4wAFsk1dsuvd9KQVNayJPI6hFlcAi4CJpUuUxE78j25EQ5zP9bPpULDUVnuBFUd QZMeZ477aq8aThxTEJ+WZQAyYwvbn2VWJsOaXA8T1o31Mpf07AkeX1hC+Eba4XiKmJNr Lo5oGnoFSRmViqY/mCqU88uByZZYFprSRJ4db/zmv9mdNBMiPExisw13VivlRVKqxrrE 8/cogm8xJq+sfVWQmEmVvAm/ZK23odl8wMOrYTR5xkonG75cixsbfLFiVd7Xuc7Loqum uewA== X-Gm-Message-State: AOJu0YwL1hE4la1UPJ2skpSd8ovnIAINfS7HqVIyg3AMpSbkvoIpas6Y B9bAxaKcOAxtjOn/JJOfKA9bHIxNx8OlP94dMBqCYl/CoO+pXWU4JaiXGvTbZQ== X-Google-Smtp-Source: AGHT+IG1Y+66STwIIkGDVFEXJEIjZsDojE8xIHjivS/2H/ygX0oQEWOdPbPrnn3TJXRxgzeJU4kUKA== X-Received: by 2002:a05:6830:1494:b0:6ed:e67b:8699 with SMTP id s20-20020a056830149400b006ede67b8699mr2197582otq.18.1714727936860; Fri, 03 May 2024 02:18:56 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18:56 -0700 (PDT) From: Sergey Senozhatsky To: Andrew Morton , Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH 09/14] zram: introduce zcomp_config structure Date: Fri, 3 May 2024 18:17:34 +0900 Message-ID: <20240503091823.3616962-10-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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_deflate.c | 9 ++++++--- drivers/block/zram/backend_lz4.c | 2 +- drivers/block/zram/backend_lz4hc.c | 10 ++++++---- 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 + 10 files changed, 56 insertions(+), 17 deletions(-) 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 697592dbabe2..98d9c9274149 100644 --- a/drivers/block/zram/backend_lz4.c +++ b/drivers/block/zram/backend_lz4.c @@ -4,7 +4,7 @@ =20 #include "backend_lz4.h" =20 -static void *lz4_create(void) +static void *lz4_create(struct zcomp_config *config) { return vmalloc(LZ4_MEM_COMPRESS); } diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backen= d_lz4hc.c index 5c437623aa65..62721a7c82dc 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,14 +26,16 @@ static void *lz4hc_create(void) 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->mem =3D vmalloc(LZ4HC_MEM_COMPRESS); if (!ctx->mem) { lz4hc_destroy(ctx); return NULL; } - - /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ - ctx->level =3D LZ4HC_DEFAULT_CLEVEL; return ctx; } =20 diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_= lzo.c index d9a003fbb360..c9ca18a2f993 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 4a7734aa1a8a..b2fb94902bef 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_defaultCLevel(); + if (config->level !=3D ZCOMP_CONFIG_NO_LEVEL) + ctx->level =3D config->level; + else + ctx->level =3D ZSTD_defaultCLevel(); + 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 fdf06fc6b364..9e182eb52fe7 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -57,7 +57,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 @@ -200,7 +200,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; @@ -217,6 +217,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 298ef0e97e03..6c36cd349431 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1994,6 +1994,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; @@ -2007,6 +2021,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) @@ -2064,7 +2080,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]); @@ -2271,6 +2288,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 37bf29f34d26..2c77f3bff166 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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD88515351E for ; Fri, 3 May 2024 09:18:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727941; cv=none; b=nFBnr2ywL6zMkkJcxqUVLx7WwHVb/UigFJ0sGVL17EpK4eelvecpqPDaqRlV+HIv0Z5/7F9B4tGjTwvxNh/wqd9d79HSKGQ2raYT1SWCf8BRH/6E0kCKW67WH+AxLib27ZzFJ8tuKUxVg77DBNP8J9lmhyjrzmOdNEPcK7ebquI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727941; c=relaxed/simple; bh=k8QWr7Ce151M14jHiuPdpQHPaGdK/slKGX2a8ui9kaI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VhnHHpJFYLr0jRdoiCp8NPcvry1csXF9VL4uw4Y1kCFjAopkfh1OUqu4x5UddLrtXpTFIukuhu6rrUUkefPm8cZUpyG1zQ4y0HLlcCoiAxhL50aOhnh30XRX0els7B8LxEUjPRwNA2eWMMrrgguKdJOL9Co+XpdY7Iwou04d7EM= 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=FguGQgNS; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="FguGQgNS" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-6edb76d83d0so7800493b3a.0 for ; Fri, 03 May 2024 02:18:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727939; x=1715332739; 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=hvvjJAe8l8tDTfecPvMLnwPB1eap8xtvETRDKvyj4SM=; b=FguGQgNSAtCarhd36ZQr7a1hEp+HWlA/2Oijdb2XB/XFtCmYVeije1y//w+op7UCEq uqW/haLV9rHs9Y19iM72DI3EPoai0qBvikOJpHDN7QjFSD6hRxAvqaQvky3QVY9rGUsA 9Hn4/meQRgKsFJp9G0to/nYGva34XuIHRgCWA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727939; x=1715332739; 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=hvvjJAe8l8tDTfecPvMLnwPB1eap8xtvETRDKvyj4SM=; b=HLgxCEbEaxapLq2PDeK3SXfKeN7N2X13PEZKME81T6UQBleSHX3p6G0X6vm/+QKjdt EAn9q1VtNn7kmNLe062erZGvnoBQ3w/i9nlnFZRGO4DbG0CgoCVa3lae3OkG7Inn75Fx ecTPChmw0Wh2s6y42mzGVx1UFuamXhq4jCXCWC6l4Zc5C4Oz7p4448nleESp7ytIKQpj bsj7GS20UNlRSe6+F1yQyCDSF0lSiM8PqsfXxEiuSBiOVwaK+iK7FvcASrUvowMWdORg c0DZ62v/NcR6mTvkuoH8kCetu9iZV9NJXyAKSzeHHcRMCSr9ohtaHJrcnV4bRjc7iDt4 8ZKQ== X-Gm-Message-State: AOJu0YzMV4j3HNiRodLV4oKzBNXrD4bJ3WIMmDGAlonmGved3PvbeOMw jSA+LiERfWPHWlhvZ5n7/JaP11koh7F6GtfYwHjp9XM2PedcoIOJlh7unFdBZH8k2BSBtAUwFG8 = X-Google-Smtp-Source: AGHT+IEi/BtypYR7vdNaB2RUEIhY9IiRwbwbnt0WGI9N16JWZ3DGzLGPyubKNTp4cKKZUqqniNQ0Vw== X-Received: by 2002:a05:6a00:140f:b0:6ed:4288:650a with SMTP id l15-20020a056a00140f00b006ed4288650amr1850681pfu.19.1714727939079; Fri, 03 May 2024 02:18:59 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:18: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: [PATCH 10/14] zram: extend comp_algorithm attr write handling Date: Fri, 3 May 2024 18:17:35 +0900 Message-ID: <20240503091823.3616962-11-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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 6c36cd349431..bd8433363cbe 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1028,9 +1028,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 Wed Dec 17 21:02:29 2025 Received: from mail-ot1-f42.google.com (mail-ot1-f42.google.com [209.85.210.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C48015357D for ; Fri, 3 May 2024 09:19:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727943; cv=none; b=inm84u7uT/wACbYn5tOW2MO91IMefdWCdQ58ek+zwNDVmzGNME1ZISzQ4LxF9ffHt0uYUawR9plG6VzIuIRi6X2vre8xBJ4yQ1gLc3Gt2Qtf2gIJA/WpQPurnfUR7t1MpeVF3JG/LCHNuLI4huxVQzZhjU4B212ERCgXHzn2FPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727943; c=relaxed/simple; bh=d4UQf/ZsLZS7cvretx2WXvAFWLig4xky110hNJGk3Zc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uDPD/ytTsRR0q7ujZbBDxu8bKGKFkO7g7Mor279BOcdZ2RyZs57xB7FhGx7kHDL16KAoEGu6Bp81FX7Tt1Js0B/fUCs5RKUwKWQZW7yhJV8Cry5c9GLTKEEGdKo07ASnt6h7pEdvvjq/YCx7LV8x3xe9ZCJtI5vlljgv64NscsA= 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=Wak1oHTl; arc=none smtp.client-ip=209.85.210.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Wak1oHTl" Received: by mail-ot1-f42.google.com with SMTP id 46e09a7af769-6eb8ea5ac95so5174145a34.2 for ; Fri, 03 May 2024 02:19:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727941; x=1715332741; 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=wIlqiB/ZJyLpyyyQGB102ierEcV1ZXWEtzUdufZbr+0=; b=Wak1oHTl2uaiKkf7MnYR72iwjwyMvnQXlj1+VEhs/LpSkQDWx6QU4sQ6KyaOWXwake 6TvVKjE+r/smGDor5KfYGT+cb+U+izXYyQpyzrynKsIdSfa+CIHrZbOyZCFJ3Heexvzq egU9d1fhD0+oFvrBNCOzbT/Kb1NWPpy2llWBw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727941; x=1715332741; 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=wIlqiB/ZJyLpyyyQGB102ierEcV1ZXWEtzUdufZbr+0=; b=amaPwxih7ZEddGZFwnA99MnwCTa9oJ3mNIQXWYVlXWrIdZzcmSnfZEbrHezkxQ8EfK GQYKzW+r57Ag2hQCfAQ1cfAyVDney+3JFjPCRq97dBpWvUIQsZVPRUuwf7vdrMIMUvd9 ApSk4iUJsIIu+CnxT2Hdr9uB16cv8/8VhKEdhHBI6Sk6CLvAdtcxU7YHDqblZ3U0+0nP xI1HFH4mnFgk3L6bDNnwq4JpW0lsvehrW6l8VUWtA1fpe9PKdgRtkOmkhutcYdC+VYwf A/Lkgw25PNPVb//3ChnJiwOzlEJGraFBVx9dJ77TxRWjCr1A7F17AOlkubBHPzNP+d5f N/Sw== X-Gm-Message-State: AOJu0Yzm279E9SleAx/Y5aprTih+4KnoWCho//qZgkqBoXDpE7T39PS2 282CIsZs28mJyoUbG4mMojf/5hOVJ8oTeI51EvqKKqcKBTFQfJj9T7Tc7zQF1w== X-Google-Smtp-Source: AGHT+IGbhx7IVSUR92tftAY4BYbWmtRne6bxgDBkITjrGAh1c47LJ+SGuFRRgZDN5gDcxKTPwNUwXA== X-Received: by 2002:a9d:5f09:0:b0:6ee:39ac:a757 with SMTP id f9-20020a9d5f09000000b006ee39aca757mr2471155oti.21.1714727941257; Fri, 03 May 2024 02:19:01 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.18.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:19: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: [PATCH 11/14] zram: support compression level comp config Date: Fri, 3 May 2024 18:17:36 +0900 Message-ID: <20240503091823.3616962-12-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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 bd8433363cbe..89a2eb37e26c 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1013,6 +1013,12 @@ static int __comp_algorithm_store(struct zram *zram,= u32 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) @@ -1030,6 +1036,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); @@ -1049,12 +1056,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 @@ -1087,6 +1103,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); @@ -1107,6 +1124,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) @@ -1115,7 +1139,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 Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D47B15381E for ; Fri, 3 May 2024 09:19:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727945; cv=none; b=TKq94l8gnUenwnDLsZzQiR5DlxCPFGb2EbFZ8q5F9/k1mRkWAJqCZIMr8gDa1ihSQ+HRr9SYmecwg6HNUTJK0HbJd1pAYS0giqrcysJPFJ+QpK9hd3oZUN2VGYl1snpjsaYGAP0B4AEmbpo5Mr7WG/Oel55GwuQoxy0NY5cMWwk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727945; c=relaxed/simple; bh=0st2HobpNox1lw9rfTM0Izpmujgy1vssbMv9Vmn3p4s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iVbAjWz6B1L9OBg4sWKjGVsZjetHUbGHSEIIFbFA/9ZAyBRTcbH3qDOYae02dPkvUC4hpgn8uTmg0YvpEez5PcgUON0pyPT0lz344hdBmkpzA2AuSiGIFSnutVjf0Xyh+sThzMZfQBkkeWwWRzUacIJv2Dp+TLNcdY93R+j/1CM= 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=m3ujW7ck; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="m3ujW7ck" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-6e46dcd8feaso5275152b3a.2 for ; Fri, 03 May 2024 02:19:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727943; x=1715332743; 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=hkEHTBQxR1IAOMp6Di+8t+w03Mn2F1ACoLhl2VS9uYE=; b=m3ujW7cky9Trd8BhZnN2Ty/1+lBol3GrzKwLLT8nG3zu1O+EsCPWk1XDQXx2RL1l/c EzFFVT2k5mij/RwR78T+7xXqqouQNHiIww4KLmeHE8hGJDyemgV0cxI5AD191P3bU5QN yyyxj+kg5W+9clYqJWmVEnQlO/NiMy27JgFNM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727943; x=1715332743; 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=hkEHTBQxR1IAOMp6Di+8t+w03Mn2F1ACoLhl2VS9uYE=; b=B1sZQjx4xC3Lpq2D4qQ9nd/50+Tx5ZU/UQaF4fQWP25yXahQlkUx/sQbdcK/xxehD0 hGJWrdW8UbjCqdREke/xg5Gp3k83j+xulVb/07Jw+qHxXRGYbamzzyW7KADgom1Oe4b4 B79iIgly83il3DGcH22rcUMtcrb0VGA2MzwohK+yL8dmPstnMgd3d4RjIXFby0saHag5 Y3kRrkBJmkcGl1AJV8eiaXTLct4kY6CtwWKpxj5odYj8SAZcOsuEv6lQMG+CPGQdTHpm AD5hpdhzAb9Vmg1iRCQ+UZiUJdJBi6hbLF9UmesbuyiU5TSMPaz1RwvOT8GE7IUgerdB MPAA== X-Gm-Message-State: AOJu0YzNGKQPGPn/gIdsyHKbo6j2+EVZXQIsp+aT7eEagYsRzUDNn39P aIiSwxx8sXuPK4MBdMaCpGxY4YCG1gXCpI3YD2adzN3670Erafzs7ys5ZD+HLf9pM9FfcuFFFH0 = X-Google-Smtp-Source: AGHT+IHPfkg+X9GkqI+WL5uh/PWaBh9iygZx9qFc257y4/YG1wrDms+rR+hPW8EPaj7MxNhEKY0ihw== X-Received: by 2002:a05:6a00:140b:b0:6ed:332:ffbc with SMTP id l11-20020a056a00140b00b006ed0332ffbcmr2011169pfu.20.1714727943515; Fri, 03 May 2024 02:19:03 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.19.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:19: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: [PATCH 12/14] zram: add support for dict comp config Date: Fri, 3 May 2024 18:17:37 +0900 Message-ID: <20240503091823.3616962-13-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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 | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 89a2eb37e26c..c50283c7231e 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 @@ -1013,9 +1014,23 @@ static int __comp_algorithm_store(struct zram *zram,= u32 prio, const char *buf) return 0; } =20 -static int comp_config_store(struct zram *zram, u32 prio, s32 level) +static int comp_config_store(struct zram *zram, u32 prio, s32 level, + const char *dict_path) { + size_t sz =3D 0; + + 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 @@ -1035,7 +1050,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 @@ -1063,12 +1078,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; @@ -1102,7 +1122,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 @@ -1131,6 +1151,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) @@ -1139,7 +1164,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; --=20 2.45.0.rc1.225.g2a3ae87e7f-goog From nobody Wed Dec 17 21:02:29 2025 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0439E153BD8 for ; Fri, 3 May 2024 09:19:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727948; cv=none; b=VOhrtUCc5OWu5jMlujTbDBkIURa5klzanqNxQRHqbg80uoJ4dNRrC3+gnxFKzb05X+U8TbB65R9JpoTFZGaU4So8NtuSwa3Ye7IOqB6IsXPCDsaq5yajEb1ksmJWecLvf2wz7QUE4hJ14eMObEWjtje0g/jYDiMwPaAd2K+r2t8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727948; c=relaxed/simple; bh=eO1aD3GYThTWX8reEG9IHaYxayASI5pIn3ZwxQRjfeY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lbdp4fIIOnelIGHqVMf8cXsz5m5ZRgjfgIuErDOQeVpGDQz9QIiOeg69mTq1BXuhOjxH9wIagNw/wzO1/A8ifSVe5+NXZsFHOEjP/eAX36Ytes97kk9yspQtCOBWM4Ro+iNJCtAq5ECUB2vf7KWsNR8lqrubEq9EdBvlJxMZISM= 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=IwMjDbm/; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="IwMjDbm/" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-6f3e3d789cdso6496654b3a.1 for ; Fri, 03 May 2024 02:19:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727946; x=1715332746; 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=6NlFlAwd7AfzOKAUbFYigEp0/QoNwrE2imVLFTnbDxc=; b=IwMjDbm/hX23VewTatSdy1IiTXYPJ2dKM9Q3QgfqVwsU/O3g8PvK8ZWI8KiVrQc721 laVvRAEBVyLUH2nsfE4143F62KA2ei35TwpB4PDhzMNn4Gl4BKf6Oj/0zMJN4azRFA2B knB+MnrNF97nHgYR1Kv8sEO2QZWlZL8wnsMtw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727946; x=1715332746; 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=6NlFlAwd7AfzOKAUbFYigEp0/QoNwrE2imVLFTnbDxc=; b=Ov/1h0Cy7NA9TdtpazpML2QXqq/ecqDxRrfLT7v7F24peKHnMtzb2tvgZJo6Aw7S+7 6vt8ZpraadFeQiclNDlv6aXX1muEhL7mY9Fbx6q2xEfKGvmtJjBHAimlPqkAJuSBp5xx mbaqFh/0mF6JxVND3qZ+zooIuEm9Q4lTI1kKnrxwGMAnhTuO46zYyjTzdc3O/BIQHXGD aMO73r29bQPRC5eC6EGdrjl6fEq1fwV7awSbZfki7H5Q1IA6qg6pjhlJco0NZW9PuZgM wUugCROme2iWEGKiV71SlhzUVewUA4Hg/pfLn4kJfk7/bRgyYm8NtGnOkEZ0gHb9FtQs mhcA== X-Gm-Message-State: AOJu0YyJRZ9IBJXoFCOjPAiQfnI7vb9LijJmTQkoXiM2Is7Bq5pqC7Zn vn9sFOoSUaSGpM3pSO4Nln0+bGSOLOZSvclRXkNelIJpzF9GdohOP13uQdbA9Q== X-Google-Smtp-Source: AGHT+IEss/I5uy/yYKBxcXXnNraFRQZ56Afeli3+NlY5upIAcfp/ukWooVoWmDX0bG0NTr8rjslCnA== X-Received: by 2002:a05:6300:8089:b0:1a7:3d2a:7383 with SMTP id ap9-20020a056300808900b001a73d2a7383mr2348105pzc.18.1714727946298; Fri, 03 May 2024 02:19:06 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.19.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:19: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: [PATCH 13/14] zram: add dictionary support to zstd backend Date: Fri, 3 May 2024 18:17:38 +0900 Message-ID: <20240503091823.3616962-14-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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. The patch is a little non-trivial, as it seems that noone ever attempted to use dictionaries in the linux kernel port of zstd. It also uses GFP_KERNEL gfp 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. [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 | 119 ++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 23 deletions(-) diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend= _zstd.c index b2fb94902bef..6220c154e54e 100644 --- a/drivers/block/zram/backend_zstd.c +++ b/drivers/block/zram/backend_zstd.c @@ -12,23 +12,47 @@ struct zstd_ctx { zstd_dctx *dctx; void *cctx_mem; void *dctx_mem; + ZSTD_customMem cctx_cmem; + ZSTD_customMem dctx_cmem; + ZSTD_CDict *cdict; + ZSTD_DDict *ddict; s32 level; }; =20 +/* + * Cctx allocator.customAlloc() is called from zcom_compress(), which is + * called under local-lock (per-CPU compression stream), so we need to + * use GFP_ATOMIC here. + */ +static void *zstd_cctx_alloc(void *opaque, size_t size) +{ + return kvzalloc(size, GFP_ATOMIC); +} + +static void *zstd_dctx_alloc(void *opaque, size_t size) +{ + 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); + ZSTD_freeCDict(zctx->cdict); + ZSTD_freeDDict(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 +63,64 @@ static void *zstd_create(struct zcomp_config *config) else ctx->level =3D ZSTD_defaultCLevel(); =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->cctx_cmem.customAlloc =3D zstd_cctx_alloc; + ctx->cctx_cmem.customFree =3D zstd_ctx_free; + ctx->dctx_cmem.customAlloc =3D zstd_dctx_alloc; + ctx->dctx_cmem.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_compressionParameters params; + + ctx->cctx =3D ZSTD_createCCtx_advanced(ctx->cctx_cmem); + if (!ctx->cctx) + goto error; + + ctx->dctx =3D ZSTD_createDCtx_advanced(ctx->dctx_cmem); + if (!ctx->dctx) + goto error; + + params =3D ZSTD_getCParams(ctx->level, PAGE_SIZE, + config->dict_sz); + + ctx->cdict =3D ZSTD_createCDict_advanced(config->dict, + config->dict_sz, + ZSTD_dlm_byRef, + ZSTD_dct_auto, + params, + ctx->cctx_cmem); + if (!ctx->cdict) + goto error; + + ctx->ddict =3D ZSTD_createDDict_advanced(config->dict, + config->dict_sz, + ZSTD_dlm_byRef, + ZSTD_dct_auto, + ctx->dctx_cmem); + if (!ctx->ddict) + goto error; + } =20 return ctx; =20 @@ -72,8 +136,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_usingCDict(zctx->cctx, dst, *dst_len, + src, PAGE_SIZE, zctx->cdict); if (zstd_is_error(ret)) return -EINVAL; *dst_len =3D ret; @@ -86,7 +154,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_usingDDict(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 Wed Dec 17 21:02:29 2025 Received: from mail-oa1-f54.google.com (mail-oa1-f54.google.com [209.85.160.54]) (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 7D6D614F9E9 for ; Fri, 3 May 2024 09:19:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727950; cv=none; b=hMRQwI+OEfYdCWBJlm4V3IUEM74lNimE3jv8PVlWB3wjl645Bs0TDxjK/+cUWH4tsRk917OR/3FcOC/cCS2EPE8UEi4IoT5QQFg4fKlsf3Gxatkr6dJh3MFyBzucUa+epCVZT+m5+QknJGHCmIlOeHst/sjGIHWBW2MjMDkVPjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714727950; c=relaxed/simple; bh=0QKD/VRLqE4UJhTMThwx4W0GPaxzgatlvvK+3EE9Gd0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ElMue4yRihoYqS/RqVtelBCaaWL9yJrtsj2McOWIk0a60MLntmGFvKMCQPnAxlnvRqgVTjiru8ydHbINWxSngK+Kfr/4Rr1e9dfSBYk+L0DiO52wl8vuxSjmPeicHm9q/Vy4kiuXraAz2FK1gg6t2seyPtNd6wPbdVf2vJSj5nM= 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=IHOz0KbR; arc=none smtp.client-ip=209.85.160.54 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="IHOz0KbR" Received: by mail-oa1-f54.google.com with SMTP id 586e51a60fabf-22ed075a629so3659405fac.3 for ; Fri, 03 May 2024 02:19:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1714727948; x=1715332748; 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=IHOz0KbRsCWDmyk62A8DSzaWNbCFkXUEHz7oF0LP+WFTA/3tZYHrLdsPPsQZE3T3DJ RqpuzC4c/zAin4Jdd5j4mTZi0AZyVWEOcRynU0KWu6zjVlw1S6d8KXOMxHoUZzbmX3ap FaeyM8UlIekF3evU/I46w9C+sTX631q4Jto8s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714727948; x=1715332748; 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=IUZ9+mDNZvrtAwJAOtFo+VR9oPGLpIPnF1Fzj50ebtH0z33Ijyu63NzwbwB+GGooQ8 /IZK5b0DuR+Ppq0ntjgIm5L0DMH/0+vmNM3yRx6SUrXLzI8sjXIE7tyTlwsyHYHtjDhG 4+XNi6ktC+N2zlq7TSQPkywO8/m84LVtWRYsxdqRqCE1w6H1vMUuCzw/cW0LLl1Z4oEx gnA7grD6cz4XJi1dXu+jTiPjQ+HucH3xMn7PuCB+NNagSizT4jbZhiogQIKaVYvIpfEH el+43YQ+uc3xaVp7NfkjWQQN5UM5nG+wSsHtu+aTSg4tjVKRSxgA5yg+3RNXeJ40a9QT 6RgA== X-Gm-Message-State: AOJu0YyiKon4iK/htvyv+5XeVwY1oFwrNnS7oLopU7gZ76LQoE1tVjCd 3id9r0KLl1dA7KXDnexMGjsx3y4tx+3D4Ii7llw4yOHrs1ipj4owpP3SallRWg== X-Google-Smtp-Source: AGHT+IFh54usQd29tLvgBlBuW5xhaTflCGP1cxkIKo9T2fan/lx76Q1QQ5HqlGXP71ctFVnUWzGFvA== X-Received: by 2002:a05:6871:7821:b0:22e:d0e3:925f with SMTP id oy33-20020a056871782100b0022ed0e3925fmr2523349oac.1.1714727948591; Fri, 03 May 2024 02:19:08 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:dc60:24a3:e365:f27c]) by smtp.gmail.com with ESMTPSA id j6-20020aa78d06000000b006ecec1f4b08sm2621938pfe.118.2024.05.03.02.19.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 May 2024 02:19: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: [PATCH 14/14] Documentation/zram: add documentation for algorithm parameters Date: Fri, 3 May 2024 18:17:39 +0900 Message-ID: <20240503091823.3616962-15-senozhatsky@chromium.org> X-Mailer: git-send-email 2.45.0.rc1.225.g2a3ae87e7f-goog In-Reply-To: <20240503091823.3616962-1-senozhatsky@chromium.org> References: <20240503091823.3616962-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