* [PATCH v1] net/mlx5: support multi-host lag probe
@ 2025-03-11 8:31 Rongwei Liu
0 siblings, 0 replies; only message in thread
From: Rongwei Liu @ 2025-03-11 8:31 UTC (permalink / raw)
To: dev, matan, viacheslavo, orika, suanmingm, thomas
Cc: Dariusz Sosnowski, Bing Zhao
Under multi-host environments, the NIC exports total 4 ports,
and each host get 2 ports. The 2 ports' identifier is uncontinous
now. It causes the lag port array access violation.
Increase the lag port array and allow the hole in middle.
Signed-off-by: Rongwei Liu <rongweil@nvidia.com>
Acked-by: Dariusz Sosnowski <dsosnowski@nvidia.com>
---
drivers/net/mlx5/linux/mlx5_ethdev_os.c | 60 +++++++++++++++----------
drivers/net/mlx5/mlx5.h | 2 +-
2 files changed, 38 insertions(+), 24 deletions(-)
diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
index e192f698d8..9daeda5435 100644
--- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c
+++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
@@ -644,9 +644,9 @@ mlx5_dev_nl_ifindex_verify(uint32_t if_index, struct mlx5_priv *priv)
if (if_index == bond->ifindex)
return true;
- for (i = 0; i < bond->n_port; i++) {
- if (i >= MLX5_BOND_MAX_PORTS)
- return false;
+ for (i = 0; i < MLX5_BOND_MAX_PORTS; i++) {
+ if (!strlen(priv->sh->bond.ports[i].ifname))
+ continue;
if (if_index == bond->ports[i].ifindex)
return true;
}
@@ -1399,7 +1399,9 @@ mlx5_os_read_dev_counters(struct rte_eth_dev *dev, bool bond_master, uint64_t *s
/* Read ifreq counters. */
if (bond_master) {
/* Sum xstats from bonding device member ports. */
- for (i = 0; i < priv->sh->bond.n_port; i++) {
+ for (i = 0; i < MLX5_BOND_MAX_PORTS; i++) {
+ if (!strlen(priv->sh->bond.ports[i].ifname))
+ continue;
ret = _mlx5_os_read_dev_counters(dev, i, stats);
if (ret)
return ret;
@@ -1449,28 +1451,26 @@ mlx5_os_get_stats_n(struct rte_eth_dev *dev, bool bond_master,
struct mlx5_priv *priv = dev->data->dev_private;
struct ethtool_drvinfo drvinfo;
struct ifreq ifr;
- int ret;
+ int ret, i, j;
+ uint16_t *target;
drvinfo.cmd = ETHTOOL_GDRVINFO;
ifr.ifr_data = (caddr_t)&drvinfo;
/* Bonding PFs. */
if (bond_master) {
- ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[0].ifname,
- SIOCETHTOOL, &ifr);
- if (ret) {
- DRV_LOG(WARNING, "bonding port %u unable to query number of"
- " statistics for the 1st slave, %d", PORT_ID(priv), ret);
- return ret;
- }
- *n_stats = drvinfo.n_stats;
- ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[1].ifname,
- SIOCETHTOOL, &ifr);
- if (ret) {
- DRV_LOG(WARNING, "bonding port %u unable to query number of"
- " statistics for the 2nd slave, %d", PORT_ID(priv), ret);
- return ret;
+ for (i = 0, j = 0; i < MLX5_BOND_MAX_PORTS; i++) {
+ if (!strlen(priv->sh->bond.ports[i].ifname))
+ continue;
+ ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[i].ifname,
+ SIOCETHTOOL, &ifr);
+ if (ret) {
+ DRV_LOG(WARNING, "bonding port %u unable to query number of statistics for the %d lag member, %d",
+ PORT_ID(priv), j, ret);
+ return ret;
+ }
+ target = !j++ ? n_stats : n_stats_sec;
+ *target = drvinfo.n_stats;
}
- *n_stats_sec = drvinfo.n_stats;
} else {
ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
if (ret) {
@@ -1726,7 +1726,7 @@ mlx5_os_get_stats_strings(struct rte_eth_dev *dev, bool bond_master,
struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
struct ifreq ifr;
int ret;
- uint32_t i, j, idx;
+ uint32_t dev_idx, i, j, idx;
/* Ensure no out of bounds access before. */
MLX5_ASSERT(xstats_n <= MLX5_MAX_XSTATS);
@@ -1734,8 +1734,15 @@ mlx5_os_get_stats_strings(struct rte_eth_dev *dev, bool bond_master,
strings->string_set = ETH_SS_STATS;
strings->len = stats_n;
ifr.ifr_data = (caddr_t)strings;
+ for (dev_idx = 0; dev_idx < MLX5_BOND_MAX_PORTS; dev_idx++)
+ if (strlen(priv->sh->bond.ports[dev_idx].ifname))
+ break;
+ if (bond_master && dev_idx >= MLX5_BOND_MAX_PORTS) {
+ DRV_LOG(WARNING, "port %u unable to get the primary lag member", PORT_ID(priv));
+ return -ENODEV;
+ }
if (bond_master)
- ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[0].ifname,
+ ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[dev_idx].ifname,
SIOCETHTOOL, &ifr);
else
ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
@@ -1772,8 +1779,15 @@ mlx5_os_get_stats_strings(struct rte_eth_dev *dev, bool bond_master,
return 0;
}
+ for (++dev_idx; dev_idx < MLX5_BOND_MAX_PORTS; dev_idx++)
+ if (strlen(priv->sh->bond.ports[dev_idx].ifname))
+ break;
+ if (dev_idx >= MLX5_BOND_MAX_PORTS) {
+ DRV_LOG(WARNING, "port %u unable to get the secondary lag member", PORT_ID(priv));
+ return -ENODEV;
+ }
strings->len = stats_n_2nd;
- ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[1].ifname,
+ ret = mlx5_ifreq_by_ifname(priv->sh->bond.ports[dev_idx].ifname,
SIOCETHTOOL, &ifr);
if (ret) {
DRV_LOG(WARNING, "port %u unable to get statistic names for 2nd slave with %d",
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 545ba48b3c..6264595d8c 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1322,7 +1322,7 @@ struct mlx5_ecpri_parser_profile {
};
/* Max member ports per bonding device. */
-#define MLX5_BOND_MAX_PORTS 2
+#define MLX5_BOND_MAX_PORTS 4
/* Bonding device information. */
struct mlx5_bond_info {
--
2.27.0
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-03-11 8:32 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-11 8:31 [PATCH v1] net/mlx5: support multi-host lag probe Rongwei Liu
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).