From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id 3B7381B2B3 for ; Tue, 23 Oct 2018 10:28:50 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id DAFC1220D0; Tue, 23 Oct 2018 04:28:49 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Tue, 23 Oct 2018 04:28:49 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=mesmtp; bh=q8OBrmkxEp PYPsmucZdkzY0KCYQwxRICq3gEgLXMeBc=; b=FSMwYjf6RFwoy5MANC7yqZB4Ic /V6DLYBpDLTw+juVOSsS5MReKL3VtnW1iQKvSnHd+01K5Msmazq/m1amwomtbrdp OV5onODybAzTsyqcuBv3CM0cRmN3nnbam1RQqtbK8FKdTNWHa6kTSBcM4VoOsiYk WAPS5WcMNNXqYKPc8= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=q8OBrmkxEpPYPsmucZdkzY0KCYQwxRICq3gEgLXMeBc=; b=btzrTZ+c npSpSTBtCLbYQP1vb3XfwpgSNFU5hXCiCcV1dbgcUTlTcurfaNVg7DTrtNxOYPbl sQV3SME+Fp3IYjXEgorSxUB5VK3zQPF5O1aa1FLHw8vOcMz83yCLBbBfyLDyDJ/F MPM9L0OFCzVfHqURSIAZgmosW6Wi/aPNaqzQ/i75ZGDEYa2fcRP3rTr559vw1g9j 5Y9EyrqoYduvihPnxTKo0DrvXfydHLm/783KORQW9BrO+DAmCyVH/dy0GNHiYAb1 x5L5WFsLv+vCYkjKLYFZm+BDXO/nA1PtepJ5OdwpLrRqWqOZVDrbC25Rc1olvUT1 3bXHSAn8Mb1L5g== X-ME-Sender: X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id AA6E7E491F; Tue, 23 Oct 2018 04:28:48 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: gaetan.rivet@6wind.com, ophirmu@mellanox.com, wisamm@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com, bernard.iremonger@intel.com Date: Tue, 23 Oct 2018 10:28:38 +0200 Message-Id: <20181023082842.7963-4-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181023082842.7963-1-thomas@monjalon.net> References: <20181007222554.4886-1-thomas@monjalon.net> <20181023082842.7963-1-thomas@monjalon.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v7 3/7] ethdev: allow iterating with pure 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: Tue, 23 Oct 2018 08:28:50 -0000 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 Signed-off-by: Thomas Monjalon Reviewed-by: Andrew Rybchenko --- lib/librte_ethdev/rte_class_eth.c | 2 +- lib/librte_ethdev/rte_ethdev.c | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/librte_ethdev/rte_class_eth.c b/lib/librte_ethdev/rte_class_eth.c index c04279ec6..58fed694b 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 3550aa696..7ed71744c 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -202,10 +202,24 @@ 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 pure class filter (i.e. without any bus-level argument), + * from future new syntax. + * rte_devargs_parse() is not yet supporting the new syntax, + * that's why this simple case is temporarily parsed here. + */ +#define iter_anybus_str "class=eth," + 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) @@ -259,6 +273,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; @@ -279,8 +294,10 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter) return RTE_MAX_ETHPORTS; do { /* loop to try all matching rte_device */ - /* If not in middle of rte_eth_dev iteration, */ - if (iter->class_device == NULL) { + /* If not pure ethdev filter and */ + if (iter->bus != NULL && + /* not in middle of rte_eth_dev iteration, */ + iter->class_device == NULL) { /* get next rte_device to try. */ iter->device = iter->bus->dev_iterate( iter->device, iter->bus_str, iter); @@ -292,7 +309,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); /* match */ - } while (1); /* need to try next rte_device */ + } while (iter->bus != NULL); /* need to try next rte_device */ /* No more ethdev port to iterate. */ rte_eth_iterator_cleanup(iter); @@ -302,6 +319,8 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter) void __rte_experimental rte_eth_iterator_cleanup(struct rte_dev_iterator *iter) { + if (iter->bus_str == NULL) + return; /* nothing to free in pure class filter */ free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */ free(RTE_CAST_FIELD(iter, cls_str, char *)); /* workaround const */ memset(iter, 0, sizeof(*iter)); -- 2.19.0