From patchwork Wed Sep 23 21:16:17 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ravi Kerur X-Patchwork-Id: 7121 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id F38F18E68; Wed, 23 Sep 2015 23:16:17 +0200 (CEST) Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by dpdk.org (Postfix) with ESMTP id F036E8E66 for ; Wed, 23 Sep 2015 23:16:15 +0200 (CEST) Received: by pacex6 with SMTP id ex6so50871685pac.0 for ; Wed, 23 Sep 2015 14:16:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iCzI2U3qji5gqh9Vmns0UyjRrVX8aiVA1HtwK70UPN4=; b=FbBJHzRcwokd822a7iaQ82PZlEm0xjmPnoaeXe+VlgoO0F9aePRfa41xtMHRev+Hr8 ruhGHlpuw+auIqVPGW4X4exqfiQ2DeIiZXvNqyKvbTsBcAIBeJdIeQFo10YWyDtxOTNW aM5X+ppBlqLbFdf2P3nw19doeQuybDgS9fIvhSEEthOzvBdoyvoGeVThcLhiaggeepyM tc7u22wFdKR4bjhXqeaGFNJZAg7gAg3QeJRa1JiRFBBVViBUMpZgA2NtDpAfWAJm/rBw PXuzM/KW4pp0WJQOG2Z+ldm8p/D8v8pbKRjcxkkJduGvsxBQw3cu9DIw9nMktGGvyL1K gqNA== X-Received: by 10.68.245.164 with SMTP id xp4mr39552001pbc.100.1443042975344; Wed, 23 Sep 2015 14:16:15 -0700 (PDT) Received: from user-PC.hsd1.ca.comcast.net (c-24-4-155-27.hsd1.ca.comcast.net. [24.4.155.27]) by smtp.gmail.com with ESMTPSA id dz7sm9713704pab.16.2015.09.23.14.16.14 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 23 Sep 2015 14:16:14 -0700 (PDT) From: Ravi Kerur To: dev@dpdk.org Date: Wed, 23 Sep 2015 14:16:17 -0700 Message-Id: <1443042977-8271-1-git-send-email-rkerur@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1443042947-8208-1-git-send-email-rkerur@gmail.com> References: <1443042947-8208-1-git-send-email-rkerur@gmail.com> Subject: [dpdk-dev] [PATCH v3] Change rte_eal_vdev_init to update port_id X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" v3: > Isolate changes within rte_ether component. v2: > Remove tilegx changes > Use rte_eal_compare_pci_addr for address comparison > Use dpdk_2.2 in version map file for new functions v1: Changes include > Modify rte_eal_vdev_init to return allocated port_id > Modify rte_eal_probe_one to return allocated port_id 2. Removed following functions > rte_eth_dev_save and > rte_eth_dev_get_changed_port 3. Added 2 new functions > rte_eth_dev_get_port_by_name > rte_eth_dev_get_port_by_addr 4. Fix return error(ENOMEM) in function rte_pmd_mpipe_devinit Compiled on Linux for following targets > x86_64-native-linuxapp-gcc > x86_64-native-linuxapp-clang > x86_x32-native-linuxapp-gcc Compiled on FreeBSD for following targets > x86_64-native-bsdapp-clang > x86_64-native-bsdapp-gcc Tested on Linux/FreeBSD: > port attach eth_null > port start all > port stop all > port close all > port detach 0 > port attach eth_null > port start all > port stop all > port close all > port detach 0 Successful run of checkpatch.pl on the diffs Successful validate_abi on Linux for following targets > x86_64-native-linuxapp-gcc > x86_64-native-linuxapp-clang Signed-off-by: Ravi Kerur Acked-by: Tetsuya Mukawa --- lib/librte_ether/rte_ethdev.c | 116 +++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index b309309..e4b8e41 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -442,32 +442,6 @@ rte_eth_dev_get_device_type(uint8_t port_id) } static int -rte_eth_dev_save(struct rte_eth_dev *devs, size_t size) -{ - if ((devs == NULL) || - (size != sizeof(struct rte_eth_dev) * RTE_MAX_ETHPORTS)) - return -EINVAL; - - /* save current rte_eth_devices */ - memcpy(devs, rte_eth_devices, size); - return 0; -} - -static int -rte_eth_dev_get_changed_port(struct rte_eth_dev *devs, uint8_t *port_id) -{ - if ((devs == NULL) || (port_id == NULL)) - return -EINVAL; - - /* check which port was attached or detached */ - for (*port_id = 0; *port_id < RTE_MAX_ETHPORTS; (*port_id)++, devs++) { - if (rte_eth_devices[*port_id].attached ^ devs->attached) - return 0; - } - return -ENODEV; -} - -static int rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr) { VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); @@ -501,6 +475,59 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name) } static int +rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id) +{ + int i; + + if (name == NULL) { + PMD_DEBUG_TRACE("Null pointer is specified\n"); + return -EINVAL; + } + + *port_id = RTE_MAX_ETHPORTS; + + for (i = 0; i < RTE_MAX_ETHPORTS; i++) { + + if (!strncmp(name, + rte_eth_dev_data[i].name, strlen(name))) { + + *port_id = i; + + return 0; + } + } + return -ENODEV; +} + +static int +rte_eth_dev_get_port_by_addr(const struct rte_pci_addr *addr, uint8_t *port_id) +{ + int i; + struct rte_pci_device *pci_dev = NULL; + + if (addr == NULL) { + PMD_DEBUG_TRACE("Null pointer is specified\n"); + return -EINVAL; + } + + *port_id = RTE_MAX_ETHPORTS; + + for (i = 0; i < RTE_MAX_ETHPORTS; i++) { + + pci_dev = rte_eth_devices[i].pci_dev; + + if (pci_dev && + !rte_eal_compare_pci_addr(&pci_dev->addr, addr)) { + + *port_id = i; + + return 0; + } + } + return -ENODEV; +} + +static int rte_eth_dev_is_detachable(uint8_t port_id) { uint32_t drv_flags; @@ -530,30 +557,19 @@ rte_eth_dev_is_detachable(uint8_t port_id) static int rte_eth_dev_attach_pdev(struct rte_pci_addr *addr, uint8_t *port_id) { - uint8_t new_port_id; - struct rte_eth_dev devs[RTE_MAX_ETHPORTS]; - if ((addr == NULL) || (port_id == NULL)) goto err; - /* save current port status */ - if (rte_eth_dev_save(devs, sizeof(devs))) - goto err; /* re-construct pci_device_list */ if (rte_eal_pci_scan()) goto err; - /* invoke probe func of the driver can handle the new device. - * TODO: - * rte_eal_pci_probe_one() should return port_id. - * And rte_eth_dev_save() and rte_eth_dev_get_changed_port() - * should be removed. */ + /* Invoke probe func of the driver can handle the new device. */ if (rte_eal_pci_probe_one(addr)) goto err; - /* get port_id enabled by above procedures */ - if (rte_eth_dev_get_changed_port(devs, &new_port_id)) + + if (rte_eth_dev_get_port_by_addr(addr, port_id)) goto err; - *port_id = new_port_id; return 0; err: RTE_LOG(ERR, EAL, "Driver, cannot attach the device\n"); @@ -600,8 +616,6 @@ static int rte_eth_dev_attach_vdev(const char *vdevargs, uint8_t *port_id) { char *name = NULL, *args = NULL; - uint8_t new_port_id; - struct rte_eth_dev devs[RTE_MAX_ETHPORTS]; int ret = -1; if ((vdevargs == NULL) || (port_id == NULL)) @@ -611,22 +625,18 @@ rte_eth_dev_attach_vdev(const char *vdevargs, uint8_t *port_id) if (rte_eal_parse_devargs_str(vdevargs, &name, &args)) goto end; - /* save current port status */ - if (rte_eth_dev_save(devs, sizeof(devs))) - goto end; /* walk around dev_driver_list to find the driver of the device, - * then invoke probe function o the driver. - * TODO: - * rte_eal_vdev_init() should return port_id, - * And rte_eth_dev_save() and rte_eth_dev_get_changed_port() - * should be removed. */ + * then invoke probe function of the driver. + * rte_eal_vdev_init() updates port_id allocated after + * initialization. + */ if (rte_eal_vdev_init(name, args)) goto end; - /* get port_id enabled by above procedures */ - if (rte_eth_dev_get_changed_port(devs, &new_port_id)) + + if (rte_eth_dev_get_port_by_name(name, port_id)) goto end; + ret = 0; - *port_id = new_port_id; end: if (name) free(name);