[2/2] net/ring: prevent nodeaction arg create multiple ethdev
diff mbox series

Message ID 20201002224748.1532530-2-ferruh.yigit@intel.com
State New
Delegated to: Ferruh Yigit
Headers show
Series
  • [1/2] net/ring: refactor to reduce indentation in probe
Related show

Checks

Context Check Description
ci/iol-testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/travis-robot success Travis build: passed
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/Intel-compilation success Compilation OK
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/checkpatch warning coding style issues

Commit Message

Ferruh Yigit Oct. 2, 2020, 10:47 p.m. UTC
PMD accepts multiple 'nodeaction' arguments per vdev, for each instance
of the devarg an ethdev is created.
Like:
"--vdev net_ring0,nodeaction=r1:0:CREATE,nodeaction=r2:0:CREATE"
allocates two ethdevs.
Here ethdev names will be 'r1' and 'r2' respectively (each ethdev with
hardcoded number of queues).

If multiple ring ethdev is required, this can already be achieved by
providing multiple '--vdev'.

This patch updates the multiple 'nodeaction' arguments behavior, it now
creates single ethdev per a '--vdev' and each 'nodeaction' argument used
to define a queue of the ethdev. Number of 'nodeaction' argument defines
number of the queues in device.
Like for above sample:
"--vdev net_ring0,nodeaction=r1:0:CREATE,nodeaction=r2:0:CREATE",
creates an ethdev named 'net_ring0' with two queues from newly created
rings. Ring names are 'r1' and 'r2'.
For ethdev device 'node' and 'action' values are used from first
instance of the 'nodeaction' argument.

The behavior of the single 'nodeaction' argument behavior is slightly
changed, it now allocates (create or attach) single queue, instead of
hardcoded number of queues as done before.

The behavior without 'nodeaction' argument, "--vdev net_ring0", has not
been changed at all.

This also allows following, which was broken before:
"--vdev net_ring0,nodeaction=r1:0:CREATE,nodeaction=r2:0:CREATE \
--vdev net_ring1,nodeaction=r1:0:ATTACH,nodeaction=r2:0:ATTACH"

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 drivers/net/ring/rte_eth_ring.c | 53 +++++++++++++++++++++++++--------
 1 file changed, 40 insertions(+), 13 deletions(-)

Patch
diff mbox series

diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index 6d3deaa81a..fd02c06c56 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -495,6 +495,38 @@  struct node_action_list {
 	struct node_action_pair *list;
 };
 
+static int
+eth_dev_ring_create_nodeaction(const char *name,
+		struct rte_vdev_device *vdev,
+		const unsigned int numa_node,
+		enum dev_action action,
+		struct rte_eth_dev **eth_dev,
+		struct node_action_list *info)
+{
+	struct rte_ring *rxtx[RTE_PMD_RING_MAX_RX_RINGS];
+	unsigned int num_rings;
+	unsigned int i;
+
+	num_rings = info->total;
+
+	for (i = 0; i < num_rings; i++) {
+		if (action == DEV_CREATE)
+			rxtx[i] = rte_ring_create(info->list[i].name, 1024,
+					numa_node,
+					RING_F_SP_ENQ|RING_F_SC_DEQ);
+		else
+			rxtx[i] = rte_ring_lookup(info->list[i].name);
+		if (rxtx[i] == NULL)
+			return -1;
+	}
+
+	if (do_eth_dev_ring_create(name, vdev, rxtx, num_rings, rxtx,
+			num_rings, numa_node, action, eth_dev) < 0)
+		return -1;
+
+	return 0;
+}
+
 static int parse_kvlist(const char *key __rte_unused,
 			const char *value, void *data)
 {
@@ -657,22 +689,17 @@  rte_pmd_ring_probe(struct rte_vdev_device *dev)
 
 	ret = rte_kvargs_process(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG,
 				 parse_kvlist, info);
-
 	if (ret < 0)
 		goto out_free;
 
-	for (info->count = 0; info->count < info->total; info->count++) {
-		ret = eth_dev_ring_create(info->list[info->count].name, dev,
-				info->list[info->count].node,
-				info->list[info->count].action,
-				&eth_dev);
-		if ((ret == -1) && (info->list[info->count].action == DEV_CREATE)) {
-			PMD_LOG(INFO, "Attach to pmd_ring for %s", name);
-			ret = eth_dev_ring_create(name, dev,
-					info->list[info->count].node,
-					DEV_ATTACH,
-					&eth_dev);
-		}
+	ret = eth_dev_ring_create_nodeaction(name, dev,
+			info->list[0].node,
+			info->list[0].action, &eth_dev, info);
+	if ((ret == -1) && (info->list[0].action == DEV_CREATE)) {
+		PMD_LOG(INFO, "Attach to pmd_ring for %s", name);
+		ret = eth_dev_ring_create_nodeaction(name, dev,
+				info->list[0].node,
+				DEV_ATTACH, &eth_dev, info);
 	}
 
 out_free: