[dpdk-dev,2/3] ethdev: add API to get preferred mempool ops name
Checks
Commit Message
Add API to scan through the ethernet devices and return the best mbuf
mempool ops name.
If no such mempool is found it returns the default mempool configured.
Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
lib/librte_ether/rte_ethdev.c | 41 +++++++++++++++++++++++++++++++++
lib/librte_ether/rte_ethdev.h | 12 ++++++++++
lib/librte_ether/rte_ethdev_version.map | 7 ++++++
lib/librte_mempool/rte_mempool.h | 12 ++++++++++
4 files changed, 72 insertions(+)
@@ -3591,3 +3591,44 @@ rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool)
return (*dev->dev_ops->pool_ops_supported)(dev, pool);
}
+
+const char *
+rte_eth_dev_get_preferred_pool_name(uint8_t set_default)
+{
+ int i, j;
+ int ret;
+ int best_weight = 0;
+ int default_pool_weight = 0;
+ const char *default_pool_name = rte_eal_mbuf_default_mempool_ops();
+ const char *preferred_pool_name = NULL;
+
+ for (i = 0; i < rte_mempool_ops_count(); i++) {
+ int weight = 0;
+ const char *name = rte_mempool_get_ops(i)->name;
+
+ for (j = 0; j < rte_eth_dev_count(); j++) {
+ ret = rte_eth_dev_pool_ops_supported(j, name);
+ if (ret < 0) {
+ weight = -1;
+ break;
+ }
+ weight += ret ? 1 : 2;
+ }
+
+ if (weight > best_weight) {
+ best_weight = weight;
+ preferred_pool_name = name;
+ }
+
+ if (!strcmp(name, default_pool_name))
+ default_pool_weight = weight;
+ }
+
+ if (!best_weight || best_weight == default_pool_weight)
+ preferred_pool_name = default_pool_name;
+
+ if (set_default)
+ rte_eal_set_mbuf_default_mempool_ops(preferred_pool_name);
+
+ return preferred_pool_name;
+}
@@ -4606,6 +4606,18 @@ int rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
int
rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool);
+/**
+ * Scan through the ethernet devices and select the best mempool ops supported
+ * across them.
+ *
+ * @param set_default
+ * Set the selected mempool ops as default.
+ * @return
+ * The name of the selected mempool ops.
+ */
+const char *
+rte_eth_dev_get_preferred_pool_name(uint8_t set_default);
+
#ifdef __cplusplus
}
#endif
@@ -198,6 +198,13 @@ DPDK_17.11 {
} DPDK_17.08;
+DPDK_18.02 {
+ global:
+
+ rte_eth_dev_get_preferred_pool_name;
+
+} DPDK_17.11;
+
EXPERIMENTAL {
global:
@@ -485,6 +485,18 @@ rte_mempool_get_ops(int ops_index)
return &rte_mempool_ops_table.ops[ops_index];
}
+/**
+ * @internal Get the total number of mempool ops.
+ *
+ * @return
+ * The number of mempool ops in the ops table.
+ */
+static inline int
+rte_mempool_ops_count(void)
+{
+ return rte_mempool_ops_table.num_ops;
+}
+
/**
* @internal Wrapper for mempool_ops alloc callback.
*