Now that dpdk supports more than one mempool drivers and each mempool driver works best for specific PMD, example: - sw ring based mempool for Intel PMD drivers - dpaa2 HW mempool manager for dpaa2 PMD driver. - fpa HW mempool manager for Octeontx PMD driver.
Application like to know `preferred mempool vs PMD driver` information in advance before port setup. Introducing rte_eth_dev_get_preferred_pool_ops() API, which allows PMD driver to advertise their pool capability to application. Application side programing sequence would be: char pref_mempool[RTE_MEMPOOL_OPS_NAMESIZE]; rte_eth_dev_get_preferred_pool_ops(ethdev_port_id, pref_mempoolx /*out*/); rte_mempool_create_empty(); rte_mempool_set_ops_byname( , pref_memppol, ); rte_mempool_populate_default(); Signed-off-by: Santosh Shukla <santosh.shu...@caviumnetworks.com> --- v2 --> v3: - Updated version.map entry to DPDK_v17.11. v1 --> v2: - Renamed _get_preferred_pool to _get_preferred_pool_ops(). Per v1 review feedback, Olivier suggested to rename api to rte_eth_dev_pool_ops_supported(), considering that 2nd param for that api will return pool handle 'priority' for that port. However, per v1 [1], we're opting for approach 1) where ethdev API returns _preferred_ pool handle to application and Its upto application to decide on policy - whether application wants to create pool with received preferred pool handle or not. For more discussion details on this topic refer [1]. [1] http://dpdk.org/dev/patchwork/patch/24944/ - Removed const qualifier from _get_preferred_pool_ops() param. - Updated API description and changes return val from -EINVAL to _ENOTSUP (suggested by Olivier) lib/librte_ether/rte_ethdev.c | 18 ++++++++++++++++++ lib/librte_ether/rte_ethdev.h | 21 +++++++++++++++++++++ lib/librte_ether/rte_ether_version.map | 7 +++++++ 3 files changed, 46 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 0597641ee..6a0fe51fc 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -3409,3 +3409,21 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id, return 0; } + +int +rte_eth_dev_get_preferred_pool_ops(uint8_t port_id, char *pool) +{ + struct rte_eth_dev *dev; + const char *tmp; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + + dev = &rte_eth_devices[port_id]; + + if (*dev->dev_ops->get_preferred_pool_ops == NULL) { + tmp = rte_eal_mbuf_default_mempool_ops(); + snprintf(pool, RTE_MBUF_POOL_OPS_NAMESIZE, "%s", tmp); + return 0; + } + return (*dev->dev_ops->get_preferred_pool_ops)(dev, pool); +} diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 0adf3274a..afbce0b23 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1425,6 +1425,10 @@ typedef int (*eth_get_dcb_info)(struct rte_eth_dev *dev, struct rte_eth_dcb_info *dcb_info); /**< @internal Get dcb information on an Ethernet device */ +typedef int (*eth_get_preferred_pool_ops_t)(struct rte_eth_dev *dev, + char *pool); +/**< @internal Get preferred pool handle for port */ + /** * @internal A structure containing the functions exported by an Ethernet driver. */ @@ -1544,6 +1548,8 @@ struct eth_dev_ops { eth_tm_ops_get_t tm_ops_get; /**< Get Traffic Management (TM) operations. */ + eth_get_preferred_pool_ops_t get_preferred_pool_ops; + /**< Get preferred pool handle for port */ }; /** @@ -4436,6 +4442,21 @@ int rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id, uint16_t *nb_rx_desc, uint16_t *nb_tx_desc); +/** + * Get preferred pool handle for port + * + * @param port_id + * port identifier of the device + * @param [out] pool + * Preferred pool handle for this port. + * Maximum length of preferred pool handle is RTE_MBUF_POOL_OPS_NAMESIZE. + * @return + * - (0) if successful. + * - (-ENOTSUP, -ENODEV or -EINVAL) on failure. + */ +int +rte_eth_dev_get_preferred_pool_ops(uint8_t port_id, char *pool); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index 42837285e..5d97d6299 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -187,3 +187,10 @@ DPDK_17.08 { rte_tm_wred_profile_delete; } DPDK_17.05; + +DPDK_17.11 { + global: + + rte_eth_dev_get_preferred_pool_ops; + +} DPDK_17.08; -- 2.11.0