]> www.infradead.org Git - users/willy/xarray.git/commitdiff
zram: introduce zcomp_params structure
authorSergey Senozhatsky <senozhatsky@chromium.org>
Mon, 2 Sep 2024 10:56:01 +0000 (19:56 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 9 Sep 2024 23:39:09 +0000 (16:39 -0700)
We will store a per-algorithm parameters there (compression level,
dictionary, dictionary size, etc.).

Link: https://lkml.kernel.org/r/20240902105656.1383858-14-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Nick Terrell <terrelln@fb.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/backend_842.c
drivers/block/zram/backend_deflate.c
drivers/block/zram/backend_lz4.c
drivers/block/zram/backend_lz4hc.c
drivers/block/zram/backend_lzo.c
drivers/block/zram/backend_lzorle.c
drivers/block/zram/backend_zstd.c
drivers/block/zram/zcomp.c
drivers/block/zram/zcomp.h
drivers/block/zram/zram_drv.c
drivers/block/zram/zram_drv.h

index 005f3fcb902469deca625787edc8613101d12fa8..e14dba30b0a2a68937cea6f11f904ae73c155391 100644 (file)
@@ -19,7 +19,7 @@ static void destroy_842(void *ctx)
        kfree(zctx);
 }
 
-static void *create_842(void)
+static void *create_842(struct zcomp_params *params)
 {
        struct sw842_ctx *ctx;
 
index acefb86701b9b57a9a485e6345dd5fd31493a04b..ec662ce468971cc8733109026e7b8696d12a52c6 100644 (file)
@@ -32,7 +32,7 @@ static void deflate_destroy(void *ctx)
        kfree(zctx);
 }
 
-static void *deflate_create(void)
+static void *deflate_create(struct zcomp_params *params)
 {
        struct deflate_ctx *ctx;
        size_t sz;
@@ -42,8 +42,11 @@ static void *deflate_create(void)
        if (!ctx)
                return NULL;
 
-       /* @FIXME: using a hardcoded Z_DEFAULT_COMPRESSION for now */
-       ctx->level = Z_DEFAULT_COMPRESSION;
+       if (params->level != ZCOMP_PARAM_NO_LEVEL)
+               ctx->level = params->level;
+       else
+               ctx->level = Z_DEFAULT_COMPRESSION;
+
        sz = zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL);
        ctx->cctx.workspace = vzalloc(sz);
        if (!ctx->cctx.workspace)
index c1d19fed5af23e576acce80988d2fae454908f28..ec57b5acbd390bf1acfcc91c948a465c12e98301 100644 (file)
@@ -18,7 +18,7 @@ static void lz4_destroy(void *ctx)
        kfree(zctx);
 }
 
-static void *lz4_create(void)
+static void *lz4_create(struct zcomp_params *params)
 {
        struct lz4_ctx *ctx;
 
@@ -26,8 +26,11 @@ static void *lz4_create(void)
        if (!ctx)
                return NULL;
 
-       /* @FIXME: using a hardcoded LZ4_ACCELERATION_DEFAULT for now */
-       ctx->level = LZ4_ACCELERATION_DEFAULT;
+       if (params->level != ZCOMP_PARAM_NO_LEVEL)
+               ctx->level = params->level;
+       else
+               ctx->level = LZ4_ACCELERATION_DEFAULT;
+
        ctx->mem = vmalloc(LZ4_MEM_COMPRESS);
        if (!ctx->mem)
                goto error;
index 536f7a0073c47852a0c68bc687e9a068aeb6d2a3..80733fead595d4a2f0d4f1677e89cfdbdd61942f 100644 (file)
@@ -18,7 +18,7 @@ static void lz4hc_destroy(void *ctx)
        kfree(zctx);
 }
 
