]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
zram: support deflate-specific params
authorSergey Senozhatsky <senozhatsky@chromium.org>
Wed, 14 May 2025 02:47:51 +0000 (11:47 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 1 Jun 2025 05:46:07 +0000 (22:46 -0700)
Introduce support of algorithm specific parameters in algorithm_params
device attribute.  The expected format is algorithm.param=value.

For starters, add support for deflate.winbits parameter.

Link: https://lkml.kernel.org/r/20250514024825.1745489-3-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Reviewed-by: Mikhail Zaslonko <zaslonko@linux.ibm.com>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/backend_deflate.c
drivers/block/zram/zcomp.h
drivers/block/zram/zram_drv.c

index 4c00b5b6739fec2e35e8fcc3e3623b3960514558..b75016e0e654b5374d8f0ac92c10acd9d6f6906f 100644 (file)
@@ -8,7 +8,7 @@
 #include "backend_deflate.h"
 
 /* Use the same value as crypto API */
-#define DEFLATE_DEF_WINBITS            11
+#define DEFLATE_DEF_WINBITS            (-11)
 #define DEFLATE_DEF_MEMLEVEL           MAX_MEM_LEVEL
 
 struct deflate_ctx {
@@ -24,6 +24,8 @@ static int deflate_setup_params(struct zcomp_params *params)
 {
        if (params->level == ZCOMP_PARAM_NOT_SET)
                params->level = Z_DEFAULT_COMPRESSION;
+       if (params->deflate.winbits == ZCOMP_PARAM_NOT_SET)
+               params->deflate.winbits = DEFLATE_DEF_WINBITS;
 
        return 0;
 }
@@ -57,13 +59,13 @@ static int deflate_create(struct zcomp_params *params, struct zcomp_ctx *ctx)
                return -ENOMEM;
 
        ctx->context = zctx;
-       sz = zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL);
+       sz = zlib_deflate_workspacesize(params->deflate.winbits, MAX_MEM_LEVEL);
        zctx->cctx.workspace = vzalloc(sz);
        if (!zctx->cctx.workspace)
                goto error;
 
        ret = zlib_deflateInit2(&zctx->cctx, params->level, Z_DEFLATED,
-                               -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL,
+                               params->deflate.winbits, DEFLATE_DEF_MEMLEVEL,
                                Z_DEFAULT_STRATEGY);
        if (ret != Z_OK)
                goto error;
@@ -73,7 +75,7 @@ static int deflate_create(struct zcomp_params *params, struct zcomp_ctx *ctx)
        if (!zctx->dctx.workspace)
                goto error;
 
-       ret = zlib_inflateInit2(&zctx->dctx, -DEFLATE_DEF_WINBITS);
+       ret = zlib_inflateInit2(&zctx->dctx, params->deflate.winbits);
        if (ret != Z_OK)
                goto error;
 
index cfacdfe9044c3629429d83ae9ca3a89e1aab4441..4acffe671a5eafd352d60dbfa62769e3c797f6c5 100644 (file)
@@ -7,6 +7,10 @@
 
 #define ZCOMP_PARAM_NOT_SET    INT_MIN
 
+struct deflate_params {
+       s32 winbits;
+};
+
 /*
  * Immutable driver (backend) parameters. The driver may attach private
  * data to it (e.g. driver representation of the dictionary, etc.).
@@ -17,6 +21,9 @@ struct zcomp_params {
        void *dict;
        size_t dict_sz;
        s32 level;
+       union {
+               struct deflate_params deflate;
+       };
 
        void *drv_data;
 };
index a11b7a6e35f41bb0bf4552f07774ec5c27f893bc..54c57103715f9b1af25f513d13d2dc8a98bde71e 100644 (file)
@@ -1277,12 +1277,14 @@ static void comp_params_reset(struct zram *zram, u32 prio)
 
        vfree(params->dict);
        params->level = ZCOMP_PARAM_NOT_SET;
+       params->deflate.winbits = ZCOMP_PARAM_NOT_SET;
        params->dict_sz = 0;
        params->dict = NULL;
 }
 
 static int comp_params_store(struct zram *zram, u32 prio, s32 level,
-                            const char *dict_path)
+                            const char *dict_path,
+                            struct deflate_params *deflate_params)
 {
        ssize_t sz = 0;
 
@@ -1300,6 +1302,7 @@ static int comp_params_store(struct zram *zram, u32 prio, s32 level,
 
        zram->params[prio].dict_sz = sz;
        zram->params[prio].level = level;
+       zram->params[prio].deflate.winbits = deflate_params->winbits;
        return 0;
 }
 
@@ -1310,9 +1313,12 @@ static ssize_t algorithm_params_store(struct device *dev,
 {
        s32 prio = ZRAM_PRIMARY_COMP, level = ZCOMP_PARAM_NOT_SET;
        char *args, *param, *val, *algo = NULL, *dict_path = NULL;
+       struct deflate_params deflate_params;
        struct zram *zram = dev_to_zram(dev);
        int ret;
 
+       deflate_params.winbits = ZCOMP_PARAM_NOT_SET;
+
        args = skip_spaces(buf);
        while (*args) {
                args = next_arg(args, &param, &val);
@@ -1343,6 +1349,13 @@ static ssize_t algorithm_params_store(struct device *dev,
                        dict_path = val;
                        continue;
                }
+
+               if (!strcmp(param, "deflate.winbits")) {
+                       ret = kstrtoint(val, 10, &deflate_params.winbits);
+                       if (ret)
+                               return ret;
+                       continue;
+               }
        }
 
        /* Lookup priority by algorithm name */
@@ -1364,7 +1377,7 @@ static ssize_t algorithm_params_store(struct device *dev,
        if (prio < ZRAM_PRIMARY_COMP || prio >= ZRAM_MAX_COMPS)
                return -EINVAL;
 
-       ret = comp_params_store(zram, prio, level, dict_path);
+       ret = comp_params_store(zram, prio, level, dict_path, &deflate_params);
        return ret ? ret : len;
 }