From patchwork Fri Aug 31 09:57:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 44082 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 013BC4CAF; Fri, 31 Aug 2018 11:57:49 +0200 (CEST) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by dpdk.org (Postfix) with ESMTP id C36F84CA9 for ; Fri, 31 Aug 2018 11:57:46 +0200 (CEST) Received: by mail-wm0-f67.google.com with SMTP id b19-v6so4642715wme.3 for ; Fri, 31 Aug 2018 02:57:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=uH1dSiuRJOKF+4LK3P0pfJHBOSyO3TcVjT/YVmkriSg=; b=UslJyv4Y4OGBAOtZLEPX0Z2ZBlDQibAq7P9yE/+emWtA5CnVwWc8jq4ZFoGuFfq/AV CJLw7HzxKDUhDDQVEHyy9GqJqJsVXoMttZi6Zz62uUqhNq3rMsenHnvnh57cIw6WX7sC JoxvviYO1Aom73PoalrAcnFVsiAQK2GO9BbFNaJZdcZQ9WeDF9b27E3cG2EMjVqYLSHj xAbHnaGpz/Rz+L5KnEGu5ti7IX4TS8cIxmc/5E55knYfTHGb7pTPXDQ6s4CUdXOJWElL J9sBZ9XPOmMTrMETj77/ddGdzl1x1QAsr4aY7lKBcp/cW4YQK1xQQy11DeQj5pbBvPf8 0lFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=uH1dSiuRJOKF+4LK3P0pfJHBOSyO3TcVjT/YVmkriSg=; b=NLHYHvuHEj0eyj+cu0PDXWd8wnDy+EHNJw0eGrMTfTjzTcibAqpSDtQWK16XcCfr2X vjYC/BfOjKVrxn/lOXp/16OGmkBg5ljolaWV3BVH7dYpk3tyk34hlpFe3Wa3nssHYNDP qMk1oR7u5Na6N4J4vwWGG1N22eGfkEUpfdqf2kNSZVxTzb9OnpnG2lsXFwoHSQ0r3b68 yhLnhFHwaKwjPAlzQYF5O8wGi7e3aeJvRIqSaTs+ZkvI8llAwvE3ubtGzUOAdpOBt6KR OdDj9DDBy2LjDK+KdlqCTz5q6PdRaBjiqQN26EBYLfsiKYXvIN5jrmJc8x6OzMSP1rtP mrMw== X-Gm-Message-State: APzg51DU+zoF6WB+tkNriBrjfSFel8QJeC4kd+s+R1BtHJbBOb9lTMfN +6wUneKQlCfgq/jtNj81FsJ0Yw== X-Google-Smtp-Source: ANB0Vdb7eoXkMqGXw/UlTefH4i9+eJRX7W7tGfFevaQD/NACdFTKKzAELquOLFq4SuMcDoCHcdq3ng== X-Received: by 2002:a1c:3545:: with SMTP id c66-v6mr4290165wma.120.1535709466427; Fri, 31 Aug 2018 02:57:46 -0700 (PDT) Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h7-v6sm10725264wrs.3.2018.08.31.02.57.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 31 Aug 2018 02:57:45 -0700 (PDT) Date: Fri, 31 Aug 2018 11:57:30 +0200 From: Adrien Mazarguil To: Shahaf Shuler , Yongseok Koh , Slava Ovsiienko Cc: dev@dpdk.org Message-ID: <20180831092038.23051-3-adrien.mazarguil@6wind.com> References: <20180831092038.23051-1-adrien.mazarguil@6wind.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20180831092038.23051-1-adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.11.0 Subject: [dpdk-dev] [PATCH 2/8] net/mlx5: clean up redundant interface name getters 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" In order to return the network interface index (ifindex) associated with a device, mlx5_ifindex() uses if_nametoindex() to convert the result of mlx5_get_ifname(). This is inefficient because the latter first retrieves ifindex on its own to pass it through if_indextoname(). Since indices are much more reliable than names (less prone to change) and involved in flow rule management where performance matters, this patch moves ifindex-getting code directly into mlx5_ifindex() and replaces remaining mlx5_get_ifname() calls with if_indextoname(). Similarly, the new function mlx5_master_ifindex() replaces mlx5_get_master_ifname() while getting rid of irrelevant compatibility code for unsupported Linux and MLNX_OFED versions. Signed-off-by: Adrien Mazarguil --- drivers/net/mlx5/mlx5.c | 15 +-- drivers/net/mlx5/mlx5.h | 3 - drivers/net/mlx5/mlx5_ethdev.c | 184 ++++++++++++++---------------------- 3 files changed, 74 insertions(+), 128 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 55b73a03b..1414ce0c5 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -734,7 +734,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, struct ibv_counter_set_description cs_desc = { .counter_type = 0 }; #endif struct ether_addr mac; - char name[RTE_ETH_NAME_MAX_LEN]; + char name[RTE_MAX(IF_NAMESIZE, RTE_ETH_NAME_MAX_LEN)]; int own_domain_id = 0; struct rte_flow_error flow_error; unsigned int i; @@ -1116,16 +1116,9 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, mac.addr_bytes[2], mac.addr_bytes[3], mac.addr_bytes[4], mac.addr_bytes[5]); #ifndef NDEBUG - { - char ifname[IF_NAMESIZE]; - - if (mlx5_get_ifname(eth_dev, &ifname) == 0) - DRV_LOG(DEBUG, "port %u ifname is \"%s\"", - eth_dev->data->port_id, ifname); - else - DRV_LOG(DEBUG, "port %u ifname is unknown", - eth_dev->data->port_id); - } + DRV_LOG(DEBUG, "port %u ifname is \"%s\"", + eth_dev->data->port_id, + if_indextoname(priv->ifindex, name) ? name : ""); #endif /* Get actual MTU if possible. */ err = mlx5_get_mtu(eth_dev, &priv->mtu); diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 4c2dec644..0807cf689 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -241,9 +241,6 @@ int mlx5_getenv_int(const char *); /* mlx5_ethdev.c */ -int mlx5_get_master_ifname(const struct rte_eth_dev *dev, - char (*ifname)[IF_NAMESIZE]); -int mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]); unsigned int mlx5_ifindex(const struct rte_eth_dev *dev); int mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr, int master); diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index cf0b415b2..67149b7b3 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -119,149 +119,104 @@ struct ethtool_link_settings { #endif /** - * Get master interface name from private structure. + * Get network interface index associated with master device. + * + * Result differs from mlx5_ifindex() when the current device is a port + * representor. * * @param[in] dev * Pointer to Ethernet device. - * @param[out] ifname - * Interface name output buffer. * * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. + * Nonzero interface index on success, zero otherwise and rte_errno is set. */ -int -mlx5_get_master_ifname(const struct rte_eth_dev *dev, - char (*ifname)[IF_NAMESIZE]) +static unsigned int +mlx5_master_ifindex(const struct rte_eth_dev *dev) { struct priv *priv = dev->data->dev_private; - DIR *dir; - struct dirent *dent; - unsigned int dev_type = 0; - unsigned int dev_port_prev = ~0u; - char match[IF_NAMESIZE] = ""; - - { - MKSTR(path, "%s/device/net", priv->ibdev_path); - - dir = opendir(path); - if (dir == NULL) { - rte_errno = errno; - return -rte_errno; - } - } - while ((dent = readdir(dir)) != NULL) { - char *name = dent->d_name; - FILE *file; - unsigned int dev_port; - int r; - - if ((name[0] == '.') && - ((name[1] == '\0') || - ((name[1] == '.') && (name[2] == '\0')))) - continue; + DIR *dir = NULL; + struct dirent *dent = NULL; + size_t size = 0; + unsigned int ifindex = 0; - MKSTR(path, "%s/device/net/%s/%s", - priv->ibdev_path, name, - (dev_type ? "dev_id" : "dev_port")); + while (1) { + char path[size]; + FILE *file; + int ret; - file = fopen(path, "rb"); - if (file == NULL) { - if (errno != ENOENT) - continue; - /* - * Switch to dev_id when dev_port does not exist as - * is the case with Linux kernel versions < 3.15. - */ -try_dev_id: - match[0] = '\0'; - if (dev_type) - break; - dev_type = 1; - dev_port_prev = ~0u; - rewinddir(dir); + ret = snprintf(path, size, "%s/device/net/%s%s", + priv->ibdev_path, + dent ? dent->d_name : "", + dent ? "/ifindex" : ""); + if (ret == -1) + goto error; + if (!size) { + size = ret + 1; continue; } - r = fscanf(file, (dev_type ? "%x" : "%u"), &dev_port); - fclose(file); - if (r != 1) - continue; - /* - * Switch to dev_id when dev_port returns the same value for - * all ports. May happen when using a MOFED release older than - * 3.0 with a Linux kernel >= 3.15. - */ - if (dev_port == dev_port_prev) - goto try_dev_id; - dev_port_prev = dev_port; - if (dev_port == 0) - strlcpy(match, name, sizeof(match)); - } + if (!dir) { + dir = opendir(path); + if (!dir) + goto error; + } + file = dent ? fopen(path, "rb") : NULL; + if (file) { + /* Only one ifindex is expected in there. */ + ret = !!ifindex; + if (fscanf(file, "%u", &ifindex) != 1) + ret = 0; + fclose(file); + if (ret) { + errno = ENOTSUP; + goto error; + } + } + do { + dent = readdir(dir); + } while (dent && + (!strcmp(dent->d_name, ".") || + !strcmp(dent->d_name, ".."))); + if (!dent) + break; + size = 0; + }; closedir(dir); - if (match[0] == '\0') { - rte_errno = ENOENT; - return -rte_errno; - } - strncpy(*ifname, match, sizeof(*ifname)); + if (!ifindex) + rte_errno = ENXIO; + return ifindex; +error: + rte_errno = errno; + if (dir) + closedir(dir); return 0; } /** - * Get interface name from private structure. - * - * This is a port representor-aware version of mlx5_get_master_ifname(). + * Get network interface index associated with device. * * @param[in] dev * Pointer to Ethernet device. - * @param[out] ifname - * Interface name output buffer. * * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. + * Nonzero interface index on success, zero otherwise and rte_errno is set. */ -int -mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]) +unsigned int +mlx5_ifindex(const struct rte_eth_dev *dev) { struct priv *priv = dev->data->dev_private; unsigned int ifindex = priv->nl_socket_rdma >= 0 ? mlx5_nl_ifindex(priv->nl_socket_rdma, priv->ibdev_name) : 0; - if (!ifindex) { - if (!priv->representor) - return mlx5_get_master_ifname(dev, ifname); - rte_errno = ENXIO; - return -rte_errno; - } - if (if_indextoname(ifindex, &(*ifname)[0])) - return 0; - rte_errno = errno; + if (ifindex) + return ifindex; + if (!priv->representor) + return mlx5_master_ifindex(dev); + rte_errno = ENXIO; return -rte_errno; } /** - * Get the interface index from device name. - * - * @param[in] dev - * Pointer to Ethernet device. - * - * @return - * Nonzero interface index on success, zero otherwise and rte_errno is set. - */ -unsigned int -mlx5_ifindex(const struct rte_eth_dev *dev) -{ - char ifname[IF_NAMESIZE]; - unsigned int ifindex; - - if (mlx5_get_ifname(dev, &ifname)) - return 0; - ifindex = if_nametoindex(ifname); - if (!ifindex) - rte_errno = errno; - return ifindex; -} - -/** * Perform ifreq ioctl() on associated Ethernet device. * * @param[in] dev @@ -282,17 +237,18 @@ mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr, int master) { int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - int ret = 0; + unsigned int ifindex; + int ret; if (sock == -1) { rte_errno = errno; return -rte_errno; } if (master) - ret = mlx5_get_master_ifname(dev, &ifr->ifr_name); + ifindex = mlx5_master_ifindex(dev); else - ret = mlx5_get_ifname(dev, &ifr->ifr_name); - if (ret) + ifindex = mlx5_ifindex(dev); + if (!ifindex || !if_indextoname(ifindex, ifr->ifr_name)) goto error; ret = ioctl(sock, req, ifr); if (ret == -1) {