-static void *lz4hc_create(void)
+static void *lz4hc_create(struct zcomp_params *params)
 {
        struct lz4hc_ctx *ctx;
 
@@ -26,8 +26,11 @@ static void *lz4hc_create(void)
        if (!ctx)
                return NULL;
 
-       /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */
-       ctx->level = LZ4HC_DEFAULT_CLEVEL;
+       if (params->level != ZCOMP_PARAM_NO_LEVEL)
+               ctx->level = params->level;
+       else
+               ctx->level = LZ4HC_DEFAULT_CLEVEL;
+
        ctx->mem = vmalloc(LZ4HC_MEM_COMPRESS);
        if (!ctx->mem)
                goto error;
index 4c9e611f6c03fc2482163858a4363c07236d3d84..8e4aabd04bf34a272920f7826c11d4a57d45f40e 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "backend_lzo.h"
 
-static void *lzo_create(void)
+static void *lzo_create(struct zcomp_params *params)
 {
        return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
 }
index 19a9ce1320464364a49344b202c51d78641a6d06..cb01eb8b04f4b9f1ecadcdfacb9c00d0eb8736f4 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "backend_lzorle.h"
 
-static void *lzorle_create(void)
+static void *lzorle_create(struct zcomp_params *params)
 {
        return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
 }
index 310d970078e205590e4d9b1c24b179484e49a5dd..c356c5e6e503e99443fd2425ad8bdfa5817b6384 100644 (file)
@@ -24,9 +24,9 @@ static void zstd_destroy(void *ctx)
        kfree(zctx);
 }
 
