1

zram: add lzo and lzorle compression backends support

Add s/w lzo/lzorle compression support.

Link: https://lkml.kernel.org/r/20240902105656.1383858-6-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>
This commit is contained in:
Sergey Senozhatsky 2024-09-02 19:55:53 +09:00 committed by Andrew Morton
parent 917a59e81c
commit 2152247c55
7 changed files with 140 additions and 0 deletions

View File

@ -14,8 +14,31 @@ config ZRAM
See Documentation/admin-guide/blockdev/zram.rst for more information.
config ZRAM_BACKEND_LZO
bool "lzo and lzo-rle compression support"
depends on ZRAM
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"
config ZRAM_WRITEBACK

View File

@ -1,4 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-only
zram-y := zcomp.o zram_drv.o
zram-$(CONFIG_ZRAM_BACKEND_LZO) += backend_lzorle.o backend_lzo.o
obj-$(CONFIG_ZRAM) += zram.o

View File

@ -0,0 +1,43 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/lzo.h>
#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, size_t src_len,
unsigned char *dst, size_t *dst_len)
{
int ret;
ret = lzo1x_1_compress(src, src_len, dst, dst_len, ctx);
return ret == 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)
{
int ret;
ret = lzo1x_decompress_safe(src, src_len, dst, &dst_len);
return ret == LZO_E_OK ? 0 : ret;
}
const struct zcomp_ops backend_lzo = {
.compress = lzo_compress,
.decompress = lzo_decompress,
.create_ctx = lzo_create,
.destroy_ctx = lzo_destroy,
.name = "lzo",
};

View File

@ -0,0 +1,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#ifndef __BACKEND_LZO_H__
#define __BACKEND_LZO_H__
#include "zcomp.h"
extern const struct zcomp_ops backend_lzo;
#endif /* __BACKEND_LZO_H__ */

View File

@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/lzo.h>
#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, size_t src_len,
unsigned char *dst, size_t *dst_len)
{
int ret;
ret = lzorle1x_1_compress(src, src_len, dst, dst_len, ctx);
return ret == 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)
{
int ret;
ret = lzo1x_decompress_safe(src, src_len, dst, &dst_len);
return ret == LZO_E_OK ? 0 : ret;
}
const struct zcomp_ops backend_lzorle = {
.compress = lzorle_compress,
.decompress = lzorle_decompress,
.create_ctx = lzorle_create,
.destroy_ctx = lzorle_destroy,
.name = "lzo-rle",
};

View File

@ -0,0 +1,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#ifndef __BACKEND_LZORLE_H__
#define __BACKEND_LZORLE_H__
#include "zcomp.h"
extern const struct zcomp_ops backend_lzorle;
#endif /* __BACKEND_LZORLE_H__ */

View File

@ -12,7 +12,14 @@
#include "zcomp.h"
#include "backend_lzo.h"
#include "backend_lzorle.h"
static const struct zcomp_ops *backends[] = {
#if IS_ENABLED(CONFIG_ZRAM_BACKEND_LZO)
&backend_lzorle,
&backend_lzo,
#endif
NULL
};