xref: /dpdk/lib/compressdev/rte_comp.c (revision 30a1de10)
1*99a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2*99a2dd95SBruce Richardson  * Copyright(c) 2017-2018 Intel Corporation
3*99a2dd95SBruce Richardson  */
4*99a2dd95SBruce Richardson 
5*99a2dd95SBruce Richardson #include "rte_comp.h"
6*99a2dd95SBruce Richardson #include "rte_compressdev_internal.h"
7*99a2dd95SBruce Richardson 
8*99a2dd95SBruce Richardson const char *
rte_comp_get_feature_name(uint64_t flag)9*99a2dd95SBruce Richardson rte_comp_get_feature_name(uint64_t flag)
10*99a2dd95SBruce Richardson {
11*99a2dd95SBruce Richardson 	switch (flag) {
12*99a2dd95SBruce Richardson 	case RTE_COMP_FF_STATEFUL_COMPRESSION:
13*99a2dd95SBruce Richardson 		return "STATEFUL_COMPRESSION";
14*99a2dd95SBruce Richardson 	case RTE_COMP_FF_STATEFUL_DECOMPRESSION:
15*99a2dd95SBruce Richardson 		return "STATEFUL_DECOMPRESSION";
16*99a2dd95SBruce Richardson 	case RTE_COMP_FF_OOP_SGL_IN_SGL_OUT:
17*99a2dd95SBruce Richardson 		return "OOP_SGL_IN_SGL_OUT";
18*99a2dd95SBruce Richardson 	case RTE_COMP_FF_OOP_SGL_IN_LB_OUT:
19*99a2dd95SBruce Richardson 		return "OOP_SGL_IN_LB_OUT";
20*99a2dd95SBruce Richardson 	case RTE_COMP_FF_OOP_LB_IN_SGL_OUT:
21*99a2dd95SBruce Richardson 		return "OOP_LB_IN_SGL_OUT";
22*99a2dd95SBruce Richardson 	case RTE_COMP_FF_MULTI_PKT_CHECKSUM:
23*99a2dd95SBruce Richardson 		return "MULTI_PKT_CHECKSUM";
24*99a2dd95SBruce Richardson 	case RTE_COMP_FF_ADLER32_CHECKSUM:
25*99a2dd95SBruce Richardson 		return "ADLER32_CHECKSUM";
26*99a2dd95SBruce Richardson 	case RTE_COMP_FF_CRC32_CHECKSUM:
27*99a2dd95SBruce Richardson 		return "CRC32_CHECKSUM";
28*99a2dd95SBruce Richardson 	case RTE_COMP_FF_CRC32_ADLER32_CHECKSUM:
29*99a2dd95SBruce Richardson 		return "CRC32_ADLER32_CHECKSUM";
30*99a2dd95SBruce Richardson 	case RTE_COMP_FF_NONCOMPRESSED_BLOCKS:
31*99a2dd95SBruce Richardson 		return "NONCOMPRESSED_BLOCKS";
32*99a2dd95SBruce Richardson 	case RTE_COMP_FF_SHA1_HASH:
33*99a2dd95SBruce Richardson 		return "SHA1_HASH";
34*99a2dd95SBruce Richardson 	case RTE_COMP_FF_SHA2_SHA256_HASH:
35*99a2dd95SBruce Richardson 		return "SHA2_SHA256_HASH";
36*99a2dd95SBruce Richardson 	case RTE_COMP_FF_SHAREABLE_PRIV_XFORM:
37*99a2dd95SBruce Richardson 		return "SHAREABLE_PRIV_XFORM";
38*99a2dd95SBruce Richardson 	case RTE_COMP_FF_HUFFMAN_FIXED:
39*99a2dd95SBruce Richardson 		return "HUFFMAN_FIXED";
40*99a2dd95SBruce Richardson 	case RTE_COMP_FF_HUFFMAN_DYNAMIC:
41*99a2dd95SBruce Richardson 		return "HUFFMAN_DYNAMIC";
42*99a2dd95SBruce Richardson 	default:
43*99a2dd95SBruce Richardson 		return NULL;
44*99a2dd95SBruce Richardson 	}
45*99a2dd95SBruce Richardson }
46*99a2dd95SBruce Richardson 
47*99a2dd95SBruce Richardson /**
48*99a2dd95SBruce Richardson  * Reset the fields of an operation to their default values.
49*99a2dd95SBruce Richardson  *
50*99a2dd95SBruce Richardson  * @note The private data associated with the operation is not zeroed.
51*99a2dd95SBruce Richardson  *
52*99a2dd95SBruce Richardson  * @param op
53*99a2dd95SBruce Richardson  *   The operation to be reset
54*99a2dd95SBruce Richardson  */
55*99a2dd95SBruce Richardson static inline void
rte_comp_op_reset(struct rte_comp_op * op)56*99a2dd95SBruce Richardson rte_comp_op_reset(struct rte_comp_op *op)
57*99a2dd95SBruce Richardson {
58*99a2dd95SBruce Richardson 	struct rte_mempool *tmp_mp = op->mempool;
59*99a2dd95SBruce Richardson 	rte_iova_t tmp_iova_addr = op->iova_addr;
60*99a2dd95SBruce Richardson 
61*99a2dd95SBruce Richardson 	memset(op, 0, sizeof(struct rte_comp_op));
62*99a2dd95SBruce Richardson 	op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
63*99a2dd95SBruce Richardson 	op->iova_addr = tmp_iova_addr;
64*99a2dd95SBruce Richardson 	op->mempool = tmp_mp;
65*99a2dd95SBruce Richardson }
66*99a2dd95SBruce Richardson 
67*99a2dd95SBruce Richardson /**
68*99a2dd95SBruce Richardson  * Private data structure belonging to an operation pool.
69*99a2dd95SBruce Richardson  */
70*99a2dd95SBruce Richardson struct rte_comp_op_pool_private {
71*99a2dd95SBruce Richardson 	uint16_t user_size;
72*99a2dd95SBruce Richardson 	/**< Size of private user data with each operation. */
73*99a2dd95SBruce Richardson };
74*99a2dd95SBruce Richardson 
75*99a2dd95SBruce Richardson /**
76*99a2dd95SBruce Richardson  * Bulk allocate raw element from mempool and return as comp operations
77*99a2dd95SBruce Richardson  *
78*99a2dd95SBruce Richardson  * @param mempool
79*99a2dd95SBruce Richardson  *   Compress operation mempool
80*99a2dd95SBruce Richardson  * @param ops
81*99a2dd95SBruce Richardson  *   Array to place allocated operations
82*99a2dd95SBruce Richardson  * @param nb_ops
83*99a2dd95SBruce Richardson  *   Number of operations to allocate
84*99a2dd95SBruce Richardson  * @return
85*99a2dd95SBruce Richardson  *   - nb_ops: Success, the nb_ops requested was allocated
86*99a2dd95SBruce Richardson  *   - 0: Not enough entries in the mempool; no ops are retrieved.
87*99a2dd95SBruce Richardson  */
88*99a2dd95SBruce Richardson static inline int
rte_comp_op_raw_bulk_alloc(struct rte_mempool * mempool,struct rte_comp_op ** ops,uint16_t nb_ops)89*99a2dd95SBruce Richardson rte_comp_op_raw_bulk_alloc(struct rte_mempool *mempool,
90*99a2dd95SBruce Richardson 		struct rte_comp_op **ops, uint16_t nb_ops)
91*99a2dd95SBruce Richardson {
92*99a2dd95SBruce Richardson 	if (rte_mempool_get_bulk(mempool, (void **)ops, nb_ops) == 0)
93*99a2dd95SBruce Richardson 		return nb_ops;
94*99a2dd95SBruce Richardson 
95*99a2dd95SBruce Richardson 	return 0;
96*99a2dd95SBruce Richardson }
97*99a2dd95SBruce Richardson 
98*99a2dd95SBruce Richardson /** Initialise rte_comp_op mempool element */
99*99a2dd95SBruce Richardson static void
rte_comp_op_init(struct rte_mempool * mempool,__rte_unused void * opaque_arg,void * _op_data,__rte_unused unsigned int i)100*99a2dd95SBruce Richardson rte_comp_op_init(struct rte_mempool *mempool,
101*99a2dd95SBruce Richardson 		__rte_unused void *opaque_arg,
102*99a2dd95SBruce Richardson 		void *_op_data,
103*99a2dd95SBruce Richardson 		__rte_unused unsigned int i)
104*99a2dd95SBruce Richardson {
105*99a2dd95SBruce Richardson 	struct rte_comp_op *op = _op_data;
106*99a2dd95SBruce Richardson 
107*99a2dd95SBruce Richardson 	memset(_op_data, 0, mempool->elt_size);
108*99a2dd95SBruce Richardson 
109*99a2dd95SBruce Richardson 	op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
110*99a2dd95SBruce Richardson 	op->iova_addr = rte_mem_virt2iova(_op_data);
111*99a2dd95SBruce Richardson 	op->mempool = mempool;
112*99a2dd95SBruce Richardson }
113*99a2dd95SBruce Richardson 
114*99a2dd95SBruce Richardson struct rte_mempool *
rte_comp_op_pool_create(const char * name,unsigned int nb_elts,unsigned int cache_size,uint16_t user_size,int socket_id)115*99a2dd95SBruce Richardson rte_comp_op_pool_create(const char *name,
116*99a2dd95SBruce Richardson 		unsigned int nb_elts, unsigned int cache_size,
117*99a2dd95SBruce Richardson 		uint16_t user_size, int socket_id)
118*99a2dd95SBruce Richardson {
119*99a2dd95SBruce Richardson 	struct rte_comp_op_pool_private *priv;
120*99a2dd95SBruce Richardson 
121*99a2dd95SBruce Richardson 	unsigned int elt_size = sizeof(struct rte_comp_op) + user_size;
122*99a2dd95SBruce Richardson 
123*99a2dd95SBruce Richardson 	/* lookup mempool in case already allocated */
124*99a2dd95SBruce Richardson 	struct rte_mempool *mp = rte_mempool_lookup(name);
125*99a2dd95SBruce Richardson 
126*99a2dd95SBruce Richardson 	if (mp != NULL) {
127*99a2dd95SBruce Richardson 		priv = (struct rte_comp_op_pool_private *)
128*99a2dd95SBruce Richardson 				rte_mempool_get_priv(mp);
129*99a2dd95SBruce Richardson 
130*99a2dd95SBruce Richardson 		if (mp->elt_size != elt_size ||
131*99a2dd95SBruce Richardson 				mp->cache_size < cache_size ||
132*99a2dd95SBruce Richardson 				mp->size < nb_elts ||
133*99a2dd95SBruce Richardson 				priv->user_size <  user_size) {
134*99a2dd95SBruce Richardson 			mp = NULL;
135*99a2dd95SBruce Richardson 			COMPRESSDEV_LOG(ERR,
136*99a2dd95SBruce Richardson 		"Mempool %s already exists but with incompatible parameters",
137*99a2dd95SBruce Richardson 					name);
138*99a2dd95SBruce Richardson 			return NULL;
139*99a2dd95SBruce Richardson 		}
140*99a2dd95SBruce Richardson 		return mp;
141*99a2dd95SBruce Richardson 	}
142*99a2dd95SBruce Richardson 
143*99a2dd95SBruce Richardson 	mp = rte_mempool_create(
144*99a2dd95SBruce Richardson 			name,
145*99a2dd95SBruce Richardson 			nb_elts,
146*99a2dd95SBruce Richardson 			elt_size,
147*99a2dd95SBruce Richardson 			cache_size,
148*99a2dd95SBruce Richardson 			sizeof(struct rte_comp_op_pool_private),
149*99a2dd95SBruce Richardson 			NULL,
150*99a2dd95SBruce Richardson 			NULL,
151*99a2dd95SBruce Richardson 			rte_comp_op_init,
152*99a2dd95SBruce Richardson 			NULL,
153*99a2dd95SBruce Richardson 			socket_id,
154*99a2dd95SBruce Richardson 			0);
155*99a2dd95SBruce Richardson 
156*99a2dd95SBruce Richardson 	if (mp == NULL) {
157*99a2dd95SBruce Richardson 		COMPRESSDEV_LOG(ERR, "Failed to create mempool %s", name);
158*99a2dd95SBruce Richardson 		return NULL;
159*99a2dd95SBruce Richardson 	}
160*99a2dd95SBruce Richardson 
161*99a2dd95SBruce Richardson 	priv = (struct rte_comp_op_pool_private *)
162*99a2dd95SBruce Richardson 			rte_mempool_get_priv(mp);
163*99a2dd95SBruce Richardson 
164*99a2dd95SBruce Richardson 	priv->user_size = user_size;
165*99a2dd95SBruce Richardson 
166*99a2dd95SBruce Richardson 	return mp;
167*99a2dd95SBruce Richardson }
168*99a2dd95SBruce Richardson 
169*99a2dd95SBruce Richardson struct rte_comp_op *
rte_comp_op_alloc(struct rte_mempool * mempool)170*99a2dd95SBruce Richardson rte_comp_op_alloc(struct rte_mempool *mempool)
171*99a2dd95SBruce Richardson {
172*99a2dd95SBruce Richardson 	struct rte_comp_op *op = NULL;
173*99a2dd95SBruce Richardson 	int retval;
174*99a2dd95SBruce Richardson 
175*99a2dd95SBruce Richardson 	retval = rte_comp_op_raw_bulk_alloc(mempool, &op, 1);
176*99a2dd95SBruce Richardson 	if (unlikely(retval != 1))
177*99a2dd95SBruce Richardson 		return NULL;
178*99a2dd95SBruce Richardson 
179*99a2dd95SBruce Richardson 	rte_comp_op_reset(op);
180*99a2dd95SBruce Richardson 
181*99a2dd95SBruce Richardson 	return op;
182*99a2dd95SBruce Richardson }
183*99a2dd95SBruce Richardson 
184*99a2dd95SBruce Richardson int
rte_comp_op_bulk_alloc(struct rte_mempool * mempool,struct rte_comp_op ** ops,uint16_t nb_ops)185*99a2dd95SBruce Richardson rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
186*99a2dd95SBruce Richardson 		struct rte_comp_op **ops, uint16_t nb_ops)
187*99a2dd95SBruce Richardson {
188*99a2dd95SBruce Richardson 	int retval;
189*99a2dd95SBruce Richardson 	uint16_t i;
190*99a2dd95SBruce Richardson 
191*99a2dd95SBruce Richardson 	retval = rte_comp_op_raw_bulk_alloc(mempool, ops, nb_ops);
192*99a2dd95SBruce Richardson 	if (unlikely(retval != nb_ops))
193*99a2dd95SBruce Richardson 		return 0;
194*99a2dd95SBruce Richardson 
195*99a2dd95SBruce Richardson 	for (i = 0; i < nb_ops; i++)
196*99a2dd95SBruce Richardson 		rte_comp_op_reset(ops[i]);
197*99a2dd95SBruce Richardson 
198*99a2dd95SBruce Richardson 	return nb_ops;
199*99a2dd95SBruce Richardson }
200*99a2dd95SBruce Richardson 
201*99a2dd95SBruce Richardson /**
202*99a2dd95SBruce Richardson  * free operation structure
203*99a2dd95SBruce Richardson  * If operation has been allocate from a rte_mempool, then the operation will
204*99a2dd95SBruce Richardson  * be returned to the mempool.
205*99a2dd95SBruce Richardson  *
206*99a2dd95SBruce Richardson  * @param op
207*99a2dd95SBruce Richardson  *   Compress operation
208*99a2dd95SBruce Richardson  */
209*99a2dd95SBruce Richardson void
rte_comp_op_free(struct rte_comp_op * op)210*99a2dd95SBruce Richardson rte_comp_op_free(struct rte_comp_op *op)
211*99a2dd95SBruce Richardson {
212*99a2dd95SBruce Richardson 	if (op != NULL && op->mempool != NULL)
213*99a2dd95SBruce Richardson 		rte_mempool_put(op->mempool, op);
214*99a2dd95SBruce Richardson }
215*99a2dd95SBruce Richardson 
216*99a2dd95SBruce Richardson void
rte_comp_op_bulk_free(struct rte_comp_op ** ops,uint16_t nb_ops)217*99a2dd95SBruce Richardson rte_comp_op_bulk_free(struct rte_comp_op **ops, uint16_t nb_ops)
218*99a2dd95SBruce Richardson {
219*99a2dd95SBruce Richardson 	uint16_t i;
220*99a2dd95SBruce Richardson 
221*99a2dd95SBruce Richardson 	for (i = 0; i < nb_ops; i++) {
222*99a2dd95SBruce Richardson 		if (ops[i] != NULL && ops[i]->mempool != NULL)
223*99a2dd95SBruce Richardson 			rte_mempool_put(ops[i]->mempool, ops[i]);
224*99a2dd95SBruce Richardson 		ops[i] = NULL;
225*99a2dd95SBruce Richardson 	}
226*99a2dd95SBruce Richardson }
227