diff options
author | Sergey Senozhatsky <senozhatsky@chromium.org> | 2024-09-02 19:56:05 +0900 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2024-09-09 16:39:10 -0700 |
commit | 52c7b4e2ba508a924c991e681db534e66a851adf (patch) | |
tree | 3f58f8d12a5045c25409aceea5e7ba88435ca56f /drivers/block | |
parent | dea77d7aea9855af321b835e4fb2fff68cd94dac (diff) | |
download | lwn-52c7b4e2ba508a924c991e681db534e66a851adf.tar.gz lwn-52c7b4e2ba508a924c991e681db534e66a851adf.zip |
zram: introduce zcomp_req structure
Encapsulate compression/decompression data in zcomp_req structure.
Link: https://lkml.kernel.org/r/20240902105656.1383858-18-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>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/zram/backend_842.c | 17 | ||||
-rw-r--r-- | drivers/block/zram/backend_deflate.c | 26 | ||||
-rw-r--r-- | drivers/block/zram/backend_lz4.c | 15 | ||||
-rw-r--r-- | drivers/block/zram/backend_lz4hc.c | 13 | ||||
-rw-r--r-- | drivers/block/zram/backend_lzo.c | 12 | ||||
-rw-r--r-- | drivers/block/zram/backend_lzorle.c | 13 | ||||
-rw-r--r-- | drivers/block/zram/backend_zstd.c | 15 | ||||
-rw-r--r-- | drivers/block/zram/zcomp.c | 23 | ||||
-rw-r--r-- | 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 @@ error: 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 @@ error: 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 @@ error: 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 @@ error: 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 @@ error: 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 173ee2b79442..20ad7b6fe62f 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -119,22 +119,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); |