xref: /dpdk/lib/compressdev/rte_comp.c (revision 3372c4a6571dd5bc04627282f5e6edd5976c0567)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2017-2018 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include "rte_comp.h"
699a2dd95SBruce Richardson #include "rte_compressdev_internal.h"
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson const char *
rte_comp_get_feature_name(uint64_t flag)999a2dd95SBruce Richardson rte_comp_get_feature_name(uint64_t flag)
1099a2dd95SBruce Richardson {
1199a2dd95SBruce Richardson 	switch (flag) {
1299a2dd95SBruce Richardson 	case RTE_COMP_FF_STATEFUL_COMPRESSION:
1399a2dd95SBruce Richardson 		return "STATEFUL_COMPRESSION";
1499a2dd95SBruce Richardson 	case RTE_COMP_FF_STATEFUL_DECOMPRESSION:
1599a2dd95SBruce Richardson 		return "STATEFUL_DECOMPRESSION";
1699a2dd95SBruce Richardson 	case RTE_COMP_FF_OOP_SGL_IN_SGL_OUT:
1799a2dd95SBruce Richardson 		return "OOP_SGL_IN_SGL_OUT";
1899a2dd95SBruce Richardson 	case RTE_COMP_FF_OOP_SGL_IN_LB_OUT:
1999a2dd95SBruce Richardson 		return "OOP_SGL_IN_LB_OUT";
2099a2dd95SBruce Richardson 	case RTE_COMP_FF_OOP_LB_IN_SGL_OUT:
2199a2dd95SBruce Richardson 		return "OOP_LB_IN_SGL_OUT";
2299a2dd95SBruce Richardson 	case RTE_COMP_FF_MULTI_PKT_CHECKSUM:
2399a2dd95SBruce Richardson 		return "MULTI_PKT_CHECKSUM";
2499a2dd95SBruce Richardson 	case RTE_COMP_FF_ADLER32_CHECKSUM:
2599a2dd95SBruce Richardson 		return "ADLER32_CHECKSUM";
2699a2dd95SBruce Richardson 	case RTE_COMP_FF_CRC32_CHECKSUM:
2799a2dd95SBruce Richardson 		return "CRC32_CHECKSUM";
2899a2dd95SBruce Richardson 	case RTE_COMP_FF_CRC32_ADLER32_CHECKSUM:
2999a2dd95SBruce Richardson 		return "CRC32_ADLER32_CHECKSUM";
3099a2dd95SBruce Richardson 	case RTE_COMP_FF_NONCOMPRESSED_BLOCKS:
3199a2dd95SBruce Richardson 		return "NONCOMPRESSED_BLOCKS";
3299a2dd95SBruce Richardson 	case RTE_COMP_FF_SHA1_HASH:
3399a2dd95SBruce Richardson 		return "SHA1_HASH";
3499a2dd95SBruce Richardson 	case RTE_COMP_FF_SHA2_SHA256_HASH:
3599a2dd95SBruce Richardson 		return "SHA2_SHA256_HASH";
3699a2dd95SBruce Richardson 	case RTE_COMP_FF_SHAREABLE_PRIV_XFORM:
3799a2dd95SBruce Richardson 		return "SHAREABLE_PRIV_XFORM";
3899a2dd95SBruce Richardson 	case RTE_COMP_FF_HUFFMAN_FIXED:
3999a2dd95SBruce Richardson 		return "HUFFMAN_FIXED";
4099a2dd95SBruce Richardson 	case RTE_COMP_FF_HUFFMAN_DYNAMIC:
4199a2dd95SBruce Richardson 		return "HUFFMAN_DYNAMIC";
42*3372c4a6SMichael Baum 	case RTE_COMP_FF_XXHASH32_CHECKSUM:
43*3372c4a6SMichael Baum 		return "XXHASH32_CHECKSUM";
44*3372c4a6SMichael Baum 	case RTE_COMP_FF_LZ4_DICT_ID:
45*3372c4a6SMichael Baum 		return "LZ4_DICT_ID";
46*3372c4a6SMichael Baum 	case RTE_COMP_FF_LZ4_CONTENT_WITH_CHECKSUM:
47*3372c4a6SMichael Baum 		return "LZ4_CONTENT_WITH_CHECKSUM";
48*3372c4a6SMichael Baum 	case RTE_COMP_FF_LZ4_CONTENT_SIZE:
49*3372c4a6SMichael Baum 		return "LZ4_CONTENT_SIZE";
50*3372c4a6SMichael Baum 	case RTE_COMP_FF_LZ4_BLOCK_INDEPENDENCE:
51*3372c4a6SMichael Baum 		return "LZ4_BLOCK_INDEPENDENCE";
52*3372c4a6SMichael Baum 	case RTE_COMP_FF_LZ4_BLOCK_WITH_CHECKSUM:
53*3372c4a6SMichael Baum 		return "LZ4_BLOCK_WITH_CHECKSUM";
5499a2dd95SBruce Richardson 	default:
5599a2dd95SBruce Richardson 		return NULL;
5699a2dd95SBruce Richardson 	}
5799a2dd95SBruce Richardson }
5899a2dd95SBruce Richardson 
5999a2dd95SBruce Richardson /**
6099a2dd95SBruce Richardson  * Reset the fields of an operation to their default values.
6199a2dd95SBruce Richardson  *
6299a2dd95SBruce Richardson  * @note The private data associated with the operation is not zeroed.
6399a2dd95SBruce Richardson  *
6499a2dd95SBruce Richardson  * @param op
6599a2dd95SBruce Richardson  *   The operation to be reset
6699a2dd95SBruce Richardson  */
6799a2dd95SBruce Richardson static inline void
rte_comp_op_reset(struct rte_comp_op * op)6899a2dd95SBruce Richardson rte_comp_op_reset(struct rte_comp_op *op)
6999a2dd95SBruce Richardson {
7099a2dd95SBruce Richardson 	struct rte_mempool *tmp_mp = op->mempool;
7199a2dd95SBruce Richardson 	rte_iova_t tmp_iova_addr = op->iova_addr;
7299a2dd95SBruce Richardson 
7399a2dd95SBruce Richardson 	memset(op, 0, sizeof(struct rte_comp_op));
7499a2dd95SBruce Richardson 	op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
7599a2dd95SBruce Richardson 	op->iova_addr = tmp_iova_addr;
7699a2dd95SBruce Richardson 	op->mempool = tmp_mp;
7799a2dd95SBruce Richardson }
7899a2dd95SBruce Richardson 
7999a2dd95SBruce Richardson /**
8099a2dd95SBruce Richardson  * Private data structure belonging to an operation pool.
8199a2dd95SBruce Richardson  */
8299a2dd95SBruce Richardson struct rte_comp_op_pool_private {
8399a2dd95SBruce Richardson 	uint16_t user_size;
8499a2dd95SBruce Richardson 	/**< Size of private user data with each operation. */
8599a2dd95SBruce Richardson };
8699a2dd95SBruce Richardson 
8799a2dd95SBruce Richardson /**
8899a2dd95SBruce Richardson  * Bulk allocate raw element from mempool and return as comp operations
8999a2dd95SBruce Richardson  *
9099a2dd95SBruce Richardson  * @param mempool
9199a2dd95SBruce Richardson  *   Compress operation mempool
9299a2dd95SBruce Richardson  * @param ops
9399a2dd95SBruce Richardson  *   Array to place allocated operations
9499a2dd95SBruce Richardson  * @param nb_ops
9599a2dd95SBruce Richardson  *   Number of operations to allocate
9699a2dd95SBruce Richardson  * @return
9799a2dd95SBruce Richardson  *   - nb_ops: Success, the nb_ops requested was allocated
9899a2dd95SBruce Richardson  *   - 0: Not enough entries in the mempool; no ops are retrieved.
9999a2dd95SBruce Richardson  */
10099a2dd95SBruce Richardson static inline int
rte_comp_op_raw_bulk_alloc(struct rte_mempool * mempool,struct rte_comp_op ** ops,uint16_t nb_ops)10199a2dd95SBruce Richardson rte_comp_op_raw_bulk_alloc(struct rte_mempool *mempool,
10299a2dd95SBruce Richardson 		struct rte_comp_op **ops, uint16_t nb_ops)
10399a2dd95SBruce Richardson {
10499a2dd95SBruce Richardson 	if (rte_mempool_get_bulk(mempool, (void **)ops, nb_ops) == 0)
10599a2dd95SBruce Richardson 		return nb_ops;
10699a2dd95SBruce Richardson 
10799a2dd95SBruce Richardson 	return 0;
10899a2dd95SBruce Richardson }
10999a2dd95SBruce Richardson 
11099a2dd95SBruce Richardson /** Initialise rte_comp_op mempool element */
11199a2dd95SBruce Richardson static void
rte_comp_op_init(struct rte_mempool * mempool,__rte_unused void * opaque_arg,void * _op_data,__rte_unused unsigned int i)11299a2dd95SBruce Richardson rte_comp_op_init(struct rte_mempool *mempool,
11399a2dd95SBruce Richardson 		__rte_unused void *opaque_arg,
11499a2dd95SBruce Richardson 		void *_op_data,
11599a2dd95SBruce Richardson 		__rte_unused unsigned int i)
11699a2dd95SBruce Richardson {
11799a2dd95SBruce Richardson 	struct rte_comp_op *op = _op_data;
11899a2dd95SBruce Richardson 
11999a2dd95SBruce Richardson 	memset(_op_data, 0, mempool->elt_size);
12099a2dd95SBruce Richardson 
12199a2dd95SBruce Richardson 	op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
12299a2dd95SBruce Richardson 	op->iova_addr = rte_mem_virt2iova(_op_data);
12399a2dd95SBruce Richardson 	op->mempool = mempool;
12499a2dd95SBruce Richardson }
12599a2dd95SBruce Richardson 
12699a2dd95SBruce 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)12799a2dd95SBruce Richardson rte_comp_op_pool_create(const char *name,
12899a2dd95SBruce Richardson 		unsigned int nb_elts, unsigned int cache_size,
12999a2dd95SBruce Richardson 		uint16_t user_size, int socket_id)
13099a2dd95SBruce Richardson {
13199a2dd95SBruce Richardson 	struct rte_comp_op_pool_private *priv;
13299a2dd95SBruce Richardson 
13399a2dd95SBruce Richardson 	unsigned int elt_size = sizeof(struct rte_comp_op) + user_size;
13499a2dd95SBruce Richardson 
13599a2dd95SBruce Richardson 	/* lookup mempool in case already allocated */
13699a2dd95SBruce Richardson 	struct rte_mempool *mp = rte_mempool_lookup(name);
13799a2dd95SBruce Richardson 
13899a2dd95SBruce Richardson 	if (mp != NULL) {
13999a2dd95SBruce Richardson 		priv = (struct rte_comp_op_pool_private *)
14099a2dd95SBruce Richardson 				rte_mempool_get_priv(mp);
14199a2dd95SBruce Richardson 
14299a2dd95SBruce Richardson 		if (mp->elt_size != elt_size ||
14399a2dd95SBruce Richardson 				mp->cache_size < cache_size ||
14499a2dd95SBruce Richardson 				mp->size < nb_elts ||
14599a2dd95SBruce Richardson 				priv->user_size <  user_size) {
14699a2dd95SBruce Richardson 			mp = NULL;
14799a2dd95SBruce Richardson 			COMPRESSDEV_LOG(ERR,
14899a2dd95SBruce Richardson 		"Mempool %s already exists but with incompatible parameters",
14999a2dd95SBruce Richardson 					name);
15099a2dd95SBruce Richardson 			return NULL;
15199a2dd95SBruce Richardson 		}
15299a2dd95SBruce Richardson 		return mp;
15399a2dd95SBruce Richardson 	}
15499a2dd95SBruce Richardson 
15599a2dd95SBruce Richardson 	mp = rte_mempool_create(
15699a2dd95SBruce Richardson 			name,
15799a2dd95SBruce Richardson 			nb_elts,
15899a2dd95SBruce Richardson 			elt_size,
15999a2dd95SBruce Richardson 			cache_size,
16099a2dd95SBruce Richardson 			sizeof(struct rte_comp_op_pool_private),
16199a2dd95SBruce Richardson 			NULL,
16299a2dd95SBruce Richardson 			NULL,
16399a2dd95SBruce Richardson 			rte_comp_op_init,
16499a2dd95SBruce Richardson 			NULL,
16599a2dd95SBruce Richardson 			socket_id,
16699a2dd95SBruce Richardson 			0);
16799a2dd95SBruce Richardson 
16899a2dd95SBruce Richardson 	if (mp == NULL) {
16999a2dd95SBruce Richardson 		COMPRESSDEV_LOG(ERR, "Failed to create mempool %s", name);
17099a2dd95SBruce Richardson 		return NULL;
17199a2dd95SBruce Richardson 	}
17299a2dd95SBruce Richardson 
17399a2dd95SBruce Richardson 	priv = (struct rte_comp_op_pool_private *)
17499a2dd95SBruce Richardson 			rte_mempool_get_priv(mp);
17599a2dd95SBruce Richardson 
17699a2dd95SBruce Richardson 	priv->user_size = user_size;
17799a2dd95SBruce Richardson 
17899a2dd95SBruce Richardson 	return mp;
17999a2dd95SBruce Richardson }
18099a2dd95SBruce Richardson 
18199a2dd95SBruce Richardson struct rte_comp_op *
rte_comp_op_alloc(struct rte_mempool * mempool)18299a2dd95SBruce Richardson rte_comp_op_alloc(struct rte_mempool *mempool)
18399a2dd95SBruce Richardson {
18499a2dd95SBruce Richardson 	struct rte_comp_op *op = NULL;
18599a2dd95SBruce Richardson 	int retval;
18699a2dd95SBruce Richardson 
18799a2dd95SBruce Richardson 	retval = rte_comp_op_raw_bulk_alloc(mempool, &op, 1);
18899a2dd95SBruce Richardson 	if (unlikely(retval != 1))
18999a2dd95SBruce Richardson 		return NULL;
19099a2dd95SBruce Richardson 
19199a2dd95SBruce Richardson 	rte_comp_op_reset(op);
19299a2dd95SBruce Richardson 
19399a2dd95SBruce Richardson 	return op;
19499a2dd95SBruce Richardson }
19599a2dd95SBruce Richardson 
19699a2dd95SBruce Richardson int
rte_comp_op_bulk_alloc(struct rte_mempool * mempool,struct rte_comp_op ** ops,uint16_t nb_ops)19799a2dd95SBruce Richardson rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
19899a2dd95SBruce Richardson 		struct rte_comp_op **ops, uint16_t nb_ops)
19999a2dd95SBruce Richardson {
20099a2dd95SBruce Richardson 	int retval;
20199a2dd95SBruce Richardson 	uint16_t i;
20299a2dd95SBruce Richardson 
20399a2dd95SBruce Richardson 	retval = rte_comp_op_raw_bulk_alloc(mempool, ops, nb_ops);
20499a2dd95SBruce Richardson 	if (unlikely(retval != nb_ops))
20599a2dd95SBruce Richardson 		return 0;
20699a2dd95SBruce Richardson 
20799a2dd95SBruce Richardson 	for (i = 0; i < nb_ops; i++)
20899a2dd95SBruce Richardson 		rte_comp_op_reset(ops[i]);
20999a2dd95SBruce Richardson 
21099a2dd95SBruce Richardson 	return nb_ops;
21199a2dd95SBruce Richardson }
21299a2dd95SBruce Richardson 
21399a2dd95SBruce Richardson /**
21499a2dd95SBruce Richardson  * free operation structure
21599a2dd95SBruce Richardson  * If operation has been allocate from a rte_mempool, then the operation will
21699a2dd95SBruce Richardson  * be returned to the mempool.
21799a2dd95SBruce Richardson  *
21899a2dd95SBruce Richardson  * @param op
21999a2dd95SBruce Richardson  *   Compress operation
22099a2dd95SBruce Richardson  */
22199a2dd95SBruce Richardson void
rte_comp_op_free(struct rte_comp_op * op)22299a2dd95SBruce Richardson rte_comp_op_free(struct rte_comp_op *op)
22399a2dd95SBruce Richardson {
22499a2dd95SBruce Richardson 	if (op != NULL && op->mempool != NULL)
22599a2dd95SBruce Richardson 		rte_mempool_put(op->mempool, op);
22699a2dd95SBruce Richardson }
22799a2dd95SBruce Richardson 
22899a2dd95SBruce Richardson void
rte_comp_op_bulk_free(struct rte_comp_op ** ops,uint16_t nb_ops)22999a2dd95SBruce Richardson rte_comp_op_bulk_free(struct rte_comp_op **ops, uint16_t nb_ops)
23099a2dd95SBruce Richardson {
23199a2dd95SBruce Richardson 	uint16_t i;
23299a2dd95SBruce Richardson 
23399a2dd95SBruce Richardson 	for (i = 0; i < nb_ops; i++) {
23499a2dd95SBruce Richardson 		if (ops[i] != NULL && ops[i]->mempool != NULL)
23599a2dd95SBruce Richardson 			rte_mempool_put(ops[i]->mempool, ops[i]);
23699a2dd95SBruce Richardson 		ops[i] = NULL;
23799a2dd95SBruce Richardson 	}
23899a2dd95SBruce Richardson }
239