xref: /aosp_15_r20/external/zstd/contrib/linux-kernel/zstd_compress_module.c (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2*01826a49SYabin Cui /*
3*01826a49SYabin Cui  * Copyright (c) Meta Platforms, Inc. and affiliates.
4*01826a49SYabin Cui  * All rights reserved.
5*01826a49SYabin Cui  *
6*01826a49SYabin Cui  * This source code is licensed under both the BSD-style license (found in the
7*01826a49SYabin Cui  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8*01826a49SYabin Cui  * in the COPYING file in the root directory of this source tree).
9*01826a49SYabin Cui  * You may select, at your option, one of the above-listed licenses.
10*01826a49SYabin Cui  */
11*01826a49SYabin Cui 
12*01826a49SYabin Cui #include <linux/kernel.h>
13*01826a49SYabin Cui #include <linux/module.h>
14*01826a49SYabin Cui #include <linux/string.h>
15*01826a49SYabin Cui #include <linux/zstd.h>
16*01826a49SYabin Cui 
17*01826a49SYabin Cui #include "common/zstd_deps.h"
18*01826a49SYabin Cui #include "common/zstd_internal.h"
19*01826a49SYabin Cui 
20*01826a49SYabin Cui #define ZSTD_FORWARD_IF_ERR(ret)            \
21*01826a49SYabin Cui 	do {                                \
22*01826a49SYabin Cui 		size_t const __ret = (ret); \
23*01826a49SYabin Cui 		if (ZSTD_isError(__ret))    \
24*01826a49SYabin Cui 			return __ret;       \
25*01826a49SYabin Cui 	} while (0)
26*01826a49SYabin Cui 
zstd_cctx_init(zstd_cctx * cctx,const zstd_parameters * parameters,unsigned long long pledged_src_size)27*01826a49SYabin Cui static size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters,
28*01826a49SYabin Cui 	unsigned long long pledged_src_size)
29*01826a49SYabin Cui {
30*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset(
31*01826a49SYabin Cui 		cctx, ZSTD_reset_session_and_parameters));
32*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize(
33*01826a49SYabin Cui 		cctx, pledged_src_size));
34*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
35*01826a49SYabin Cui 		cctx, ZSTD_c_windowLog, parameters->cParams.windowLog));
36*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
37*01826a49SYabin Cui 		cctx, ZSTD_c_hashLog, parameters->cParams.hashLog));
38*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
39*01826a49SYabin Cui 		cctx, ZSTD_c_chainLog, parameters->cParams.chainLog));
40*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
41*01826a49SYabin Cui 		cctx, ZSTD_c_searchLog, parameters->cParams.searchLog));
42*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
43*01826a49SYabin Cui 		cctx, ZSTD_c_minMatch, parameters->cParams.minMatch));
44*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
45*01826a49SYabin Cui 		cctx, ZSTD_c_targetLength, parameters->cParams.targetLength));
46*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
47*01826a49SYabin Cui 		cctx, ZSTD_c_strategy, parameters->cParams.strategy));
48*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
49*01826a49SYabin Cui 		cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag));
50*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
51*01826a49SYabin Cui 		cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag));
52*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
53*01826a49SYabin Cui 		cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag));
54*01826a49SYabin Cui 	return 0;
55*01826a49SYabin Cui }
56*01826a49SYabin Cui 
zstd_min_clevel(void)57*01826a49SYabin Cui int zstd_min_clevel(void)
58*01826a49SYabin Cui {
59*01826a49SYabin Cui 	return ZSTD_minCLevel();
60*01826a49SYabin Cui }
61*01826a49SYabin Cui EXPORT_SYMBOL(zstd_min_clevel);
62*01826a49SYabin Cui 
zstd_max_clevel(void)63*01826a49SYabin Cui int zstd_max_clevel(void)
64*01826a49SYabin Cui {
65*01826a49SYabin Cui 	return ZSTD_maxCLevel();
66*01826a49SYabin Cui }
67*01826a49SYabin Cui EXPORT_SYMBOL(zstd_max_clevel);
68*01826a49SYabin Cui 
zstd_compress_bound(size_t src_size)69*01826a49SYabin Cui size_t zstd_compress_bound(size_t src_size)
70*01826a49SYabin Cui {
71*01826a49SYabin Cui 	return ZSTD_compressBound(src_size);
72*01826a49SYabin Cui }
73*01826a49SYabin Cui EXPORT_SYMBOL(zstd_compress_bound);
74*01826a49SYabin Cui 
zstd_get_params(int level,unsigned long long estimated_src_size)75*01826a49SYabin Cui zstd_parameters zstd_get_params(int level,
76*01826a49SYabin Cui 	unsigned long long estimated_src_size)
77*01826a49SYabin Cui {
78*01826a49SYabin Cui 	return ZSTD_getParams(level, estimated_src_size, 0);
79*01826a49SYabin Cui }
80*01826a49SYabin Cui EXPORT_SYMBOL(zstd_get_params);
81*01826a49SYabin Cui 
zstd_cctx_workspace_bound(const zstd_compression_parameters * cparams)82*01826a49SYabin Cui size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams)
83*01826a49SYabin Cui {
84*01826a49SYabin Cui 	return ZSTD_estimateCCtxSize_usingCParams(*cparams);
85*01826a49SYabin Cui }
86*01826a49SYabin Cui EXPORT_SYMBOL(zstd_cctx_workspace_bound);
87*01826a49SYabin Cui 
zstd_init_cctx(void * workspace,size_t workspace_size)88*01826a49SYabin Cui zstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size)
89*01826a49SYabin Cui {
90*01826a49SYabin Cui 	if (workspace == NULL)
91*01826a49SYabin Cui 		return NULL;
92*01826a49SYabin Cui 	return ZSTD_initStaticCCtx(workspace, workspace_size);
93*01826a49SYabin Cui }
94*01826a49SYabin Cui EXPORT_SYMBOL(zstd_init_cctx);
95*01826a49SYabin Cui 
zstd_compress_cctx(zstd_cctx * cctx,void * dst,size_t dst_capacity,const void * src,size_t src_size,const zstd_parameters * parameters)96*01826a49SYabin Cui size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity,
97*01826a49SYabin Cui 	const void *src, size_t src_size, const zstd_parameters *parameters)
98*01826a49SYabin Cui {
99*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size));
100*01826a49SYabin Cui 	return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size);
101*01826a49SYabin Cui }
102*01826a49SYabin Cui EXPORT_SYMBOL(zstd_compress_cctx);
103*01826a49SYabin Cui 
zstd_cstream_workspace_bound(const zstd_compression_parameters * cparams)104*01826a49SYabin Cui size_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cparams)
105*01826a49SYabin Cui {
106*01826a49SYabin Cui 	return ZSTD_estimateCStreamSize_usingCParams(*cparams);
107*01826a49SYabin Cui }
108*01826a49SYabin Cui EXPORT_SYMBOL(zstd_cstream_workspace_bound);
109*01826a49SYabin Cui 
zstd_init_cstream(const zstd_parameters * parameters,unsigned long long pledged_src_size,void * workspace,size_t workspace_size)110*01826a49SYabin Cui zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters,
111*01826a49SYabin Cui 	unsigned long long pledged_src_size, void *workspace, size_t workspace_size)
112*01826a49SYabin Cui {
113*01826a49SYabin Cui 	zstd_cstream *cstream;
114*01826a49SYabin Cui 
115*01826a49SYabin Cui 	if (workspace == NULL)
116*01826a49SYabin Cui 		return NULL;
117*01826a49SYabin Cui 
118*01826a49SYabin Cui 	cstream = ZSTD_initStaticCStream(workspace, workspace_size);
119*01826a49SYabin Cui 	if (cstream == NULL)
120*01826a49SYabin Cui 		return NULL;
121*01826a49SYabin Cui 
122*01826a49SYabin Cui 	/* 0 means unknown in linux zstd API but means 0 in new zstd API */
123*01826a49SYabin Cui 	if (pledged_src_size == 0)
124*01826a49SYabin Cui 		pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN;
125*01826a49SYabin Cui 
126*01826a49SYabin Cui 	if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size)))
127*01826a49SYabin Cui 		return NULL;
128*01826a49SYabin Cui 
129*01826a49SYabin Cui 	return cstream;
130*01826a49SYabin Cui }
131*01826a49SYabin Cui EXPORT_SYMBOL(zstd_init_cstream);
132*01826a49SYabin Cui 
zstd_reset_cstream(zstd_cstream * cstream,unsigned long long pledged_src_size)133*01826a49SYabin Cui size_t zstd_reset_cstream(zstd_cstream *cstream,
134*01826a49SYabin Cui 	unsigned long long pledged_src_size)
135*01826a49SYabin Cui {
136*01826a49SYabin Cui 	if (pledged_src_size == 0)
137*01826a49SYabin Cui 		pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN;
138*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_reset(cstream, ZSTD_reset_session_only) );
139*01826a49SYabin Cui 	ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_setPledgedSrcSize(cstream, pledged_src_size) );
140*01826a49SYabin Cui 	return 0;
141*01826a49SYabin Cui }
142*01826a49SYabin Cui EXPORT_SYMBOL(zstd_reset_cstream);
143*01826a49SYabin Cui 
zstd_compress_stream(zstd_cstream * cstream,zstd_out_buffer * output,zstd_in_buffer * input)144*01826a49SYabin Cui size_t zstd_compress_stream(zstd_cstream *cstream, zstd_out_buffer *output,
145*01826a49SYabin Cui 	zstd_in_buffer *input)
146*01826a49SYabin Cui {
147*01826a49SYabin Cui 	return ZSTD_compressStream(cstream, output, input);
148*01826a49SYabin Cui }
149*01826a49SYabin Cui EXPORT_SYMBOL(zstd_compress_stream);
150*01826a49SYabin Cui 
zstd_flush_stream(zstd_cstream * cstream,zstd_out_buffer * output)151*01826a49SYabin Cui size_t zstd_flush_stream(zstd_cstream *cstream, zstd_out_buffer *output)
152*01826a49SYabin Cui {
153*01826a49SYabin Cui 	return ZSTD_flushStream(cstream, output);
154*01826a49SYabin Cui }
155*01826a49SYabin Cui EXPORT_SYMBOL(zstd_flush_stream);
156*01826a49SYabin Cui 
zstd_end_stream(zstd_cstream * cstream,zstd_out_buffer * output)157*01826a49SYabin Cui size_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output)
158*01826a49SYabin Cui {
159*01826a49SYabin Cui 	return ZSTD_endStream(cstream, output);
160*01826a49SYabin Cui }
161*01826a49SYabin Cui EXPORT_SYMBOL(zstd_end_stream);
162*01826a49SYabin Cui 
163*01826a49SYabin Cui MODULE_LICENSE("Dual BSD/GPL");
164*01826a49SYabin Cui MODULE_DESCRIPTION("Zstd Compressor");
165