mempool: get capabilities
Allow the mempool driver to advertise his pool capabilities. For that pupose, an api(rte_mempool_ops_get_capabilities) and ->get_capabilities() handler has been introduced. - Upon ->get_capabilities() call, mempool driver will advertise his capabilities to mempool flags param. Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com> Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com> Acked-by: Olivier Matz <olivier.matz@6wind.com>
This commit is contained in:
parent
f9caf23ba2
commit
3bbc406a87
@ -522,12 +522,25 @@ rte_mempool_populate_default(struct rte_mempool *mp)
|
||||
size_t size, total_elt_sz, align, pg_sz, pg_shift;
|
||||
phys_addr_t paddr;
|
||||
unsigned mz_id, n;
|
||||
unsigned int mp_flags;
|
||||
int ret;
|
||||
|
||||
/* mempool must not be populated */
|
||||
if (mp->nb_mem_chunks != 0)
|
||||
return -EEXIST;
|
||||
|
||||
/* Get mempool capabilities */
|
||||
mp_flags = 0;
|
||||
ret = rte_mempool_ops_get_capabilities(mp, &mp_flags);
|
||||
if (ret == -ENOTSUP)
|
||||
RTE_LOG(DEBUG, MEMPOOL, "get_capability not supported for %s\n",
|
||||
mp->name);
|
||||
else if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* update mempool capabilities */
|
||||
mp->flags |= mp_flags;
|
||||
|
||||
if (rte_xen_dom0_supported()) {
|
||||
pg_sz = RTE_PGSIZE_2M;
|
||||
pg_shift = rte_bsf32(pg_sz);
|
||||
|
@ -389,6 +389,12 @@ typedef int (*rte_mempool_dequeue_t)(struct rte_mempool *mp,
|
||||
*/
|
||||
typedef unsigned (*rte_mempool_get_count)(const struct rte_mempool *mp);
|
||||
|
||||
/**
|
||||
* Get the mempool capabilities.
|
||||
*/
|
||||
typedef int (*rte_mempool_get_capabilities_t)(const struct rte_mempool *mp,
|
||||
unsigned int *flags);
|
||||
|
||||
/** Structure defining mempool operations structure */
|
||||
struct rte_mempool_ops {
|
||||
char name[RTE_MEMPOOL_OPS_NAMESIZE]; /**< Name of mempool ops struct. */
|
||||
@ -397,6 +403,10 @@ struct rte_mempool_ops {
|
||||
rte_mempool_enqueue_t enqueue; /**< Enqueue an object. */
|
||||
rte_mempool_dequeue_t dequeue; /**< Dequeue an object. */
|
||||
rte_mempool_get_count get_count; /**< Get qty of available objs. */
|
||||
/**
|
||||
* Get the mempool capabilities
|
||||
*/
|
||||
rte_mempool_get_capabilities_t get_capabilities;
|
||||
} __rte_cache_aligned;
|
||||
|
||||
#define RTE_MEMPOOL_MAX_OPS_IDX 16 /**< Max registered ops structs */
|
||||
@ -508,6 +518,23 @@ rte_mempool_ops_enqueue_bulk(struct rte_mempool *mp, void * const *obj_table,
|
||||
unsigned
|
||||
rte_mempool_ops_get_count(const struct rte_mempool *mp);
|
||||
|
||||
/**
|
||||
* @internal wrapper for mempool_ops get_capabilities callback.
|
||||
*
|
||||
* @param mp [in]
|
||||
* Pointer to the memory pool.
|
||||
* @param flags [out]
|
||||
* Pointer to the mempool flags.
|
||||
* @return
|
||||
* - 0: Success; The mempool driver has advertised his pool capabilities in
|
||||
* flags param.
|
||||
* - -ENOTSUP - doesn't support get_capabilities ops (valid case).
|
||||
* - Otherwise, pool create fails.
|
||||
*/
|
||||
int
|
||||
rte_mempool_ops_get_capabilities(const struct rte_mempool *mp,
|
||||
unsigned int *flags);
|
||||
|
||||
/**
|
||||
* @internal wrapper for mempool_ops free callback.
|
||||
*
|
||||
|
@ -37,6 +37,7 @@
|
||||
|
||||
#include <rte_mempool.h>
|
||||
#include <rte_errno.h>
|
||||
#include <rte_dev.h>
|
||||
|
||||
/* indirect jump table to support external memory pools. */
|
||||
struct rte_mempool_ops_table rte_mempool_ops_table = {
|
||||
@ -85,6 +86,7 @@ rte_mempool_register_ops(const struct rte_mempool_ops *h)
|
||||
ops->enqueue = h->enqueue;
|
||||
ops->dequeue = h->dequeue;
|
||||
ops->get_count = h->get_count;
|
||||
ops->get_capabilities = h->get_capabilities;
|
||||
|
||||
rte_spinlock_unlock(&rte_mempool_ops_table.sl);
|
||||
|
||||
@ -123,6 +125,19 @@ rte_mempool_ops_get_count(const struct rte_mempool *mp)
|
||||
return ops->get_count(mp);
|
||||
}
|
||||
|
||||
/* wrapper to get external mempool capabilities. */
|
||||
int
|
||||
rte_mempool_ops_get_capabilities(const struct rte_mempool *mp,
|
||||
unsigned int *flags)
|
||||
{
|
||||
struct rte_mempool_ops *ops;
|
||||
|
||||
ops = rte_mempool_get_ops(mp->ops_index);
|
||||
|
||||
RTE_FUNC_PTR_OR_ERR_RET(ops->get_capabilities, -ENOTSUP);
|
||||
return ops->get_capabilities(mp, flags);
|
||||
}
|
||||
|
||||
/* sets mempool ops previously registered by rte_mempool_register_ops. */
|
||||
int
|
||||
rte_mempool_set_ops_byname(struct rte_mempool *mp, const char *name,
|
||||
|
@ -41,3 +41,10 @@ DPDK_16.07 {
|
||||
rte_mempool_set_ops_byname;
|
||||
|
||||
} DPDK_2.0;
|
||||
|
||||
DPDK_17.11 {
|
||||
global:
|
||||
|
||||
rte_mempool_ops_get_capabilities;
|
||||
|
||||
} DPDK_16.07;
|
||||
|
Loading…
x
Reference in New Issue
Block a user