Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

zram: add lz4hc compression backend support

Add s/w lz4hc compression support.

Link: https://lkml.kernel.org/r/20240902105656.1383858-8-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>

authored by

Sergey Senozhatsky and committed by
Andrew Morton
c60a4ef5 22d651c3

+100 -2
+11
drivers/block/zram/Kconfig
··· 26 26 select LZ4_COMPRESS 27 27 select LZ4_DECOMPRESS 28 28 29 + config ZRAM_BACKEND_LZ4HC 30 + bool "lz4hc compression support" 31 + depends on ZRAM 32 + select LZ4HC_COMPRESS 33 + select LZ4_DECOMPRESS 34 + 29 35 choice 30 36 prompt "Default zram compressor" 31 37 default ZRAM_DEF_COMP_LZORLE ··· 49 43 bool "lz4" 50 44 depends on ZRAM_BACKEND_LZ4 51 45 46 + config ZRAM_DEF_COMP_LZ4HC 47 + bool "lz4hc" 48 + depends on ZRAM_BACKEND_LZ4HC 49 + 52 50 endchoice 53 51 54 52 config ZRAM_DEF_COMP ··· 60 50 default "lzo-rle" if ZRAM_DEF_COMP_LZORLE 61 51 default "lzo" if ZRAM_DEF_COMP_LZO 62 52 default "lz4" if ZRAM_DEF_COMP_LZ4 53 + default "lz4hc" if ZRAM_DEF_COMP_LZ4HC 63 54 default "unset-value" 64 55 65 56 config ZRAM_WRITEBACK
+3 -2
drivers/block/zram/Makefile
··· 2 2 3 3 zram-y := zcomp.o zram_drv.o 4 4 5 - zram-$(CONFIG_ZRAM_BACKEND_LZO) += backend_lzorle.o backend_lzo.o 6 - zram-$(CONFIG_ZRAM_BACKEND_LZ4) += backend_lz4.o 5 + zram-$(CONFIG_ZRAM_BACKEND_LZO) += backend_lzorle.o backend_lzo.o 6 + zram-$(CONFIG_ZRAM_BACKEND_LZ4) += backend_lz4.o 7 + zram-$(CONFIG_ZRAM_BACKEND_LZ4HC) += backend_lz4hc.o 7 8 8 9 obj-$(CONFIG_ZRAM) += zram.o
+72
drivers/block/zram/backend_lz4hc.c
··· 1 + #include <linux/kernel.h> 2 + #include <linux/lz4.h> 3 + #include <linux/slab.h> 4 + #include <linux/vmalloc.h> 5 + 6 + #include "backend_lz4hc.h" 7 + 8 + struct lz4hc_ctx { 9 + void *mem; 10 + s32 level; 11 + }; 12 + 13 + static void lz4hc_destroy(void *ctx) 14 + { 15 + struct lz4hc_ctx *zctx = ctx; 16 + 17 + vfree(zctx->mem); 18 + kfree(zctx); 19 + } 20 + 21 + static void *lz4hc_create(void) 22 + { 23 + struct lz4hc_ctx *ctx; 24 + 25 + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); 26 + if (!ctx) 27 + return NULL; 28 + 29 + /* @FIXME: using a hardcoded LZ4HC_DEFAULT_CLEVEL for now */ 30 + ctx->level = LZ4HC_DEFAULT_CLEVEL; 31 + ctx->mem = vmalloc(LZ4HC_MEM_COMPRESS); 32 + if (!ctx->mem) 33 + goto error; 34 + 35 + return ctx; 36 + error: 37 + lz4hc_destroy(ctx); 38 + return NULL; 39 + } 40 + 41 + static int lz4hc_compress(void *ctx, const unsigned char *src, size_t src_len, 42 + unsigned char *dst, size_t *dst_len) 43 + { 44 + struct lz4hc_ctx *zctx = ctx; 45 + int ret; 46 + 47 + ret = LZ4_compress_HC(src, dst, src_len, *dst_len, 48 + zctx->level, zctx->mem); 49 + if (!ret) 50 + return -EINVAL; 51 + *dst_len = ret; 52 + return 0; 53 + } 54 + 55 + static int lz4hc_decompress(void *ctx, const unsigned char *src, 56 + size_t src_len, unsigned char *dst, size_t dst_len) 57 + { 58 + int ret; 59 + 60 + ret = LZ4_decompress_safe(src, dst, src_len, dst_len); 61 + if (ret < 0) 62 + return -EINVAL; 63 + return 0; 64 + } 65 + 66 + const struct zcomp_ops backend_lz4hc = { 67 + .compress = lz4hc_compress, 68 + .decompress = lz4hc_decompress, 69 + .create_ctx = lz4hc_create, 70 + .destroy_ctx = lz4hc_destroy, 71 + .name = "lz4hc", 72 + };
+10
drivers/block/zram/backend_lz4hc.h
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + 3 + #ifndef __BACKEND_LZ4HC_H__ 4 + #define __BACKEND_LZ4HC_H__ 5 + 6 + #include "zcomp.h" 7 + 8 + extern const struct zcomp_ops backend_lz4hc; 9 + 10 + #endif /* __BACKEND_LZ4HC_H__ */
+4
drivers/block/zram/zcomp.c
··· 15 15 #include "backend_lzo.h" 16 16 #include "backend_lzorle.h" 17 17 #include "backend_lz4.h" 18 + #include "backend_lz4hc.h" 18 19 19 20 static const struct zcomp_ops *backends[] = { 20 21 #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO) ··· 24 23 #endif 25 24 #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4) 26 25 &backend_lz4, 26 + #endif 27 + #if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZ4HC) 28 + &backend_lz4hc, 27 29 #endif 28 30 NULL 29 31 };