From patchwork Fri Apr 17 16:42:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 68803 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1AC0CA0597; Fri, 17 Apr 2020 18:42:28 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C5B6E1EA89; Fri, 17 Apr 2020 18:42:24 +0200 (CEST) Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by dpdk.org (Postfix) with ESMTP id 1B1C11EA86; Fri, 17 Apr 2020 18:42:24 +0200 (CEST) X-Originating-IP: 86.246.31.132 Received: from inocybe.home (lfbn-idf2-1-566-132.w86-246.abo.wanadoo.fr [86.246.31.132]) (Authenticated sender: grive@u256.net) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 42B411BF20C; Fri, 17 Apr 2020 16:42:23 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Cc: stable@dpdk.org, Chas Williams Date: Fri, 17 Apr 2020 18:42:06 +0200 Message-Id: <0d0871d076871a3c7d9ea0d2dc479a725151f8c0.1587137703.git.grive@u256.net> X-Mailer: git-send-email 2.26.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 1/2] bonding: fix port id validity check on parsing 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" If the port_id is equal to RTE_MAX_ETHPORTS, it should be considered invalid. Additionally, UNUSED ports are also not valid port ids to be used afterward. To simplify following the ethdev API rules, use the exposed function checking whether a port id is valid. Fixes: 2efb58cbab6e ("bond: new link bonding library") Cc: stable@dpdk.org Cc: Chas Williams Signed-off-by: Gaetan Rivet Acked-by: Min Hu (Connor) --- drivers/net/bonding/rte_eth_bond_args.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c index abdf55261..35616fb8b 100644 --- a/drivers/net/bonding/rte_eth_bond_args.c +++ b/drivers/net/bonding/rte_eth_bond_args.c @@ -108,9 +108,8 @@ parse_port_id(const char *port_str) } } - if (port_id < 0 || port_id > RTE_MAX_ETHPORTS) { - RTE_BOND_LOG(ERR, "Slave port specified (%s) outside expected range", - port_str); + if (!rte_eth_dev_is_valid_port(port_id)) { + RTE_BOND_LOG(ERR, "Specified port (%s) is invalid", port_str); return -1; } return port_id; From patchwork Fri Apr 17 16:42:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 68804 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C30A5A0597; Fri, 17 Apr 2020 18:42:38 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 916C01EAAD; Fri, 17 Apr 2020 18:42:27 +0200 (CEST) Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by dpdk.org (Postfix) with ESMTP id 7AD291EA91; Fri, 17 Apr 2020 18:42:25 +0200 (CEST) X-Originating-IP: 86.246.31.132 Received: from inocybe.home (lfbn-idf2-1-566-132.w86-246.abo.wanadoo.fr [86.246.31.132]) (Authenticated sender: grive@u256.net) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 51BF01BF209; Fri, 17 Apr 2020 16:42:24 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Cc: stable@dpdk.org, Chas Williams , Declan Doherty , Gowrishankar Muthukrishnan Date: Fri, 17 Apr 2020 18:42:07 +0200 Message-Id: X-Mailer: git-send-email 2.26.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 2/2] bonding: fix PCI address comparison on non-pci ports 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The bonding PMD will iterate over all available ETH ports and for each, compare a chunk of bytes at an offset that would correspond to the PCI address in an rte_pci_device. This is incorrect and unsafe. Also, the rte_device using this PCI address is already found, no need to compare again the PCI address of all eth devices. Refactoring the code to fix this, the initial check to find the PCI bus is out of scope. Fixes: c848b518bbc7 ("net/bonding: support bifurcated driver in eal") Cc: stable@dpdk.org Cc: Chas Williams Cc: Declan Doherty Cc: Gowrishankar Muthukrishnan Signed-off-by: Gaetan Rivet Acked-by: Min Hu (Connor) --- drivers/net/bonding/rte_eth_bond_args.c | 58 +++++++++++-------------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c index 35616fb8b..8c5f90dc6 100644 --- a/drivers/net/bonding/rte_eth_bond_args.c +++ b/drivers/net/bonding/rte_eth_bond_args.c @@ -22,23 +22,37 @@ const char *pmd_bond_init_valid_arguments[] = { NULL }; +static inline int +bond_pci_addr_cmp(const struct rte_device *dev, const void *_pci_addr) +{ + const struct rte_pci_device *pdev = RTE_DEV_TO_PCI_CONST(dev); + const struct rte_pci_addr *paddr = _pci_addr; + + return rte_pci_addr_cmp(&pdev->addr, paddr); +} + static inline int find_port_id_by_pci_addr(const struct rte_pci_addr *pci_addr) { - struct rte_pci_device *pci_dev; - struct rte_pci_addr *eth_pci_addr; + struct rte_bus *pci_bus; + struct rte_device *dev; unsigned i; - RTE_ETH_FOREACH_DEV(i) { - pci_dev = RTE_ETH_DEV_TO_PCI(&rte_eth_devices[i]); - eth_pci_addr = &pci_dev->addr; + pci_bus = rte_bus_find_by_name("pci"); + if (pci_bus == NULL) { + RTE_BOND_LOG(ERR, "No PCI bus found"); + return -1; + } - if (pci_addr->bus == eth_pci_addr->bus && - pci_addr->devid == eth_pci_addr->devid && - pci_addr->domain == eth_pci_addr->domain && - pci_addr->function == eth_pci_addr->function) - return i; + dev = pci_bus->find_device(NULL, bond_pci_addr_cmp, pci_addr); + if (dev == NULL) { + RTE_BOND_LOG(ERR, "unable to find PCI device"); + return -1; } + + RTE_ETH_FOREACH_DEV(i) + if (rte_eth_devices[i].device == dev) + return i; return -1; } @@ -57,15 +71,6 @@ find_port_id_by_dev_name(const char *name) return -1; } -static inline int -bond_pci_addr_cmp(const struct rte_device *dev, const void *_pci_addr) -{ - const struct rte_pci_device *pdev = RTE_DEV_TO_PCI_CONST(dev); - const struct rte_pci_addr *paddr = _pci_addr; - - return rte_pci_addr_cmp(&pdev->addr, paddr); -} - /** * Parses a port identifier string to a port id by pci address, then by name, * and finally port id. @@ -74,23 +79,10 @@ static inline int parse_port_id(const char *port_str) { struct rte_pci_addr dev_addr; - struct rte_bus *pci_bus; - struct rte_device *dev; int port_id; - pci_bus = rte_bus_find_by_name("pci"); - if (pci_bus == NULL) { - RTE_BOND_LOG(ERR, "unable to find PCI bus\n"); - return -1; - } - /* try parsing as pci address, physical devices */ - if (pci_bus->parse(port_str, &dev_addr) == 0) { - dev = pci_bus->find_device(NULL, bond_pci_addr_cmp, &dev_addr); - if (dev == NULL) { - RTE_BOND_LOG(ERR, "unable to find PCI device"); - return -1; - } + if (rte_pci_addr_parse(port_str, &dev_addr) == 0) { port_id = find_port_id_by_pci_addr(&dev_addr); if (port_id < 0) return -1;