1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017-2018 Intel Corporation
6 #include "rte_compressdev.h"
7 #include "rte_compressdev_internal.h"
10 * Reset the fields of an operation to their default values.
12 * @note The private data associated with the operation is not zeroed.
15 * The operation to be reset
18 rte_comp_op_reset(struct rte_comp_op *op)
20 struct rte_mempool *tmp_mp = op->mempool;
21 rte_iova_t tmp_iova_addr = op->iova_addr;
23 memset(op, 0, sizeof(struct rte_comp_op));
24 op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
25 op->iova_addr = tmp_iova_addr;
30 * Private data structure belonging to an operation pool.
32 struct rte_comp_op_pool_private {
34 /**< Size of private user data with each operation. */
38 * Bulk allocate raw element from mempool and return as comp operations
41 * Compress operation mempool
43 * Array to place allocated operations
45 * Number of operations to allocate
48 * - -ENOENT: Not enough entries in the mempool; no ops are retrieved.
51 rte_comp_op_raw_bulk_alloc(struct rte_mempool *mempool,
52 struct rte_comp_op **ops, uint16_t nb_ops)
54 if (rte_mempool_get_bulk(mempool, (void **)ops, nb_ops) == 0)
60 /** Initialise rte_comp_op mempool element */
62 rte_comp_op_init(struct rte_mempool *mempool,
63 __rte_unused void *opaque_arg,
65 __rte_unused unsigned int i)
67 struct rte_comp_op *op = _op_data;
69 memset(_op_data, 0, mempool->elt_size);
71 op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
72 op->iova_addr = rte_mem_virt2iova(_op_data);
73 op->mempool = mempool;
76 struct rte_mempool * __rte_experimental
77 rte_comp_op_pool_create(const char *name,
78 unsigned int nb_elts, unsigned int cache_size,
79 uint16_t user_size, int socket_id)
81 struct rte_comp_op_pool_private *priv;
83 unsigned int elt_size = sizeof(struct rte_comp_op) + user_size;
85 /* lookup mempool in case already allocated */
86 struct rte_mempool *mp = rte_mempool_lookup(name);
89 priv = (struct rte_comp_op_pool_private *)
90 rte_mempool_get_priv(mp);
92 if (mp->elt_size != elt_size ||
93 mp->cache_size < cache_size ||
95 priv->user_size < user_size) {
98 "Mempool %s already exists but with incompatible parameters",
105 mp = rte_mempool_create(
110 sizeof(struct rte_comp_op_pool_private),
119 COMPRESSDEV_LOG(ERR, "Failed to create mempool %s", name);
123 priv = (struct rte_comp_op_pool_private *)
124 rte_mempool_get_priv(mp);
126 priv->user_size = user_size;
131 struct rte_comp_op * __rte_experimental
132 rte_comp_op_alloc(struct rte_mempool *mempool)
134 struct rte_comp_op *op = NULL;
137 retval = rte_comp_op_raw_bulk_alloc(mempool, &op, 1);
138 if (unlikely(retval < 0))
141 rte_comp_op_reset(op);
146 int __rte_experimental
147 rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
148 struct rte_comp_op **ops, uint16_t nb_ops)
153 ret = rte_comp_op_raw_bulk_alloc(mempool, ops, nb_ops);
154 if (unlikely(ret < nb_ops))
157 for (i = 0; i < nb_ops; i++)
158 rte_comp_op_reset(ops[i]);
164 * free operation structure
165 * If operation has been allocate from a rte_mempool, then the operation will
166 * be returned to the mempool.
171 void __rte_experimental
172 rte_comp_op_free(struct rte_comp_op *op)
174 if (op != NULL && op->mempool != NULL)
175 rte_mempool_put(op->mempool, op);