[dpdk-dev] [PATCH 2/3] ethdev: add API to get preferred mempool ops name

Pavan Nikhilesh pbhagavatula at caviumnetworks.com
Wed Dec 13 20:55:37 CET 2017


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 at 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(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 318af2869..514037ec2 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -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;
+}
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 341c2d624..3f4b234a0 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -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
diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map
index e9681ac8e..674a59c92 100644
--- a/lib/librte_ether/rte_ethdev_version.map
+++ b/lib/librte_ether/rte_ethdev_version.map
@@ -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:
 
diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h
index 721227f6d..27033102d 100644
--- a/lib/librte_mempool/rte_mempool.h
+++ b/lib/librte_mempool/rte_mempool.h
@@ -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.
  *
-- 
2.14.1



More information about the dev mailing list