DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ferruh Yigit <ferruh.yigit@intel.com>
To: Bruce Richardson <bruce.richardson@intel.com>
Cc: dev@dpdk.org
Subject: [dpdk-dev] [PATCH 2/2] net/ring: prevent nodeaction arg create multiple ethdev
Date: Fri,  2 Oct 2020 23:47:48 +0100	[thread overview]
Message-ID: <20201002224748.1532530-2-ferruh.yigit@intel.com> (raw)
In-Reply-To: <20201002224748.1532530-1-ferruh.yigit@intel.com>

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

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:
-- 
2.26.2


  reply	other threads:[~2020-10-02 22:48 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-02 22:47 [dpdk-dev] [PATCH 1/2] net/ring: refactor to reduce indentation in probe Ferruh Yigit
2020-10-02 22:47 ` Ferruh Yigit [this message]
2021-04-20  1:10 ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201002224748.1532530-2-ferruh.yigit@intel.com \
    --to=ferruh.yigit@intel.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).