| From: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Subject: zram: add config init/release backend callbacks |
| Date: Wed, 15 May 2024 16:12:53 +0900 |
| |
| Some backends can create a backend-specific private data for comp config, |
| e.g. parse a dictionary and use it to init all of the ctx-s later on. |
| Introduce two zcomp_config callbacks to create and destroy per-config |
| backend private data. This is also the place where config can be |
| validated. |
| |
| Link: https://lkml.kernel.org/r/20240515071645.1788128-17-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 | 11 +++++++++++ |
| drivers/block/zram/backend_deflate.c | 20 +++++++++++++++----- |
| drivers/block/zram/backend_lz4.c | 20 +++++++++++++++----- |
| drivers/block/zram/backend_lz4hc.c | 20 +++++++++++++++----- |
| drivers/block/zram/backend_lzo.c | 11 +++++++++++ |
| drivers/block/zram/backend_lzorle.c | 11 +++++++++++ |
| drivers/block/zram/backend_zstd.c | 20 +++++++++++++++----- |
| drivers/block/zram/zcomp.c | 6 ++++++ |
| drivers/block/zram/zcomp.h | 4 ++++ |
| drivers/block/zram/zram_drv.c | 3 +++ |
| 10 files changed, 106 insertions(+), 20 deletions(-) |
| |
| --- a/drivers/block/zram/backend_842.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_842.c |
| @@ -11,6 +11,15 @@ struct sw842_ctx { |
| void *mem; |
| }; |
| |
| +static int init_config_842(struct zcomp_config *config) |
| +{ |
| + return 0; |
| +} |
| + |
| +static void release_config_842(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void destroy_842(void *ctx) |
| { |
| struct sw842_ctx *zctx = ctx; |
| @@ -64,5 +73,7 @@ struct zcomp_backend backend_842 = { |
| .decompress = decompress_842, |
| .create_ctx = create_842, |
| .destroy_ctx = destroy_842, |
| + .init_config = init_config_842, |
| + .release_config = release_config_842, |
| .name = "842", |
| }; |
| --- a/drivers/block/zram/backend_deflate.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_deflate.c |
| @@ -17,6 +17,18 @@ struct deflate_ctx { |
| s32 level; |
| }; |
| |
| +static int deflate_init_config(struct zcomp_config *config) |
| +{ |
| + if (config->level == ZCOMP_CONFIG_NO_LEVEL) |
| + config->level = Z_DEFAULT_COMPRESSION; |
| + |
| + return 0; |
| +} |
| + |
| +static void deflate_release_config(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void deflate_destroy(void *ctx) |
| { |
| struct deflate_ctx *zctx = ctx; |
| @@ -42,11 +54,7 @@ static void *deflate_create(struct zcomp |
| if (!ctx) |
| return NULL; |
| |
| - if (config->level != ZCOMP_CONFIG_NO_LEVEL) |
| - ctx->level = config->level; |
| - else |
| - ctx->level = Z_DEFAULT_COMPRESSION; |
| - |
| + ctx->level = config->level; |
| sz = zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL); |
| ctx->cctx.workspace = vzalloc(sz); |
| if (!ctx->cctx.workspace) |
| @@ -129,5 +137,7 @@ struct zcomp_backend backend_deflate = { |
| .decompress = deflate_decompress, |
| .create_ctx = deflate_create, |
| .destroy_ctx = deflate_destroy, |
| + .init_config = deflate_init_config, |
| + .release_config = deflate_release_config, |
| .name = "deflate", |
| }; |
| --- a/drivers/block/zram/backend_lz4.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_lz4.c |
| @@ -10,6 +10,18 @@ struct lz4_ctx { |
| s32 level; |
| }; |
| |
| +static int lz4_init_config(struct zcomp_config *config) |
| +{ |
| + if (config->level == ZCOMP_CONFIG_NO_LEVEL) |
| + config->level = LZ4_ACCELERATION_DEFAULT; |
| + |
| + return 0; |
| +} |
| + |
| +static void lz4_release_config(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void lz4_destroy(void *ctx) |
| { |
| struct lz4_ctx *zctx = ctx; |
| @@ -26,11 +38,7 @@ static void *lz4_create(struct zcomp_con |
| if (!ctx) |
| return NULL; |
| |
| - if (config->level != ZCOMP_CONFIG_NO_LEVEL) |
| - ctx->level = config->level; |
| - else |
| - ctx->level = LZ4_ACCELERATION_DEFAULT; |
| - |
| + ctx->level = config->level; |
| ctx->mem = vmalloc(LZ4_MEM_COMPRESS); |
| if (!ctx->mem) |
| goto error; |
| @@ -72,5 +80,7 @@ struct zcomp_backend backend_lz4 = { |
| .decompress = lz4_decompress, |
| .create_ctx = lz4_create, |
| .destroy_ctx = lz4_destroy, |
| + .init_config = lz4_init_config, |
| + .release_config = lz4_release_config, |
| .name = "lz4", |
| }; |
| --- a/drivers/block/zram/backend_lz4hc.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_lz4hc.c |
| @@ -10,6 +10,18 @@ struct lz4hc_ctx { |
| s32 level; |
| }; |
| |
| +static int lz4hc_init_config(struct zcomp_config *config) |
| +{ |
| + if (config->level == ZCOMP_CONFIG_NO_LEVEL) |
| + config->level = LZ4HC_DEFAULT_CLEVEL; |
| + |
| + return 0; |
| +} |
| + |
| +static void lz4hc_release_config(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void lz4hc_destroy(void *ctx) |
| { |
| struct lz4hc_ctx *zctx = ctx; |
| @@ -26,11 +38,7 @@ static void *lz4hc_create(struct zcomp_c |
| if (!ctx) |
| return NULL; |
| |
| - if (config->level != ZCOMP_CONFIG_NO_LEVEL) |
| - ctx->level = config->level; |
| - else |
| - ctx->level = LZ4HC_DEFAULT_CLEVEL; |
| - |
| + ctx->level = config->level; |
| ctx->mem = vmalloc(LZ4HC_MEM_COMPRESS); |
| if (!ctx->mem) |
| goto error; |
| @@ -72,5 +80,7 @@ struct zcomp_backend backend_lz4hc = { |
| .decompress = lz4hc_decompress, |
| .create_ctx = lz4hc_create, |
| .destroy_ctx = lz4hc_destroy, |
| + .init_config = lz4hc_init_config, |
| + .release_config = lz4hc_release_config, |
| .name = "lz4hc", |
| }; |
| --- a/drivers/block/zram/backend_lzo.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_lzo.c |
| @@ -6,6 +6,15 @@ |
| |
| #include "backend_lzo.h" |
| |
| +static int lzo_init_config(struct zcomp_config *config) |
| +{ |
| + return 0; |
| +} |
| + |
| +static void lzo_release_config(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void *lzo_create(struct zcomp_config *config) |
| { |
| return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); |
| @@ -40,5 +49,7 @@ struct zcomp_backend backend_lzo = { |
| .decompress = lzo_decompress, |
| .create_ctx = lzo_create, |
| .destroy_ctx = lzo_destroy, |
| + .init_config = lzo_init_config, |
| + .release_config = lzo_release_config, |
| .name = "lzo", |
| }; |
| --- a/drivers/block/zram/backend_lzorle.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_lzorle.c |
| @@ -6,6 +6,15 @@ |
| |
| #include "backend_lzorle.h" |
| |
| +static int lzorle_init_config(struct zcomp_config *config) |
| +{ |
| + return 0; |
| +} |
| + |
| +static void lzorle_release_config(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void *lzorle_create(struct zcomp_config *config) |
| { |
| return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); |
| @@ -40,5 +49,7 @@ struct zcomp_backend backend_lzorle = { |
| .decompress = lzorle_decompress, |
| .create_ctx = lzorle_create, |
| .destroy_ctx = lzorle_destroy, |
| + .init_config = lzorle_init_config, |
| + .release_config = lzorle_release_config, |
| .name = "lzo-rle", |
| }; |
| --- a/drivers/block/zram/backend_zstd.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/backend_zstd.c |
| @@ -36,6 +36,18 @@ static void zstd_ctx_free(void *opaque, |
| kvfree(address); |
| } |
| |
| +static int zstd_init_config(struct zcomp_config *config) |
| +{ |
| + if (config->level == ZCOMP_CONFIG_NO_LEVEL) |
| + config->level = zstd_default_clevel(); |
| + |
| + return 0; |
| +} |
| + |
| +static void zstd_release_config(struct zcomp_config *config) |
| +{ |
| +} |
| + |
| static void zstd_destroy(void *ctx) |
| { |
| struct zstd_ctx *zctx = ctx; |
| @@ -63,11 +75,7 @@ static void *zstd_create(struct zcomp_co |
| if (!ctx) |
| return NULL; |
| |
| - if (config->level != ZCOMP_CONFIG_NO_LEVEL) |
| - ctx->level = config->level; |
| - else |
| - ctx->level = zstd_default_clevel(); |
| - |
| + ctx->level = config->level; |
| ctx->ctx_mem.customAlloc = zstd_ctx_alloc; |
| ctx->ctx_mem.customFree = zstd_ctx_free; |
| |
| @@ -173,5 +181,7 @@ struct zcomp_backend backend_zstd = { |
| .decompress = zstd_decompress, |
| .create_ctx = zstd_create, |
| .destroy_ctx = zstd_destroy, |
| + .init_config = zstd_init_config, |
| + .release_config = zstd_release_config, |
| .name = "zstd", |
| }; |
| --- a/drivers/block/zram/zcomp.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/zcomp.c |
| @@ -187,18 +187,24 @@ static int zcomp_init(struct zcomp *comp |
| if (!comp->stream) |
| return -ENOMEM; |
| |
| + ret = comp->backend->init_config(comp->config); |
| + if (ret) |
| + goto cleanup; |
| + |
| ret = cpuhp_state_add_instance(CPUHP_ZCOMP_PREPARE, &comp->node); |
| if (ret < 0) |
| goto cleanup; |
| return 0; |
| |
| cleanup: |
| + comp->backend->release_config(comp->config); |
| free_percpu(comp->stream); |
| return ret; |
| } |
| |
| void zcomp_destroy(struct zcomp *comp) |
| { |
| + comp->backend->release_config(comp->config); |
| cpuhp_state_remove_instance(CPUHP_ZCOMP_PREPARE, &comp->node); |
| free_percpu(comp->stream); |
| kfree(comp); |
| --- a/drivers/block/zram/zcomp.h~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/zcomp.h |
| @@ -22,6 +22,7 @@ struct zcomp_config { |
| s32 level; |
| size_t dict_sz; |
| void *dict; |
| + void *private; |
| }; |
| |
| struct zcomp_backend { |
| @@ -34,6 +35,9 @@ struct zcomp_backend { |
| void *(*create_ctx)(struct zcomp_config *config); |
| void (*destroy_ctx)(void *ctx); |
| |
| + int (*init_config)(struct zcomp_config *config); |
| + void (*release_config)(struct zcomp_config *config); |
| + |
| const char *name; |
| }; |
| |
| --- a/drivers/block/zram/zram_drv.c~zram-add-config-init-release-backend-callbacks |
| +++ a/drivers/block/zram/zram_drv.c |
| @@ -1003,6 +1003,9 @@ static void __reset_comp_config(struct z |
| { |
| struct zcomp_config *config = &zram->configs[prio]; |
| |
| + /* config->private should be freed by the backend */ |
| + WARN_ON_ONCE(config->private); |
| + |
| vfree(config->dict); |
| config->level = ZCOMP_CONFIG_NO_LEVEL; |
| config->dict_sz = 0; |
| _ |