[PATCH v6 17/23] zram: introduce zcomp_req structure

From: Sergey Senozhatsky
Date: Fri Jul 12 2024 - 01:25:12 EST


Encapsulate compression/decompression data in zcomp_req
structure.

Signed-off-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx>
---
drivers/block/zram/backend_842.c | 17 ++++++++---------
drivers/block/zram/backend_deflate.c | 26 +++++++++++---------------
drivers/block/zram/backend_lz4.c | 15 +++++++--------
drivers/block/zram/backend_lz4hc.c | 13 ++++++-------
drivers/block/zram/backend_lzo.c | 12 ++++++------
drivers/block/zram/backend_lzorle.c | 13 ++++++-------
drivers/block/zram/backend_zstd.c | 15 +++++++--------
drivers/block/zram/zcomp.c | 23 ++++++++++++++++-------
drivers/block/zram/zcomp.h | 15 ++++++++++-----
9 files changed, 77 insertions(+), 72 deletions(-)

diff --git a/drivers/block/zram/backend_842.c b/drivers/block/zram/backend_842.c
index e14dba30b0a2..1597dc4d4f1c 100644
--- a/drivers/block/zram/backend_842.c
+++ b/drivers/block/zram/backend_842.c
@@ -38,25 +38,24 @@ static void *create_842(struct zcomp_params *params)
return NULL;
}

-static int compress_842(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t *dst_len)
+static int compress_842(void *ctx, struct zcomp_req *req)
{
struct sw842_ctx *zctx = ctx;
- unsigned int dlen = *dst_len;
+ unsigned int dlen = req->dst_len;
int ret;

- ret = sw842_compress(src, src_len, dst, &dlen, zctx->mem);
+ ret = sw842_compress(req->src, req->src_len, req->dst, &dlen,
+ zctx->mem);
if (ret == 0)
- *dst_len = dlen;
+ req->dst_len = dlen;
return ret;
}

-static int decompress_842(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t dst_len)
+static int decompress_842(void *ctx, struct zcomp_req *req)
{
- unsigned int dlen = dst_len;
+ unsigned int dlen = req->dst_len;

- return sw842_decompress(src, src_len, dst, &dlen);
+ return sw842_decompress(req->src, req->src_len, req->dst, &dlen);
}

const struct zcomp_ops backend_842 = {
diff --git a/drivers/block/zram/backend_deflate.c b/drivers/block/zram/backend_deflate.c
index ec662ce46897..117852d45aa4 100644
--- a/drivers/block/zram/backend_deflate.c
+++ b/drivers/block/zram/backend_deflate.c
@@ -74,9 +74,7 @@ static void *deflate_create(struct zcomp_params *params)
return NULL;
}

