From patchwork Tue Jun 2 15:53:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matan Azrad X-Patchwork-Id: 70747 X-Patchwork-Delegate: maxime.coquelin@redhat.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 012F8A0514; Tue, 2 Jun 2020 17:53:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D71741BF73; Tue, 2 Jun 2020 17:53:34 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 7EECD5F2F for ; Tue, 2 Jun 2020 17:53:33 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from matan@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Jun 2020 18:53:32 +0300 Received: from pegasus25.mtr.labs.mlnx. (pegasus25.mtr.labs.mlnx [10.210.16.10]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 052FrW5t015577; Tue, 2 Jun 2020 18:53:32 +0300 From: Matan Azrad To: Viacheslav Ovsiienko Cc: dev@dpdk.org, Maxime Coquelin Date: Tue, 2 Jun 2020 15:53:27 +0000 Message-Id: <1591113208-79169-1-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH 1/2] common/mlx5: share kernel interface name getter 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" Some configuration of the mlx5 port are done by the kernel net device associated to the IB device represents the PCI device. The DPDK mlx5 driver uses linux system calls, for example ioctl, in order to configure per port configurations requested by the DPDK user. One of the basic knowledges required to access the correct kernel net device is its name. Move function to get interface name from IB device path to the common library. Signed-off-by: Matan Azrad Reviewed-by: Maxime Coquelin --- drivers/common/mlx5/mlx5_common.c | 88 ++++++++++++++++++++++++ drivers/common/mlx5/mlx5_common.h | 3 + drivers/common/mlx5/rte_common_mlx5_version.map | 2 + drivers/net/mlx5/mlx5.c | 2 +- drivers/net/mlx5/mlx5.h | 1 - drivers/net/mlx5/mlx5_ethdev.c | 90 +------------------------ 6 files changed, 96 insertions(+), 90 deletions(-) diff --git a/drivers/common/mlx5/mlx5_common.c b/drivers/common/mlx5/mlx5_common.c index 1c77763..3f0d8d3 100644 --- a/drivers/common/mlx5/mlx5_common.c +++ b/drivers/common/mlx5/mlx5_common.c @@ -8,8 +8,10 @@ #ifdef RTE_IBVERBS_LINK_DLOPEN #include #endif +#include #include +#include #include "mlx5_common.h" #include "mlx5_common_utils.h" @@ -167,6 +169,92 @@ enum mlx5_class return; } +/** + * Get kernel interface name from IB device path. + * + * @param[in] ibdev_path + * Pointer to IB device path. + * @param[out] ifname + * Interface name output buffer. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_get_ifname_sysfs(const char *ibdev_path, char (*ifname)[IF_NAMESIZE]) +{ + DIR *dir; + struct dirent *dent; + unsigned int dev_type = 0; + unsigned int dev_port_prev = ~0u; + char match[IF_NAMESIZE] = ""; + + MLX5_ASSERT(ibdev_path); + { + MKSTR(path, "%s/device/net", 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; + + MKSTR(path, "%s/device/net/%s/%s", + ibdev_path, name, + (dev_type ? "dev_id" : "dev_port")); + + 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); + 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)); + } + closedir(dir); + if (match[0] == '\0') { + rte_errno = ENOENT; + return -rte_errno; + } + strncpy(*ifname, match, sizeof(*ifname)); + return 0; +} + #ifdef MLX5_GLUE /** diff --git a/drivers/common/mlx5/mlx5_common.h b/drivers/common/mlx5/mlx5_common.h index 8cd3ea5..4f6373b 100644 --- a/drivers/common/mlx5/mlx5_common.h +++ b/drivers/common/mlx5/mlx5_common.h @@ -6,6 +6,7 @@ #define RTE_PMD_MLX5_COMMON_H_ #include +#include #include #include @@ -212,6 +213,8 @@ enum mlx5_class { __rte_internal void mlx5_translate_port_name(const char *port_name_in, struct mlx5_switch_info *port_info_out); +__rte_internal +int mlx5_get_ifname_sysfs(const char *ibdev_path, char (*ifname)[IF_NAMESIZE]); extern uint8_t haswell_broadwell_cpu; diff --git a/drivers/common/mlx5/rte_common_mlx5_version.map b/drivers/common/mlx5/rte_common_mlx5_version.map index b3410df..a62584d 100644 --- a/drivers/common/mlx5/rte_common_mlx5_version.map +++ b/drivers/common/mlx5/rte_common_mlx5_version.map @@ -33,6 +33,8 @@ INTERNAL { mlx5_devx_cmd_query_virtq; mlx5_devx_get_out_command_status; + mlx5_get_ifname_sysfs; + mlx5_mp_init_primary; mlx5_mp_uninit_primary; mlx5_mp_init_secondary; diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 469ff73..91af47b 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -3570,7 +3570,7 @@ struct mlx5_flow_id_pool * */ continue; } - ret = mlx5_get_master_ifname + ret = mlx5_get_ifname_sysfs (ibv_match[i]->ibdev_path, &ifname); if (!ret) list[ns].ifindex = diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 2908c8b..536afae 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -645,7 +645,6 @@ int mlx5_udp_tunnel_port_add(struct rte_eth_dev *dev, /* mlx5_ethdev.c */ int mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]); -int mlx5_get_master_ifname(const char *ibdev_path, 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 mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu); diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index b837ce6..62344d1 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -129,95 +129,9 @@ struct ethtool_link_settings { #endif /** - * Get master interface name from private structure. - * - * @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. - */ -int -mlx5_get_master_ifname(const char *ibdev_path, char (*ifname)[IF_NAMESIZE]) -{ - DIR *dir; - struct dirent *dent; - unsigned int dev_type = 0; - unsigned int dev_port_prev = ~0u; - char match[IF_NAMESIZE] = ""; - - MLX5_ASSERT(ibdev_path); - { - MKSTR(path, "%s/device/net", 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; - - MKSTR(path, "%s/device/net/%s/%s", - ibdev_path, name, - (dev_type ? "dev_id" : "dev_port")); - - 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); - 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)); - } - closedir(dir); - if (match[0] == '\0') { - rte_errno = ENOENT; - return -rte_errno; - } - strncpy(*ifname, match, sizeof(*ifname)); - return 0; -} - -/** * Get interface name from private structure. * - * This is a port representor-aware version of mlx5_get_master_ifname(). + * This is a port representor-aware version of mlx5_get_ifname_sysfs(). * * @param[in] dev * Pointer to Ethernet device. @@ -238,7 +152,7 @@ struct ethtool_link_settings { ifindex = mlx5_ifindex(dev); if (!ifindex) { if (!priv->representor) - return mlx5_get_master_ifname(priv->sh->ibdev_path, + return mlx5_get_ifname_sysfs(priv->sh->ibdev_path, ifname); rte_errno = ENXIO; return -rte_errno; From patchwork Tue Jun 2 15:53:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matan Azrad X-Patchwork-Id: 70748 X-Patchwork-Delegate: maxime.coquelin@redhat.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 6369FA0514; Tue, 2 Jun 2020 17:53:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 18AA51BF5E; Tue, 2 Jun 2020 17:53:44 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id B3C362BAA for ; Tue, 2 Jun 2020 17:53:41 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE2 (envelope-from matan@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Jun 2020 18:53:36 +0300 Received: from pegasus25.mtr.labs.mlnx. (pegasus25.mtr.labs.mlnx [10.210.16.10]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 052FrW5u015577; Tue, 2 Jun 2020 18:53:36 +0300 From: Matan Azrad To: Viacheslav Ovsiienko Cc: dev@dpdk.org, Maxime Coquelin Date: Tue, 2 Jun 2020 15:53:28 +0000 Message-Id: <1591113208-79169-2-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1591113208-79169-1-git-send-email-matan@mellanox.com> References: <1591113208-79169-1-git-send-email-matan@mellanox.com> Subject: [dpdk-dev] [PATCH 2/2] vdpa/mlx5: support MTU feature 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 guest virtio device may request MTU updating when the vhost backend device exposes a capability to support it. Exspose the MTU feature capability. In configuration time, check the requested MTU and update it in the HW device. Signed-off-by: Matan Azrad Reviewed-by: Maxime Coquelin --- doc/guides/rel_notes/release_20_08.rst | 1 + doc/guides/vdpadevs/features/mlx5.ini | 1 + drivers/vdpa/mlx5/mlx5_vdpa.c | 67 ++++++++++++++++++++++++++++++++-- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst index 25a1563..543a064 100644 --- a/doc/guides/rel_notes/release_20_08.rst +++ b/doc/guides/rel_notes/release_20_08.rst @@ -67,6 +67,7 @@ New Features Updated Mellanox mlx5 vDPA driver with new features, including: * Added support for virtio queue statistics. + * Added support for MTU update. diff --git a/doc/guides/vdpadevs/features/mlx5.ini b/doc/guides/vdpadevs/features/mlx5.ini index 788d4e0..8bb9977 100644 --- a/doc/guides/vdpadevs/features/mlx5.ini +++ b/doc/guides/vdpadevs/features/mlx5.ini @@ -10,6 +10,7 @@ host tso4 = Y host tso6 = Y version 1 = Y log all = Y +mtu = Y any layout = Y guest announce = Y mq = Y diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c index 94cac66..2a2018b 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa.c @@ -2,6 +2,11 @@ * Copyright 2019 Mellanox Technologies, Ltd */ #include +#include +#include +#include +#include +#include #include #include @@ -25,14 +30,19 @@ (1ULL << VIRTIO_NET_F_MQ) | \ (1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE) | \ (1ULL << VIRTIO_F_ORDER_PLATFORM) | \ - (1ULL << VHOST_F_LOG_ALL)) + (1ULL << VHOST_F_LOG_ALL) | \ + (1ULL << VIRTIO_NET_F_MTU)) #define MLX5_VDPA_PROTOCOL_FEATURES \ ((1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \ (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD) | \ (1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER) | \ (1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD) | \ - (1ULL << VHOST_USER_PROTOCOL_F_MQ)) + (1ULL << VHOST_USER_PROTOCOL_F_MQ) | \ + (1ULL << VHOST_USER_PROTOCOL_F_NET_MTU)) + +#define MLX5_VDPA_MAX_RETRIES 20 +#define MLX5_VDPA_USEC 1000 TAILQ_HEAD(mlx5_vdpa_privs, mlx5_vdpa_priv) priv_list = TAILQ_HEAD_INITIALIZER(priv_list); @@ -223,6 +233,55 @@ } static int +mlx5_vdpa_mtu_set(struct mlx5_vdpa_priv *priv) +{ + struct ifreq request; + uint16_t vhost_mtu = 0; + uint16_t kern_mtu = 0; + int ret = rte_vhost_get_mtu(priv->vid, &vhost_mtu); + int sock; + int retries = MLX5_VDPA_MAX_RETRIES; + + if (ret) { + DRV_LOG(DEBUG, "Cannot get vhost MTU - %d.", ret); + return ret; + } + if (!vhost_mtu) { + DRV_LOG(DEBUG, "Vhost MTU is 0."); + return ret; + } + ret = mlx5_get_ifname_sysfs(priv->ctx->device->ibdev_path, + &request.ifr_name); + if (ret) { + DRV_LOG(DEBUG, "Cannot get kernel IF name - %d.", ret); + return ret; + } + sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sock == -1) { + DRV_LOG(DEBUG, "Cannot open IF socket."); + return sock; + } + while (retries--) { + ret = ioctl(sock, SIOCGIFMTU, &request); + if (ret == -1) + break; + kern_mtu = request.ifr_mtu; + DRV_LOG(DEBUG, "MTU: current %d requested %d.", (int)kern_mtu, + (int)vhost_mtu); + if (kern_mtu == vhost_mtu) + break; + request.ifr_mtu = vhost_mtu; + ret = ioctl(sock, SIOCSIFMTU, &request); + if (ret == -1) + break; + request.ifr_mtu = 0; + usleep(MLX5_VDPA_USEC); + } + close(sock); + return kern_mtu == vhost_mtu ? 0 : -1; +} + +static int mlx5_vdpa_dev_close(int vid) { int did = rte_vhost_get_vdpa_device_id(vid); @@ -265,6 +324,8 @@ return -1; } priv->vid = vid; + if (mlx5_vdpa_mtu_set(priv)) + DRV_LOG(WARNING, "MTU cannot be set on device %d.", did); if (mlx5_vdpa_pd_create(priv) || mlx5_vdpa_mem_register(priv) || mlx5_vdpa_direct_db_prepare(priv) || mlx5_vdpa_virtqs_prepare(priv) || mlx5_vdpa_steer_setup(priv) || @@ -513,8 +574,6 @@ return ret; } -#define MLX5_VDPA_MAX_RETRIES 20 -#define MLX5_VDPA_USEC 1000 static int mlx5_vdpa_roce_disable(struct rte_pci_addr *addr, struct ibv_device **ibv) {