From patchwork Tue Jul 24 08:36:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?N=C3=A9lio_Laranjeiro?= X-Patchwork-Id: 43295 X-Patchwork-Delegate: shahafs@mellanox.com 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 8F6C4239; Tue, 24 Jul 2018 10:36:58 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 4DC97235 for ; Tue, 24 Jul 2018 10:36:57 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id j5-v6so3235548wrr.8 for ; Tue, 24 Jul 2018 01:36:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=pzrDEbn08jNA/c80guwu2J2xHYQFEsccZIU21nQob4M=; b=S5XWtc2HrdKR5jJKCQZyCbUymFgUnQeHrMWODIc8ZntMtjbuDZNWXdKUD1+JGX55LR xNkYy96b64mimkh4xrW+r6b4V7cgD7fgtIrw0r1lxMDF6tJRaP5u9yHtbJN6witivx/p DFoIr6f9brtQTt9HNmV+OEeQvT2KXL5Z17+9iWkxaVY6IC5ytz56DFU4FiLW9ZETEvow 37F4KNITZXLYKDdQoSXUcJUjxlWRaT7embl/NpQtT9VSTQs6raJZMj+i+UqHgevbDAXk 5BuCJFBmJ5ScVByepH2dn0UpxtL5MCb6PEhY8nCVZt8dxWPX6gE5Tn8tQTwLWnmc4MSx ifMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=pzrDEbn08jNA/c80guwu2J2xHYQFEsccZIU21nQob4M=; b=TCUlTyLFcnRK4WtAkPV27Rh1p2Y/TCvj/FdVvk2VSyMlFNnOQPCkdfUdp2Uz7SxaK1 9kJLnQXQ+tqtWfozdZcRI8XAAOPsUoYGnc4XeDwXtUd6Ax/C4S7ZPwhFaQZBauSgMCkI 5RrUgAV9rx9t6avZh/xh8/s6ZelCLtyIFv3XZE6mX9xS9OTycV7fO2SBKKnnQo1n68E+ V6C0q4kOQAWXVNVWX1DTBGpCMMiH5zX6gf3tEmM9fxDY8y88mUln98nnAiUpNJ4856bY r29UU9oN1Uav/2dMaUCz+a/PloCN/YTzwhB++8hdQt+EotszXc9CVnRn4M9Un6YdBp9E Yj5w== X-Gm-Message-State: AOUpUlHN99whXtalNRkJ646IytzTPTxFzoz1eR2/qwt7eXHkogFdacXn URxZyyYv6KnDLrCzveEY9lOnqRJRwQ== X-Google-Smtp-Source: AAOMgpd+jgEDRFz6AfojP3hEvrgvst56LqZJMBB/KZJQD1qLyrF68gk+10wUeBQLL1dl8KABEYa1jA== X-Received: by 2002:a5d:61ca:: with SMTP id q10-v6mr10759304wrv.33.1532421416828; Tue, 24 Jul 2018 01:36:56 -0700 (PDT) Received: from laranjeiro-vm.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id v10-v6sm12492025wrm.18.2018.07.24.01.36.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Jul 2018 01:36:56 -0700 (PDT) From: Nelio Laranjeiro To: dev@dpdk.org, Shahaf Shuler , Yongseok Koh Date: Tue, 24 Jul 2018 10:36:45 +0200 Message-Id: <262388487b03db7d31ca2bc398d530d5a90902d8.1532421340.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v2] net/mlx5: fix representors detection 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" On systems where the required Netlink commands are not supported but Mellanox OFED is installed, representors information must be retrieved through sysfs. Fixes: 4c10141488fe ("net/mlx5: add port representor awareness") Signed-off-by: Nelio Laranjeiro --- Changes in v2: On some distribution, the PF may not be able to open the sysfs file, such issue should not be handled as an error. --- drivers/net/mlx5/mlx5.c | 7 +++-- drivers/net/mlx5/mlx5.h | 2 ++ drivers/net/mlx5/mlx5_ethdev.c | 53 ++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 78a69228e..a1c0ad70a 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1330,7 +1330,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, * Netlink calls assuming kernel drivers are recent enough to * support them. * - * In the event of identification failure through Netlink, either: + * In the event of identification failure through Netlink, try again + * through sysfs, then either: * * 1. No device matches (n == 0), complain and bail out. * 2. A single IB device matches (n == 1) and is not a representor, @@ -1349,7 +1350,9 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, if (nl_route < 0 || !list[i].ifindex || mlx5_nl_switch_info(nl_route, list[i].ifindex, - &list[i].info)) { + &list[i].info) || + ((!list[i].info.representor && !list[i].info.master) && + mlx5_sysfs_switch_info(list[i].ifindex, &list[i].info))) { list[i].ifindex = 0; memset(&list[i].info, 0, sizeof(list[i].info)); continue; diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index db8a5fa01..a7f50b31f 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -273,6 +273,8 @@ eth_rx_burst_t mlx5_select_rx_function(struct rte_eth_dev *dev); unsigned int mlx5_dev_to_port_id(const struct rte_device *dev, uint16_t *port_list, unsigned int port_list_n); +int mlx5_sysfs_switch_info(unsigned int ifindex, + struct mlx5_switch_info *info); /* mlx5_mac.c */ diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 9cf2dc5f1..4a24f8021 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -1321,3 +1321,56 @@ mlx5_dev_to_port_id(const struct rte_device *dev, uint16_t *port_list, } return n; } + +/** + * Get switch information associated with network interface. + * + * @param ifindex + * Network interface index. + * @param[out] info + * Switch information object, populated in case of success. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_sysfs_switch_info(unsigned int ifindex, struct mlx5_switch_info *info) +{ + char ifname[IF_NAMESIZE]; + FILE *file; + struct mlx5_switch_info data = { .master = 0, }; + bool port_name_set = false; + bool port_switch_id_set = false; + char c; + + if (!if_indextoname(ifindex, ifname)) { + rte_errno = errno; + return -rte_errno; + } + + MKSTR(phys_port_name, "/sys/class/net/%s/phys_port_name", + ifname); + MKSTR(phys_switch_id, "/sys/class/net/%s/phys_switch_id", + ifname); + + file = fopen(phys_port_name, "rb"); + if (file != NULL) { + port_name_set = + fscanf(file, "%d%c", &data.port_name, &c) == 2 && + c == '\n'; + fclose(file); + } + file = fopen(phys_switch_id, "rb"); + if (file == NULL) { + rte_errno = errno; + return -rte_errno; + } + port_switch_id_set = + fscanf(file, "%" SCNx64 "%c", &data.switch_id, &c) == 2 && + c == '\n'; + fclose(file); + data.master = port_switch_id_set && !port_name_set; + data.representor = port_switch_id_set && port_name_set; + *info = data; + return 0; +}