From patchwork Sun Feb 5 16:05:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wiles, Keith" X-Patchwork-Id: 20173 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 54F90BD2C; Sun, 5 Feb 2017 17:06:10 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 5301D2C27 for ; Sun, 5 Feb 2017 17:05:18 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga105.fm.intel.com with ESMTP; 05 Feb 2017 08:05:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,338,1477983600"; d="scan'208";a="40040857" Received: from fshahid-mobl2.amr.corp.intel.com ([10.254.19.238]) by orsmga002.jf.intel.com with ESMTP; 05 Feb 2017 08:05:16 -0800 From: Keith Wiles To: dev@dpdk.org Cc: pascal.mazon@6wind.com, ferruh.yigit@intel.com Date: Sun, 5 Feb 2017 10:05:07 -0600 Message-Id: <20170205160509.88530-4-keith.wiles@intel.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20170205160509.88530-1-keith.wiles@intel.com> References: <20170205160509.88530-1-keith.wiles@intel.com> In-Reply-To: <20170202223330.39240-1-keith.wiles@intel.com> References: <20170202223330.39240-1-keith.wiles@intel.com> Subject: [dpdk-dev] [PATCH v2 4/6] net/tap: fix multi-queue support 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" At the same time remove the code which created the first device queue at probe time. Now all queues are created during queue setup calls. Signed-off-by: Keith Wiles --- drivers/net/tap/rte_eth_tap.c | 104 ++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 70 deletions(-) diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 61659bc..7c923a2 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -57,7 +57,11 @@ #define ETH_TAP_IFACE_ARG "iface" #define ETH_TAP_SPEED_ARG "speed" +#ifdef IFF_MULTI_QUEUE #define RTE_PMD_TAP_MAX_QUEUES 16 +#else +#define RTE_PMD_TAP_MAX_QUEUES 1 +#endif static struct rte_vdev_driver pmd_tap_drv; @@ -114,17 +118,20 @@ struct pmd_internals { * supplied name. */ static int -tun_alloc(char *name) +tun_alloc(struct pmd_internals *pmd, uint16_t qid) { struct ifreq ifr; +#ifdef IFF_MULTI_QUEUE unsigned int features; +#endif int fd; memset(&ifr, 0, sizeof(struct ifreq)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - if (name && name[0]) - strncpy(ifr.ifr_name, name, IFNAMSIZ); + strncpy(ifr.ifr_name, pmd->name, IFNAMSIZ); + + RTE_LOG(DEBUG, PMD, "ifr_name '%s'\n", ifr.ifr_name); fd = open(TUN_TAP_DEV_PATH, O_RDWR); if (fd < 0) { @@ -132,37 +139,26 @@ tun_alloc(char *name) goto error; } - /* Grab the TUN features to verify we can work */ +#ifdef IFF_MULTI_QUEUE + /* Grab the TUN features to verify we can work multi-queue */ if (ioctl(fd, TUNGETFEATURES, &features) < 0) { - RTE_LOG(ERR, PMD, "Unable to get TUN/TAP features\n"); + RTE_LOG(ERR, PMD, "TAP unable to get TUN/TAP features\n"); goto error; } - RTE_LOG(DEBUG, PMD, "TUN/TAP Features %08x\n", features); + RTE_LOG(DEBUG, PMD, " TAP Features %08x\n", features); -#ifdef IFF_MULTI_QUEUE - if (!(features & IFF_MULTI_QUEUE) && (RTE_PMD_TAP_MAX_QUEUES > 1)) { - RTE_LOG(DEBUG, PMD, "TUN/TAP device only one queue\n"); - goto error; - } else if ((features & IFF_ONE_QUEUE) && - (RTE_PMD_TAP_MAX_QUEUES == 1)) { - ifr.ifr_flags |= IFF_ONE_QUEUE; - RTE_LOG(DEBUG, PMD, "Single queue only support\n"); - } else { - ifr.ifr_flags |= IFF_MULTI_QUEUE; - RTE_LOG(DEBUG, PMD, "Multi-queue support for %d queues\n", + if (features & IFF_MULTI_QUEUE) { + RTE_LOG(DEBUG, PMD, " Multi-queue support for %d queues\n", RTE_PMD_TAP_MAX_QUEUES); - } -#else - if (RTE_PMD_TAP_MAX_QUEUES > 1) { - RTE_LOG(DEBUG, PMD, "TUN/TAP device only one queue\n"); - goto error; - } else { + ifr.ifr_flags |= IFF_MULTI_QUEUE; + } else +#endif + { ifr.ifr_flags |= IFF_ONE_QUEUE; RTE_LOG(DEBUG, PMD, "Single queue only support\n"); } -#endif - /* Set the TUN/TAP configuration and get the name if needed */ + /* Set the TUN/TAP configuration and set the name if needed */ if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) { RTE_LOG(ERR, PMD, "Unable to set TUNSETIFF for %s\n", ifr.ifr_name); @@ -177,9 +173,15 @@ tun_alloc(char *name) goto error; } - /* If the name is different that new name as default */ - if (name && strcmp(name, ifr.ifr_name)) - snprintf(name, RTE_ETH_NAME_MAX_LEN - 1, "%s", ifr.ifr_name); + if (qid == 0) { + if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) { + RTE_LOG(ERR, PMD, "ioctl failed (SIOCGIFHWADDR) (%s)\n", + ifr.ifr_name); + goto error; + } + + rte_memcpy(&pmd->eth_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); + } return fd; @@ -507,7 +509,7 @@ tap_setup_queue(struct rte_eth_dev *dev, if (fd < 0) { RTE_LOG(INFO, PMD, "Add queue to TAP %s for qid %d\n", pmd->name, qid); - fd = tun_alloc(pmd->name); + fd = tun_alloc(pmd, qid); if (fd < 0) { RTE_LOG(ERR, PMD, "tun_alloc(%s) failed\n", pmd->name); @@ -629,34 +631,13 @@ static const struct eth_dev_ops ops = { }; static int -pmd_mac_address(int fd, struct ether_addr *addr) -{ - struct ifreq ifr; - - if ((fd <= 0) || !addr) - return -1; - - memset(&ifr, 0, sizeof(ifr)); - - if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) { - RTE_LOG(ERR, PMD, "ioctl failed (SIOCGIFHWADDR) (%s)\n", - ifr.ifr_name); - return -1; - } - - rte_memcpy(addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); - - return 0; -} - -static int eth_dev_tap_create(const char *name, char *tap_name) { int numa_node = rte_socket_id(); struct rte_eth_dev *dev = NULL; struct pmd_internals *pmd = NULL; struct rte_eth_dev_data *data = NULL; - int i, fd = -1; + int i; RTE_LOG(INFO, PMD, "%s: Create TAP Ethernet device with %d queues on numa %u\n", @@ -674,7 +655,6 @@ eth_dev_tap_create(const char *name, char *tap_name) goto error_exit; } - /* Use the name and not the tap_name */ dev = rte_eth_dev_allocate(tap_name); if (!dev) { RTE_LOG(ERR, PMD, "Unable to allocate device struct\n"); @@ -705,28 +685,12 @@ eth_dev_tap_create(const char *name, char *tap_name) dev->tx_pkt_burst = pmd_tx_burst; snprintf(dev->data->name, sizeof(dev->data->name), "%s", name); - /* Create the first Tap device */ - fd = tun_alloc(tap_name); - if (fd < 0) { - RTE_LOG(ERR, PMD, "tun_alloc() failed\n"); - goto error_exit; - } - - /* Presetup the fds to -1 as being not working */ - for (i = 1; i < RTE_PMD_TAP_MAX_QUEUES; i++) { + /* Presetup the fds to -1 as being not valid */ + for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) { pmd->rxq[i].fd = -1; pmd->txq[i].fd = -1; } - /* Take the TUN/TAP fd and place in the first location */ - pmd->rxq[0].fd = fd; - pmd->txq[0].fd = fd; - - if (pmd_mac_address(fd, &pmd->eth_addr) < 0) { - RTE_LOG(ERR, PMD, "Unable to get MAC address\n"); - goto error_exit; - } - return 0; error_exit: