[dpdk-dev] [PATCH 2/3] net/mlx4: adjust removal error

Matan Azrad matan at mellanox.com
Thu Nov 2 16:42:03 CET 2017


Fail-safe PMD expects to get -ENODEV error value if sub PMD control
command fails because of device removal.

Make control callbacks return with -ENODEV when the device has
disappeared.

Signed-off-by: Matan Azrad <matan at mellanox.com>
---
 drivers/net/mlx4/mlx4.h        |  1 +
 drivers/net/mlx4/mlx4_ethdev.c | 38 ++++++++++++++++++++++++++++++++++----
 drivers/net/mlx4/mlx4_flow.c   |  2 ++
 drivers/net/mlx4/mlx4_intr.c   |  5 ++++-
 drivers/net/mlx4/mlx4_rxq.c    |  1 +
 drivers/net/mlx4/mlx4_txq.c    |  1 +
 6 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index e0a9853..cac9654 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -149,6 +149,7 @@ int mlx4_flow_ctrl_get(struct rte_eth_dev *dev,
 		       struct rte_eth_fc_conf *fc_conf);
 int mlx4_flow_ctrl_set(struct rte_eth_dev *dev,
 		       struct rte_eth_fc_conf *fc_conf);
+int mlx4_removed(const struct priv *priv);
 
 /* mlx4_intr.c */
 
diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c
index b0acd12..76914b0 100644
--- a/drivers/net/mlx4/mlx4_ethdev.c
+++ b/drivers/net/mlx4/mlx4_ethdev.c
@@ -312,6 +312,8 @@
 
 	ret = mlx4_sysfs_write(priv, name, value_str, (sizeof(value_str) - 1));
 	if (ret < 0) {
+		if (mlx4_removed(priv))
+			ret = -ENODEV;
 		DEBUG("cannot write %s `%s' (%lu) to sysfs: %s",
 		      name, value_str, value, strerror(rte_errno));
 		return ret;
@@ -340,15 +342,19 @@
 
 	if (sock == -1) {
 		rte_errno = errno;
-		return -rte_errno;
+		goto error;
 	}
 	ret = mlx4_get_ifname(priv, &ifr->ifr_name);
 	if (!ret && ioctl(sock, req, ifr) == -1) {
 		rte_errno = errno;
-		ret = -rte_errno;
+		close(sock);
+		goto error;
 	}
 	close(sock);
 	return ret;
+error:
+	mlx4_removed(priv);
+	return -rte_errno;
 }
 
 /**
@@ -473,13 +479,17 @@
 	if (up) {
 		err = mlx4_set_flags(priv, ~IFF_UP, IFF_UP);
 		if (err)
-			return err;
+			goto error;
 	} else {
 		err = mlx4_set_flags(priv, ~IFF_UP, ~IFF_UP);
 		if (err)
-			return err;
+			goto error;
 	}
 	return 0;
+error:
+	if (mlx4_removed(priv))
+		return -ENODEV;
+	return err;
 }
 
 /**
@@ -947,6 +957,7 @@ enum rxmode_toggle {
 
 	ifr.ifr_data = (void *)ðpause;
 	if (mlx4_ifreq(priv, SIOCETHTOOL, &ifr)) {
+		mlx4_removed(priv);
 		ret = rte_errno;
 		WARN("ioctl(SIOCETHTOOL, ETHTOOL_GPAUSEPARAM)"
 		     " failed: %s",
@@ -1002,6 +1013,7 @@ enum rxmode_toggle {
 	else
 		ethpause.tx_pause = 0;
 	if (mlx4_ifreq(priv, SIOCETHTOOL, &ifr)) {
+		mlx4_removed(priv);
 		ret = rte_errno;
 		WARN("ioctl(SIOCETHTOOL, ETHTOOL_SPAUSEPARAM)"
 		     " failed: %s",
@@ -1013,3 +1025,21 @@ enum rxmode_toggle {
 	assert(ret >= 0);
 	return -ret;
 }
+/**
+ * Check if mlx4 device was removed.
+ *
+ * @param priv
+ *   Pointer to private structure.
+ *
+ * @return
+ *   -ENODEV when device is removed and rte_errno is set, otherwise 0.
+ */
+int
+mlx4_removed(const struct priv *priv)
+{
+	struct ibv_device_attr device_attr;
+
+	if (ibv_query_device(priv->ctx, &device_attr) == EIO)
+		return -(rte_errno = ENODEV);
+	return 0;
+}
diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c
index 8b87b29..606c888 100644
--- a/drivers/net/mlx4/mlx4_flow.c
+++ b/drivers/net/mlx4/mlx4_flow.c
@@ -1069,6 +1069,8 @@ struct mlx4_drop {
 	err = errno;
 	msg = "flow rule rejected by device";
 error:
+	if (mlx4_removed(priv))
+		err = ENODEV;
 	return rte_flow_error_set
 		(error, err, RTE_FLOW_ERROR_TYPE_HANDLE, flow, msg);
 }
diff --git a/drivers/net/mlx4/mlx4_intr.c b/drivers/net/mlx4/mlx4_intr.c
index b17d109..0ebdb28 100644
--- a/drivers/net/mlx4/mlx4_intr.c
+++ b/drivers/net/mlx4/mlx4_intr.c
@@ -359,7 +359,10 @@
 			ret = EINVAL;
 	}
 	if (ret) {
-		rte_errno = ret;
+		if (mlx4_removed(dev->data->dev_private))
+			ret = ENODEV;
+		else
+			rte_errno = ret;
 		WARN("unable to disable interrupt on rx queue %d",
 		     idx);
 	} else {
diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c
index 7fe21b6..43dad26 100644
--- a/drivers/net/mlx4/mlx4_rxq.c
+++ b/drivers/net/mlx4/mlx4_rxq.c
@@ -832,6 +832,7 @@ void mlx4_rss_detach(struct mlx4_rss *rss)
 	ret = rte_errno;
 	mlx4_rx_queue_release(rxq);
 	rte_errno = ret;
+	mlx4_removed(priv);
 	assert(rte_errno > 0);
 	return -rte_errno;
 }
diff --git a/drivers/net/mlx4/mlx4_txq.c b/drivers/net/mlx4/mlx4_txq.c
index a9c5bd2..09bdfd8 100644
--- a/drivers/net/mlx4/mlx4_txq.c
+++ b/drivers/net/mlx4/mlx4_txq.c
@@ -372,6 +372,7 @@ struct txq_mp2mr_mbuf_check_data {
 	ret = rte_errno;
 	mlx4_tx_queue_release(txq);
 	rte_errno = ret;
+	mlx4_removed(priv);
 	assert(rte_errno > 0);
 	return -rte_errno;
 }
-- 
1.8.3.1



More information about the dev mailing list