DPDK patches and discussions
 help / color / mirror / Atom feed
From: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
To: dev@dpdk.org
Cc: shahafs@mellanox.com
Subject: [dpdk-dev] [PATCH 1/1] net/mlx5: fix device probing for old kernel drivers
Date: Wed,  3 Apr 2019 14:14:42 +0000	[thread overview]
Message-ID: <1554300882-23990-1-git-send-email-viacheslavo@mellanox.com> (raw)
Message-ID: <20190403141442.p9EUSnEzSFNOLMHCftuV2rf4kSIaxhxosOcEoIVCLpE@z> (raw)

Retrieving network interface index via Netlink fails in
case of old mlx5 kernel drivers installed - mlx5_nl_ifindex()
routine fails due to wrong Netlink reply message sent by the
old drivers. This error was ignored in previous versions of
probing. For single devices ifindex was retrieved via sysfs
and link control was not lost, so problem just was not noticed.
In order to support MLX5 PMD functioning over old kernel drivers
this patch adds ifindex retrieving via sysfs into probing routine.
It is worth to note this method works for master/single device only.

Fixes: ad74bc619504 ("net/mlx5: support multiport IB device during probing")

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
---
 drivers/net/mlx5/mlx5.c        | 35 +++++++++++++++++++++++++++++++----
 drivers/net/mlx5/mlx5.h        |  1 +
 drivers/net/mlx5/mlx5_ethdev.c | 28 ++++++++++++++--------------
 3 files changed, 46 insertions(+), 18 deletions(-)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 7d322b6..9aa5f0b 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1772,12 +1772,39 @@ struct mlx5_dev_spawn_data {
 				list[ns].ifindex = mlx5_nl_ifindex
 					(nl_rdma, list[ns].ibv_dev->name, 1);
 			if (!list[ns].ifindex) {
+				char ifname[IF_NAMESIZE];
+
 				/*
-				 * No network interface index found for the
-				 * specified device, it means there it is not
-				 * a representor/master.
+				 * Netlink failed, it may happen with old
+				 * mlx5 kernel drivers. We can assume we have
+				 * old driver because here we are processing
+				 * single ports IB devices. Let's try sysfs
+				 * to retrieve the ifindex. The method works
+				 * for master device only.
 				 */
-				continue;
+				if (nd > 1) {
+					/*
+					 * Multiple devices found, assume
+					 * representors, can not distinguish
+					 * master/representor and retrieve
+					 * ifindex via sysfs.
+					 */
+					continue;
+				}
+				ret = mlx5_get_master_ifname
+					(ibv_match[i]->ibdev_path, &ifname);
+				if (!ret)
+					list[ns].ifindex =
+						if_nametoindex(ifname);
+				if (!list[ns].ifindex) {
+					/*
+					 * No network interface index found
+					 * for the specified device, it means
+					 * there it is neither representor
+					 * nor master.
+					 */
+					continue;
+				}
 			}
 			ret = -1;
 			if (nl_route >= 0)
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 4f6c1b7..6552691 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -327,6 +327,7 @@ struct mlx5_priv {
 /* 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 7273bd9..8a251aa 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -127,21 +127,18 @@ struct ethtool_link_settings {
  * @return
  *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
-static int
-mlx5_get_master_ifname(const struct rte_eth_dev *dev,
-		       char (*ifname)[IF_NAMESIZE])
+int
+mlx5_get_master_ifname(const char *ibdev_path, char (*ifname)[IF_NAMESIZE])
 {
-	struct mlx5_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] = "";
 
-	assert(priv);
-	assert(priv->sh);
+	assert(ibdev_path);
 	{
-		MKSTR(path, "%s/device/net", priv->sh->ibdev_path);
+		MKSTR(path, "%s/device/net", ibdev_path);
 
 		dir = opendir(path);
 		if (dir == NULL) {
@@ -161,7 +158,7 @@ struct ethtool_link_settings {
 			continue;
 
 		MKSTR(path, "%s/device/net/%s/%s",
-		      priv->sh->ibdev_path, name,
+		      ibdev_path, name,
 		      (dev_type ? "dev_id" : "dev_port"));
 
 		file = fopen(path, "rb");
@@ -222,15 +219,18 @@ struct ethtool_link_settings {
 mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
-	unsigned int ifindex =
-		priv->nl_socket_rdma >= 0 ?
-		mlx5_nl_ifindex(priv->nl_socket_rdma,
-				priv->sh->ibdev_name,
-				priv->ibv_port) : 0;
+	unsigned int ifindex;
 
+	assert(priv);
+	assert(priv->sh);
+	ifindex = priv->nl_socket_rdma >= 0 ?
+		  mlx5_nl_ifindex(priv->nl_socket_rdma,
+				  priv->sh->ibdev_name,
+				  priv->ibv_port) : 0;
 	if (!ifindex) {
 		if (!priv->representor)
-			return mlx5_get_master_ifname(dev, ifname);
+			return mlx5_get_master_ifname(priv->sh->ibdev_path,
+						      ifname);
 		rte_errno = ENXIO;
 		return -rte_errno;
 	}
-- 
1.8.3.1


             reply	other threads:[~2019-04-03 14:14 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-03 14:14 Viacheslav Ovsiienko [this message]
2019-04-03 14:14 ` Viacheslav Ovsiienko
2019-04-04 19:06 ` David Christensen
2019-04-04 19:06   ` David Christensen
2019-04-05  9:37   ` Slava Ovsiienko
2019-04-05  9:37     ` Slava Ovsiienko
2019-04-05 12:49     ` Slava Ovsiienko
2019-04-05 12:49       ` Slava Ovsiienko
2019-04-05 13:25 ` [dpdk-dev] [PATCH v2 " Viacheslav Ovsiienko
2019-04-05 13:25   ` Viacheslav Ovsiienko
2019-04-08  6:00   ` Shahaf Shuler
2019-04-08  6:00     ` Shahaf Shuler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1554300882-23990-1-git-send-email-viacheslavo@mellanox.com \
    --to=viacheslavo@mellanox.com \
    --cc=dev@dpdk.org \
    --cc=shahafs@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).