From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Monjalon Subject: [PATCH 3/5] ethdev: allow iterating with only class filter Date: Mon, 8 Oct 2018 00:25:52 +0200 Message-ID: <20181007222554.4886-4-thomas@monjalon.net> References: <20181007222554.4886-1-thomas@monjalon.net> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Cc: gaetan.rivet@6wind.com, ophirmu@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com To: dev@dpdk.org Return-path: Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id 92D811E20 for ; Mon, 8 Oct 2018 00:26:01 +0200 (CEST) In-Reply-To: <20181007222554.4886-1-thomas@monjalon.net> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" If no rte_device is given in the iterator, eth_dev_match() is looking at all ports without any restriction, except the ethdev kvargs filter. It allows to iterate with a devargs filter referencing only some ethdev parameters. The format (from the new devargs syntax) is: class=eth,paramY=Y Fixes: e815a7f69371 ("ethdev: register as a class") Signed-off-by: Thomas Monjalon --- lib/librte_ethdev/rte_class_eth.c | 2 +- lib/librte_ethdev/rte_ethdev.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/librte_ethdev/rte_class_eth.c b/lib/librte_ethdev/rte_class_eth.c index 84b646291..f0af51c36 100644 --- a/lib/librte_ethdev/rte_class_eth.c +++ b/lib/librte_ethdev/rte_class_eth.c @@ -42,7 +42,7 @@ eth_dev_match(const struct rte_eth_dev *edev, if (edev->state == RTE_ETH_DEV_UNUSED) return -1; - if (edev->device != arg->device) + if (arg->device != NULL && arg->device != edev->device) return -1; if (kvlist == NULL) /* Empty string matches everything. */ diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 83ab28c23..a43e0ab3a 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -199,10 +199,18 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str) * The devargs string may use various syntaxes: * - 0000:08:00.0,representor=[1-3] * - pci:0000:06:00.0,representor=[0,5] + * - class=eth,mac=00:11:22:33:44:55 * A new syntax is in development (not yet supported): * - bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z */ + /* Handle a case from future syntax, without any bus-level argument. */ + if (strncmp(devargs_str, iter_anybus_str, + strlen(iter_anybus_str)) == 0) { + iter->cls_str = devargs_str + strlen(iter_anybus_str); + goto end; + } + /* Split bus, device and parameters. */ ret = rte_devargs_parse(&devargs, devargs_str); if (ret != 0) @@ -239,6 +247,7 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str) } iter->bus_str = bus_str; +end: iter->cls = rte_class_find_by_name("eth"); return 0; } @@ -250,7 +259,7 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter) return RTE_MAX_ETHPORTS; do { /* loop for matching rte_device */ - if (iter->class_device == NULL) { + if (iter->bus != NULL && iter->class_device == NULL) { iter->device = iter->bus->dev_iterate( iter->device, iter->bus_str, iter); if (iter->device == NULL) @@ -260,7 +269,7 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter) iter->class_device, iter->cls_str, iter); if (iter->class_device != NULL) return eth_dev_to_id(iter->class_device); - } while (iter->class_device == NULL); + } while (iter->bus != NULL && iter->class_device == NULL); /* No more ethdev port to iterate. */ free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */ -- 2.19.0