-static void *zstd_create(void)
+static void *zstd_create(struct zcomp_params *params)
 {
-       zstd_parameters params;
+       zstd_parameters prm;
        struct zstd_ctx *ctx;
        size_t sz;
 
@@ -34,9 +34,13 @@ static void *zstd_create(void)
        if (!ctx)
                return NULL;
 
-       ctx->level = zstd_default_clevel();
-       params = zstd_get_params(ctx->level, PAGE_SIZE);
-       sz = zstd_cctx_workspace_bound(&params.cParams);
+       if (params->level != ZCOMP_PARAM_NO_LEVEL)
+               ctx->level = params->level;
+       else
+               ctx->level = zstd_default_clevel();
+
+       prm = zstd_get_params(ctx->level, PAGE_SIZE);
+       sz = zstd_cctx_workspace_bound(&prm.cParams);
        ctx->cctx_mem = vzalloc(sz);
        if (!ctx->cctx_mem)
                goto error;
@@ -65,11 +69,11 @@ static int zstd_compress(void *ctx, const unsigned char *src, size_t src_len,
                         unsigned char *dst, size_t *dst_len)
 {
        struct zstd_ctx *zctx = ctx;
-       const zstd_parameters params = zstd_get_params(zctx->level, PAGE_SIZE);
+       const zstd_parameters prm = zstd_get_params(zctx->level, PAGE_SIZE);
        size_t ret;
 
        ret = zstd_compress_cctx(zctx->cctx, dst, *dst_len,
-                                src, src_len, &params);
+                                src, src_len, &prm);
        if (zstd_is_error(ret))
                return -EINVAL;
        *dst_len = ret;
index 76d21ee7706759b7cfa71f6a6e98a0986fdbbdef..173ee2b79442f842b985fd6b0b78a0a1b24b430d 100644 (file)
@@ -54,7 +54,7 @@ static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm)
 
 static int zcomp_strm_init(struct zcomp *comp, struct zcomp_strm *zstrm)
 {
-       zstrm->ctx = comp->ops->create_ctx();
+       zstrm->ctx = comp->ops->create_ctx(comp->params);
 
        /*
         * allocate 2 pages. 1 for compressed data, plus 1 extra for the
@@ -187,7 +187,7 @@ void zcomp_destroy(struct zcomp *comp)
        kfree(comp);
 }
 
-struct zcomp *zcomp_create(const char *alg)
+struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params)
 {
        struct zcomp *comp;
        int error;
@@ -204,6 +204,7 @@ struct zcomp *zcomp_create(const char *alg)
        if (!comp)
                return ERR_PTR(-ENOMEM);
 
+       comp->params = params;
        comp->ops = lookup_backend_ops(alg);
        if (!comp->ops) {
                kfree(comp);
index e5eb5ec4c645a93da48d77868f5aa1f550595451..217a750fa908f87f696a0db3aa0306c72ec39bed 100644 (file)
@@ -2,8 +2,17 @@
 
 #ifndef _ZCOMP_H_
 #define _ZCOMP_H_
+
 #include <linux/local_lock.h>
 
+#define ZCOMP_PARAM_NO_LEVEL   INT_MIN
+
+struct zcomp_params {
+       void *dict;
+       size_t dict_sz;
+       s32 level;
+};
+
 struct zcomp_strm {
        /* The members ->buffer and ->tfm are protected by ->lock. */
        local_lock_t lock;
@@ -19,7 +28,7 @@ struct zcomp_ops {
        int (*decompress)(void *ctx, const unsigned char *src, size_t src_len,
                          unsigned char *dst, size_t dst_len);
 
-       void *(*create_ctx)(void);
+       void *(*create_ctx)(struct zcomp_params *params);
        void (*destroy_ctx)(void *ctx);
 
        const char *name;
@@ -29,6 +38,7 @@ struct zcomp_ops {
 struct zcomp {
        struct zcomp_strm __percpu *stream;
        const struct zcomp_ops *ops;
+       struct zcomp_params *params;
        struct hlist_node node;
 };
 
@@ -37,7 +47,7 @@ int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node);
 ssize_t zcomp_available_show(const char *comp, char *buf);
 bool zcomp_available_algorithm(const char *comp);
 
-struct zcomp *zcomp_create(const char *alg);
+struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params);
 void zcomp_destroy(struct zcomp *comp);
 
 struct zcomp_strm *zcomp_stream_get(struct zcomp *comp);
index 93042da8ccdf4d0a2118750a12eb016e9c22ee5d..ff6724bbdf912a5281f60adee68cb9f06514878c 100644 (file)
@@ -1979,6 +1979,20 @@ static void zram_slot_free_notify(struct block_device *bdev,
        zram_slot_unlock(zram, index);
 }
 
+static void zram_comp_params_reset(struct zram *zram)
+{
+       u32 prio;
+
+       for (prio = ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++) {
+               struct zcomp_params *params = &zram->params[prio];
+
+               vfree(params->dict);
+               params->level = ZCOMP_PARAM_NO_LEVEL;
+               params->dict_sz = 0;
+               params->dict = NULL;
+       }
+}
+
 static void zram_destroy_comps(struct zram *zram)
 {
        u32 prio;
@@ -1992,6 +2006,8 @@ static void zram_destroy_comps(struct zram *zram)
                zcomp_destroy(comp);
                zram->num_active_comps--;
        }
+
+       zram_comp_params_reset(zram);
 }
 
 static void zram_reset_device(struct zram *zram)
@@ -2049,7 +2065,8 @@ static ssize_t disksize_store(struct device *dev,
                if (!zram->comp_algs[prio])
                        continue;
 
-               comp = zcomp_create(zram->comp_algs[prio]);
+               comp = zcomp_create(zram->comp_algs[prio],
+                                   &zram->params[prio]);
                if (IS_ERR(comp)) {
                        pr_err("Cannot initialise %s compressing backend\n",
                               zram->comp_algs[prio]);
@@ -2254,6 +2271,7 @@ static int zram_add(void)
        if (ret)
                goto out_cleanup_disk;
 
+       zram_comp_params_reset(zram);
        comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor);
 
        zram_debugfs_register(zram);
index 35e322144629224741c922618123ab5847023b79..b976824ead676468047702f9866006e8d313fdf0 100644 (file)
@@ -107,6 +107,7 @@ struct zram {
        struct zram_table_entry *table;
        struct zs_pool *mem_pool;
        struct zcomp *comps[ZRAM_MAX_COMPS];
+       struct zcomp_params params[ZRAM_MAX_COMPS];
        struct gendisk *disk;
        /* Prevent concurrent execution of device init */
        struct rw_semaphore init_lock;