From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id F406BDE3 for ; Mon, 8 Oct 2018 09:21:35 +0200 (CEST) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (Proofpoint Essentials ESMTP Server) with ESMTPS id 567D8140064; Mon, 8 Oct 2018 07:21:34 +0000 (UTC) Received: from [192.168.38.17] (91.220.146.112) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Mon, 8 Oct 2018 08:21:28 +0100 To: Thomas Monjalon , CC: , , References: <20181007222554.4886-1-thomas@monjalon.net> <20181007222554.4886-4-thomas@monjalon.net> From: Andrew Rybchenko Message-ID: Date: Mon, 8 Oct 2018 10:20:47 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 MIME-Version: 1.0 In-Reply-To: <20181007222554.4886-4-thomas@monjalon.net> Content-Language: en-GB X-Originating-IP: [91.220.146.112] X-ClientProxiedBy: ocex03.SolarFlarecom.com (10.20.40.36) To ukex01.SolarFlarecom.com (10.17.10.4) X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24142.003 X-TM-AS-Result: No-13.929700-8.000000-10 X-TMASE-MatchedRID: UuaOI1zLN1gOwH4pD14DsPHkpkyUphL9Ct59Uh3p/NVgg+UjPGL1RcVA 08S977kgSuqwC2iSnbI4To4+gy/tYNS7ezKc1Aok9UVHiwLx0/JKPIx+MJF9o99RlPzeVuQQVsd qbjq4wD26SKvyD7eNRB67qGR4UdgQhlahuHmDw1YcsSroYI5AViT0t/+p7zHH+Cckfm+bb6DqUp OLyRtQ8OnktTqe8zcp+uOgRCF/7P/fN9bhMNhpTb2xWbKjBfWPxmJ6Bfwk3mUHiwiF9OOogUqyU ztVRoTBdvgGbsWpCct7WtFeDjrG8tJ24xzpGcj5PlujdkswUwcH519/vRZuOYhIjrzeyQMK+z/g A/twPxc1Nxz4Ua0cvf++gjOGfzBm5UcZtwNsCro5f9Xw/xqKXVkMvWAuahr8+gD2vYtOFhi8mof WgmFAh88oWDz352/ti0CZ4ZMDSAiZFVox9OXWe+gRX3a/VfUr8YYqVNHt5F5mdKrULh5T6fCzUO ChJAt3Px1kkiBZyoHD4+4FLYelvQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--13.929700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24142.003 X-MDID: 1538983295-XbgfdNQPlYva Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: Re: [dpdk-dev] [PATCH 3/5] ethdev: allow iterating with only class filter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Oct 2018 07:21:36 -0000 On 10/8/18 1:25 AM, Thomas Monjalon wrote: > 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. */ It looks like it is the only hunk which Fixes: e815a7f69371 ("ethdev: register as a class") everything else adjusts the previous patch. I think this fix should go before and the rest should be squashed in the previous patch. It was really questionable why it is safe to dereference iter->bus without checking that it is not NULL. > 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; > + } > + It looks like a hack, but I guess we need it since rte_devargs_parse() cannot handle the case. May be it is acceptable if we have no time to solve it, but it would be good to highlight it better in the comments. > /* 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 */