From patchwork Tue Sep 15 03:05:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 77667 X-Patchwork-Delegate: rasland@nvidia.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 1E6D1A04C7; Tue, 15 Sep 2020 05:06:02 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C48A21C0C6; Tue, 15 Sep 2020 05:06:01 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id AB82E1BFC5 for ; Tue, 15 Sep 2020 05:05:59 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 15 Sep 2020 06:05:58 +0300 Received: from nvidia.com (pegasus05.mtr.labs.mlnx [10.210.16.100]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 08F35w7K011549; Tue, 15 Sep 2020 06:05:58 +0300 From: Xueming Li To: Matan Azrad , Viacheslav Ovsiienko Cc: dev@dpdk.org, Asaf Penso , xuemingl@nvidia.com, stable@dpdk.org Date: Tue, 15 Sep 2020 03:05:53 +0000 Message-Id: <1600139153-9990-1-git-send-email-xuemingl@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] net/mlx5: use bond index for netdev operations 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 case of bonding, device ifindex was detected as the PF ifindex, so any operation using ifindex applied to PF instead of the bond device. These operations includes MTU get/set, up/down and mac address manipulation, etc. This patch detects bond interface ifindex and name for PF that join a bond interface, uses it by default for netdev operations. Cc: stable@dpdk.org Signed-off-by: Xueming Li Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/linux/mlx5_ethdev_os.c | 56 +++++++++++++++++++++++++ drivers/net/mlx5/linux/mlx5_os.c | 13 ++++++ drivers/net/mlx5/mlx5.h | 4 ++ drivers/net/mlx5/mlx5_ethdev.c | 2 +- 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c index 7256c1bcfe..593b0d08ac 100644 --- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c +++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c @@ -151,6 +151,10 @@ mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]) MLX5_ASSERT(priv); MLX5_ASSERT(priv->sh); + if (priv->bond_ifindex > 0) { + memcpy(ifname, priv->bond_name, IF_NAMESIZE); + return 0; + } ifindex = mlx5_ifindex(dev); if (!ifindex) { if (!priv->representor) @@ -1101,6 +1105,58 @@ mlx5_sysfs_switch_info(unsigned int ifindex, struct mlx5_switch_info *info) return 0; } +/** + * Get bond information associated with network interface. + * + * @param pf_ifindex + * Network interface index of bond slave interface + * @param[out] ifindex + * Pointer to bond ifindex. + * @param[out] ifname + * Pointer to bond ifname. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_sysfs_bond_info(unsigned int pf_ifindex, unsigned int *ifindex, + char *ifname) +{ + char name[IF_NAMESIZE]; + FILE *file; + unsigned int index; + int ret; + + if (!if_indextoname(pf_ifindex, name) || !strlen(name)) { + rte_errno = errno; + return -rte_errno; + } + MKSTR(bond_if, "/sys/class/net/%s/master/ifindex", name); + /* read bond ifindex */ + file = fopen(bond_if, "rb"); + if (file == NULL) { + rte_errno = errno; + return -rte_errno; + } + ret = fscanf(file, "%u", &index); + fclose(file); + if (ret <= 0) { + rte_errno = errno; + return -rte_errno; + } + if (ifindex) + *ifindex = index; + + /* read bond device name from symbol link */ + if (ifname) { + if (!if_indextoname(index, ifname)) { + rte_errno = errno; + return -rte_errno; + } + } + return 0; +} + /** * DPDK callback to retrieve plug-in module EEPROM information (type and size). * diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 5f1e9520f7..b4c80d7af0 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -1168,6 +1168,19 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, */ MLX5_ASSERT(spawn->ifindex); priv->if_index = spawn->ifindex; + if (priv->pf_bond >= 0 && priv->master) { + /* Get bond interface info */ + err = mlx5_sysfs_bond_info(priv->if_index, + &priv->bond_ifindex, + priv->bond_name); + if (err) + DRV_LOG(ERR, "unable to get bond info: %s", + strerror(rte_errno)); + else + DRV_LOG(INFO, "PF device %u, bond device %u(%s)", + priv->if_index, priv->bond_ifindex, + priv->bond_name); + } eth_dev->data->dev_private = priv; priv->dev_data = eth_dev->data; eth_dev->data->mac_addrs = priv->mac; diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 1a7c712f2c..c62643ae62 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -771,6 +771,8 @@ struct mlx5_priv { int32_t representor_id; /* Port representor identifier. */ int32_t pf_bond; /* >=0 means PF index in bonding configuration. */ unsigned int if_index; /* Associated kernel network device index. */ + uint32_t bond_ifindex; /**< Bond interface index. */ + char bond_name[IF_NAMESIZE]; /**< Bond interface name. */ /* RX/TX queues. */ unsigned int rxqs_n; /* RX queues array size. */ unsigned int txqs_n; /* TX queues array size. */ @@ -897,6 +899,8 @@ void mlx5_translate_port_name(const char *port_name_in, struct mlx5_switch_info *port_info_out); void mlx5_intr_callback_unregister(const struct rte_intr_handle *handle, rte_intr_callback_fn cb_fn, void *cb_arg); +int mlx5_sysfs_bond_info(unsigned int pf_ifindex, unsigned int *ifindex, + char *ifname); int mlx5_get_module_info(struct rte_eth_dev *dev, struct rte_eth_dev_module_info *modinfo); int mlx5_get_module_eeprom(struct rte_eth_dev *dev, diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index cefb45064e..48121929de 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -43,7 +43,7 @@ mlx5_ifindex(const struct rte_eth_dev *dev) MLX5_ASSERT(priv); MLX5_ASSERT(priv->if_index); - ifindex = priv->if_index; + ifindex = priv->bond_ifindex > 0 ? priv->bond_ifindex : priv->if_index; if (!ifindex) rte_errno = ENXIO; return ifindex;