-static int deflate_compress(void *ctx, const unsigned char *src,
- size_t src_len, unsigned char *dst,
- size_t *dst_len)
+static int deflate_compress(void *ctx, struct zcomp_req *req)
{
struct deflate_ctx *zctx = ctx;
struct z_stream_s *deflate;
@@ -87,22 +85,20 @@ static int deflate_compress(void *ctx, const unsigned char *src,
if (ret != Z_OK)
return -EINVAL;

- deflate->next_in = (u8 *)src;
- deflate->avail_in = src_len;
- deflate->next_out = (u8 *)dst;
- deflate->avail_out = *dst_len;
+ deflate->next_in = (u8 *)req->src;
+ deflate->avail_in = req->src_len;
+ deflate->next_out = (u8 *)req->dst;
+ deflate->avail_out = req->dst_len;

ret = zlib_deflate(deflate, Z_FINISH);
if (ret != Z_STREAM_END)
return -EINVAL;

- *dst_len = deflate->total_out;
+ req->dst_len = deflate->total_out;
return 0;
}

-static int deflate_decompress(void *ctx, const unsigned char *src,
- size_t src_len, unsigned char *dst,
- size_t dst_len)
+static int deflate_decompress(void *ctx, struct zcomp_req *req)
{
struct deflate_ctx *zctx = ctx;
struct z_stream_s *inflate;
@@ -114,10 +110,10 @@ static int deflate_decompress(void *ctx, const unsigned char *src,
if (ret != Z_OK)
return -EINVAL;

- inflate->next_in = (u8 *)src;
- inflate->avail_in = src_len;
- inflate->next_out = (u8 *)dst;
- inflate->avail_out = dst_len;
+ inflate->next_in = (u8 *)req->src;
+ inflate->avail_in = req->src_len;
+ inflate->next_out = (u8 *)req->dst;
+ inflate->avail_out = req->dst_len;

ret = zlib_inflate(inflate, Z_SYNC_FLUSH);
if (ret != Z_STREAM_END)
diff --git a/drivers/block/zram/backend_lz4.c b/drivers/block/zram/backend_lz4.c
index ec57b5acbd39..cc4ae4097870 100644
--- a/drivers/block/zram/backend_lz4.c
+++ b/drivers/block/zram/backend_lz4.c
@@ -41,26 +41,25 @@ static void *lz4_create(struct zcomp_params *params)
return NULL;
}

-static int lz4_compress(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t *dst_len)
+static int lz4_compress(void *ctx, struct zcomp_req *req)
{
struct lz4_ctx *zctx = ctx;
int ret;

- ret = LZ4_compress_fast(src, dst, src_len, *dst_len,
- zctx->level, zctx->mem);
+ ret = LZ4_compress_fast(req->src, req->dst, req->src_len,
+ req->dst_len, zctx->level, zctx->mem);
if (!ret)
return -EINVAL;
- *dst_len = ret;
+ req->dst_len = ret;
return 0;
}

-static int lz4_decompress(void *ctx, const unsigned char *src,
- size_t src_len, unsigned char *dst, size_t dst_len)
+static int lz4_decompress(void *ctx, struct zcomp_req *req)
{
int ret;

- ret = LZ4_decompress_safe(src, dst, src_len, dst_len);
+ ret = LZ4_decompress_safe(req->src, req->dst, req->src_len,
+ req->dst_len);
if (ret < 0)
return -EINVAL;
return 0;
diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backend_lz4hc.c
index 80733fead595..610dadc09751 100644
--- a/drivers/block/zram/backend_lz4hc.c
+++ b/drivers/block/zram/backend_lz4hc.c
@@ -41,26 +41,25 @@ static void *lz4hc_create(struct zcomp_params *params)
return NULL;
}

-static int lz4hc_compress(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t *dst_len)
+static int lz4hc_compress(void *ctx, struct zcomp_req *req)
{
struct lz4hc_ctx *zctx = ctx;
int ret;

- ret = LZ4_compress_HC(src, dst, src_len, *dst_len,
+ ret = LZ4_compress_HC(req->src, req->dst, req->src_len, req->dst_len,
zctx->level, zctx->mem);
if (!ret)
return -EINVAL;
- *dst_len = ret;
+ req->dst_len = ret;
return 0;
}

-static int lz4hc_decompress(void *ctx, const unsigned char *src,
- size_t src_len, unsigned char *dst, size_t dst_len)
+static int lz4hc_decompress(void *ctx, struct zcomp_req *req)
{
int ret;

- ret = LZ4_decompress_safe(src, dst, src_len, dst_len);
+ ret = LZ4_decompress_safe(req->src, req->dst, req->src_len,
+ req->dst_len);
if (ret < 0)
return -EINVAL;
return 0;
diff --git a/drivers/block/zram/backend_lzo.c b/drivers/block/zram/backend_lzo.c
index 8e4aabd04bf3..88f1aa5683f3 100644
--- a/drivers/block/zram/backend_lzo.c
+++ b/drivers/block/zram/backend_lzo.c
@@ -16,21 +16,21 @@ 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)
+static int lzo_compress(void *ctx, struct zcomp_req *req)
{
int ret;

- ret = lzo1x_1_compress(src, src_len, dst, dst_len, ctx);
+ ret = lzo1x_1_compress(req->src, req->src_len, req->dst,
+ &req->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)
+static int lzo_decompress(void *ctx, struct zcomp_req *req)
{
int ret;

- ret = lzo1x_decompress_safe(src, src_len, dst, &dst_len);
+ ret = lzo1x_decompress_safe(req->src, req->src_len,
+ req->dst, &req->dst_len);
return ret == LZO_E_OK ? 0 : ret;
}

diff --git a/drivers/block/zram/backend_lzorle.c b/drivers/block/zram/backend_lzorle.c
index cb01eb8b04f4..f05820929a74 100644
--- a/drivers/block/zram/backend_lzorle.c
+++ b/drivers/block/zram/backend_lzorle.c
@@ -16,22 +16,21 @@ 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)
+static int lzorle_compress(void *ctx, struct zcomp_req *req)
{
int ret;

- ret = lzorle1x_1_compress(src, src_len, dst, dst_len, ctx);
+ ret = lzorle1x_1_compress(req->src, req->src_len, req->dst,
+ &req->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)
+static int lzorle_decompress(void *ctx, struct zcomp_req *req)
{
int ret;

- ret = lzo1x_decompress_safe(src, src_len, dst, &dst_len);
+ ret = lzo1x_decompress_safe(req->src, req->src_len,
+ req->dst, &req->dst_len);
return ret == LZO_E_OK ? 0 : ret;
}

diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend_zstd.c
index 7c6798f0c912..19eba65f44c9 100644
--- a/drivers/block/zram/backend_zstd.c
+++ b/drivers/block/zram/backend_zstd.c
@@ -67,27 +67,26 @@ static void *zstd_create(struct zcomp_params *params)
return NULL;
}

-static int zstd_compress(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t *dst_len)
+static int zstd_compress(void *ctx, struct zcomp_req *req)
{
struct zstd_ctx *zctx = ctx;
size_t ret;

- ret = zstd_compress_cctx(zctx->cctx, dst, *dst_len,
- src, src_len, &zctx->cprm);
+ ret = zstd_compress_cctx(zctx->cctx, req->dst, req->dst_len,
+ req->src, req->src_len, &zctx->cprm);
if (zstd_is_error(ret))
return -EINVAL;
- *dst_len = ret;
+ req->dst_len = ret;
return 0;
}

-static int zstd_decompress(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t dst_len)
+static int zstd_decompress(void *ctx, struct zcomp_req *req)
{
struct zstd_ctx *zctx = ctx;
size_t ret;

- ret = zstd_decompress_dctx(zctx->dctx, dst, dst_len, src, src_len);
+ ret = zstd_decompress_dctx(zctx->dctx, req->dst, req->dst_len,
+ req->src, req->src_len);
if (zstd_is_error(ret))
return -EINVAL;
return 0;
diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c
index 08c51f33b5d9..5048087390ea 100644
--- a/drivers/block/zram/zcomp.c
+++ b/drivers/block/zram/zcomp.c
@@ -118,22 +118,31 @@ void zcomp_stream_put(struct zcomp *comp)
int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm,
const void *src, unsigned int *dst_len)
{
- /* The dst buffer should always be 2 * PAGE_SIZE */
- size_t dlen = 2 * PAGE_SIZE;
+ struct zcomp_req req = {
+ .src = src,
+ .dst = zstrm->buffer,
+ .src_len = PAGE_SIZE,
+ .dst_len = 2 * PAGE_SIZE,
+ };
int ret;

- ret = comp->ops->compress(zstrm->ctx, src, PAGE_SIZE,
- zstrm->buffer, &dlen);
+ ret = comp->ops->compress(zstrm->ctx, &req);
if (!ret)
- *dst_len = dlen;
+ *dst_len = req.dst_len;
return ret;
}

int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm,
const void *src, unsigned int src_len, void *dst)
{
- return comp->ops->decompress(zstrm->ctx, src, src_len,
- dst, PAGE_SIZE);
+ struct zcomp_req req = {
+ .src = src,
+ .dst = dst,
+ .src_len = src_len,
+ .dst_len = PAGE_SIZE,
+ };
+
+ return comp->ops->decompress(zstrm->ctx, &req);
}

int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node)
diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h
index 217a750fa908..bbc48094f826 100644
--- a/drivers/block/zram/zcomp.h
+++ b/drivers/block/zram/zcomp.h
@@ -21,12 +21,17 @@ struct zcomp_strm {
void *ctx;
};

-struct zcomp_ops {
- int (*compress)(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t *dst_len);
+struct zcomp_req {
+ const unsigned char *src;
+ const size_t src_len;
+
+ unsigned char *dst;
+ size_t dst_len;
+};

- int (*decompress)(void *ctx, const unsigned char *src, size_t src_len,
- unsigned char *dst, size_t dst_len);
+struct zcomp_ops {
+ int (*compress)(void *ctx, struct zcomp_req *req);
+ int (*decompress)(void *ctx, struct zcomp_req *req);

void *(*create_ctx)(struct zcomp_params *params);
void (*destroy_ctx)(void *ctx);
--
2.45.2.993.g49e7a77208-goog