compressdev: add operation management
Added functions to allocate and free compression operations. Signed-off-by: Fiona Trahe <fiona.trahe@intel.com> Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com> Signed-off-by: Shally Verma <shally.verma@caviumnetworks.com> Signed-off-by: Ashish Gupta <ashish.gupta@caviumnetworks.com>
This commit is contained in:
parent
63f4bfd532
commit
96086db5a3
@ -16,7 +16,7 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
|
||||
LDLIBS += -lrte_eal -lrte_mempool -lrte_kvargs
|
||||
|
||||
# library source files
|
||||
SRCS-y += rte_compressdev.c rte_compressdev_pmd.c
|
||||
SRCS-y += rte_compressdev.c rte_compressdev_pmd.c rte_comp.c
|
||||
|
||||
# export include files
|
||||
SYMLINK-y-include += rte_comp.h
|
||||
|
@ -3,7 +3,8 @@
|
||||
|
||||
allow_experimental_apis = true
|
||||
sources = files('rte_compressdev.c',
|
||||
'rte_compressdev_pmd.c')
|
||||
'rte_compressdev_pmd.c',
|
||||
'rte_comp.c')
|
||||
headers = files('rte_compressdev.h',
|
||||
'rte_compressdev_pmd.h',
|
||||
'rte_compressdev_internal.h',
|
||||
|
176
lib/librte_compressdev/rte_comp.c
Normal file
176
lib/librte_compressdev/rte_comp.c
Normal file
@ -0,0 +1,176 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2017-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "rte_comp.h"
|
||||
#include "rte_compressdev.h"
|
||||
#include "rte_compressdev_internal.h"
|
||||
|
||||
/**
|
||||
* Reset the fields of an operation to their default values.
|
||||
*
|
||||
* @note The private data associated with the operation is not zeroed.
|
||||
*
|
||||
* @param op
|
||||
* The operation to be reset
|
||||
*/
|
||||
static inline void
|
||||
rte_comp_op_reset(struct rte_comp_op *op)
|
||||
{
|
||||
struct rte_mempool *tmp_mp = op->mempool;
|
||||
rte_iova_t tmp_iova_addr = op->iova_addr;
|
||||
|
||||
memset(op, 0, sizeof(struct rte_comp_op));
|
||||
op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
|
||||
op->iova_addr = tmp_iova_addr;
|
||||
op->mempool = tmp_mp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private data structure belonging to an operation pool.
|
||||
*/
|
||||
struct rte_comp_op_pool_private {
|
||||
uint16_t user_size;
|
||||
/**< Size of private user data with each operation. */
|
||||
};
|
||||
|
||||
/**
|
||||
* Bulk allocate raw element from mempool and return as comp operations
|
||||
*
|
||||
* @param mempool
|
||||
* Compress operation mempool
|
||||
* @param ops
|
||||
* Array to place allocated operations
|
||||
* @param nb_ops
|
||||
* Number of operations to allocate
|
||||
* @return
|
||||
* - 0: Success
|
||||
* - -ENOENT: Not enough entries in the mempool; no ops are retrieved.
|
||||
*/
|
||||
static inline int
|
||||
rte_comp_op_raw_bulk_alloc(struct rte_mempool *mempool,
|
||||
struct rte_comp_op **ops, uint16_t nb_ops)
|
||||
{
|
||||
if (rte_mempool_get_bulk(mempool, (void **)ops, nb_ops) == 0)
|
||||
return nb_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Initialise rte_comp_op mempool element */
|
||||
static void
|
||||
rte_comp_op_init(struct rte_mempool *mempool,
|
||||
__rte_unused void *opaque_arg,
|
||||
void *_op_data,
|
||||
__rte_unused unsigned int i)
|
||||
{
|
||||
struct rte_comp_op *op = _op_data;
|
||||
|
||||
memset(_op_data, 0, mempool->elt_size);
|
||||
|
||||
op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
|
||||
op->iova_addr = rte_mem_virt2iova(_op_data);
|
||||
op->mempool = mempool;
|
||||
}
|
||||
|
||||
struct rte_mempool * __rte_experimental
|
||||
rte_comp_op_pool_create(const char *name,
|
||||
unsigned int nb_elts, unsigned int cache_size,
|
||||
uint16_t user_size, int socket_id)
|
||||
{
|
||||
struct rte_comp_op_pool_private *priv;
|
||||
|
||||
unsigned int elt_size = sizeof(struct rte_comp_op) + user_size;
|
||||
|
||||
/* lookup mempool in case already allocated */
|
||||
struct rte_mempool *mp = rte_mempool_lookup(name);
|
||||
|
||||
if (mp != NULL) {
|
||||
priv = (struct rte_comp_op_pool_private *)
|
||||
rte_mempool_get_priv(mp);
|
||||
|
||||
if (mp->elt_size != elt_size ||
|
||||
mp->cache_size < cache_size ||
|
||||
mp->size < nb_elts ||
|
||||
priv->user_size < user_size) {
|
||||
mp = NULL;
|
||||
COMPRESSDEV_LOG(ERR,
|
||||
"Mempool %s already exists but with incompatible parameters",
|
||||
name);
|
||||
return NULL;
|
||||
}
|
||||
return mp;
|
||||
}
|
||||
|
||||
mp = rte_mempool_create(
|
||||
name,
|
||||
nb_elts,
|
||||
elt_size,
|
||||
cache_size,
|
||||
sizeof(struct rte_comp_op_pool_private),
|
||||
NULL,
|
||||
NULL,
|
||||
rte_comp_op_init,
|
||||
NULL,
|
||||
socket_id,
|
||||
0);
|
||||
|
||||
if (mp == NULL) {
|
||||
COMPRESSDEV_LOG(ERR, "Failed to create mempool %s", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
priv = (struct rte_comp_op_pool_private *)
|
||||
rte_mempool_get_priv(mp);
|
||||
|
||||
priv->user_size = user_size;
|
||||
|
||||
return mp;
|
||||
}
|
||||
|
||||
struct rte_comp_op * __rte_experimental
|
||||
rte_comp_op_alloc(struct rte_mempool *mempool)
|
||||
{
|
||||
struct rte_comp_op *op = NULL;
|
||||
int retval;
|
||||
|
||||
retval = rte_comp_op_raw_bulk_alloc(mempool, &op, 1);
|
||||
if (unlikely(retval < 0))
|
||||
return NULL;
|
||||
|
||||
rte_comp_op_reset(op);
|
||||
|
||||
return op;
|
||||
}
|
||||
|
||||
int __rte_experimental
|
||||
rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
|
||||
struct rte_comp_op **ops, uint16_t nb_ops)
|
||||
{
|
||||
int ret;
|
||||
uint16_t i;
|
||||
|
||||
ret = rte_comp_op_raw_bulk_alloc(mempool, ops, nb_ops);
|
||||
if (unlikely(ret < nb_ops))
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < nb_ops; i++)
|
||||
rte_comp_op_reset(ops[i]);
|
||||
|
||||
return nb_ops;
|
||||
}
|
||||
|
||||
/**
|
||||
* free operation structure
|
||||
* If operation has been allocate from a rte_mempool, then the operation will
|
||||
* be returned to the mempool.
|
||||
*
|
||||
* @param op
|
||||
* Compress operation
|
||||
*/
|
||||
void __rte_experimental
|
||||
rte_comp_op_free(struct rte_comp_op *op)
|
||||
{
|
||||
if (op != NULL && op->mempool != NULL)
|
||||
rte_mempool_put(op->mempool, op);
|
||||
}
|
@ -309,6 +309,70 @@ struct rte_comp_op {
|
||||
*/
|
||||
} __rte_cache_aligned;
|
||||
|
||||
/**
|
||||
* Creates an operation pool
|
||||
*
|
||||
* @param name
|
||||
* Compress pool name
|
||||
* @param nb_elts
|
||||
* Number of elements in pool
|
||||
* @param cache_size
|
||||
* Number of elements to cache on lcore, see
|
||||
* *rte_mempool_create* for further details about cache size
|
||||
* @param user_size
|
||||
* Size of private data to allocate for user with each operation
|
||||
* @param socket_id
|
||||
* Socket to identifier allocate memory on
|
||||
* @return
|
||||
* - On success pointer to mempool
|
||||
* - On failure NULL
|
||||
*/
|
||||
struct rte_mempool * __rte_experimental
|
||||
rte_comp_op_pool_create(const char *name,
|
||||
unsigned int nb_elts, unsigned int cache_size,
|
||||
uint16_t user_size, int socket_id);
|
||||
|
||||
/**
|
||||
* Allocate an operation from a mempool with default parameters set
|
||||
*
|
||||
* @param mempool
|
||||
* Compress operation mempool
|
||||
*
|
||||
* @return
|
||||
* - On success returns a valid rte_comp_op structure
|
||||
* - On failure returns NULL
|
||||
*/
|
||||
struct rte_comp_op * __rte_experimental
|
||||
rte_comp_op_alloc(struct rte_mempool *mempool);
|
||||
|
||||
/**
|
||||
* Bulk allocate operations from a mempool with default parameters set
|
||||
*
|
||||
* @param mempool
|
||||
* Compress operation mempool
|
||||
* @param ops
|
||||
* Array to place allocated operations
|
||||
* @param nb_ops
|
||||
* Number of operations to allocate
|
||||
* @return
|
||||
* - 0: Success
|
||||
* - -ENOENT: Not enough entries in the mempool; no ops are retrieved.
|
||||
*/
|
||||
int __rte_experimental
|
||||
rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
|
||||
struct rte_comp_op **ops, uint16_t nb_ops);
|
||||
|
||||
/**
|
||||
* Free operation structure
|
||||
* If operation has been allocate from a rte_mempool, then the operation will
|
||||
* be returned to the mempool.
|
||||
*
|
||||
* @param op
|
||||
* Compress operation
|
||||
*/
|
||||
void __rte_experimental
|
||||
rte_comp_op_free(struct rte_comp_op *op);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -63,7 +63,6 @@ typedef uint16_t (*compressdev_dequeue_pkt_burst_t)(void *qp,
|
||||
typedef uint16_t (*compressdev_enqueue_pkt_burst_t)(void *qp,
|
||||
struct rte_comp_op **ops, uint16_t nb_ops);
|
||||
|
||||
|
||||
/** The data structure associated with each comp device. */
|
||||
struct rte_compressdev {
|
||||
compressdev_dequeue_pkt_burst_t dequeue_burst;
|
||||
|
@ -23,6 +23,10 @@ EXPERIMENTAL {
|
||||
rte_compressdev_socket_id;
|
||||
rte_compressdev_start;
|
||||
rte_compressdev_stop;
|
||||
rte_comp_op_alloc;
|
||||
rte_comp_op_bulk_alloc;
|
||||
rte_comp_op_free;
|
||||
rte_comp_op_pool_create;
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user