[v3] net/mlx5: fix wrong representor port link status
Checks
Commit Message
Current code uses PF links status for representor port, not the
representor
interface itself. This caused wrong representor port link status when
toggling linterface up or down.
Fixes: 2b7302638898 ("net/mlx5: probe all port representors")
Cc: adrien.mazarguil@6wind.com
Signed-off-by: Xueming Li <xuemingl@mellanox.com>
---
drivers/net/mlx5/mlx5_ethdev.c | 36 ++++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 14 deletions(-)
Comments
> On Sep 19, 2018, at 1:27 AM, Xueming Li <xuemingl@mellanox.com> wrote:
>
> Current code uses PF links status for representor port, not the
> representor
> interface itself. This caused wrong representor port link status when
> toggling linterface up or down.
>
> Fixes: 2b7302638898 ("net/mlx5: probe all port representors")
> Cc: adrien.mazarguil@6wind.com
>
> Signed-off-by: Xueming Li <xuemingl@mellanox.com>
> ---
Acked-by: Yongseok Koh <yskoh@mellanox.com>
Thanks
> drivers/net/mlx5/mlx5_ethdev.c | 36 ++++++++++++++++++++++--------------
> 1 file changed, 22 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index 34c5b95..5515fdb 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -627,16 +627,19 @@ struct ethtool_link_settings {
> int link_speed = 0;
> int ret;
>
> - ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 1);
> + ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 0);
> if (ret) {
> DRV_LOG(WARNING, "port %u ioctl(SIOCGIFFLAGS) failed: %s",
> dev->data->port_id, strerror(rte_errno));
> return ret;
> }
> - memset(&dev_link, 0, sizeof(dev_link));
> - dev_link.link_status = ((ifr.ifr_flags & IFF_UP) &&
> - (ifr.ifr_flags & IFF_RUNNING));
> - ifr.ifr_data = (void *)&edata;
> + dev_link = (struct rte_eth_link) {
> + .link_status = ((ifr.ifr_flags & IFF_UP) &&
> + (ifr.ifr_flags & IFF_RUNNING)),
> + };
> + ifr = (struct ifreq) {
> + .ifr_data = (void *)&edata,
> + };
> ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
> if (ret) {
> DRV_LOG(WARNING,
> @@ -666,8 +669,9 @@ struct ethtool_link_settings {
> ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX);
> dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds &
> ETH_LINK_SPEED_FIXED);
> - if ((dev_link.link_speed && !dev_link.link_status) ||
> - (!dev_link.link_speed && dev_link.link_status)) {
> + if (!priv->representor &&
> + ((dev_link.link_speed && !dev_link.link_status) ||
> + (!dev_link.link_speed && dev_link.link_status))) {
> rte_errno = EAGAIN;
> return -rte_errno;
> }
> @@ -698,16 +702,19 @@ struct ethtool_link_settings {
> uint64_t sc;
> int ret;
>
> - ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 1);
> + ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 0);
> if (ret) {
> DRV_LOG(WARNING, "port %u ioctl(SIOCGIFFLAGS) failed: %s",
> dev->data->port_id, strerror(rte_errno));
> return ret;
> }
> - memset(&dev_link, 0, sizeof(dev_link));
> - dev_link.link_status = ((ifr.ifr_flags & IFF_UP) &&
> - (ifr.ifr_flags & IFF_RUNNING));
> - ifr.ifr_data = (void *)&gcmd;
> + dev_link = (struct rte_eth_link) {
> + .link_status = ((ifr.ifr_flags & IFF_UP) &&
> + (ifr.ifr_flags & IFF_RUNNING)),
> + };
> + ifr = (struct ifreq) {
> + .ifr_data = (void *)&gcmd,
> + };
> ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
> if (ret) {
> DRV_LOG(DEBUG,
> @@ -775,8 +782,9 @@ struct ethtool_link_settings {
> ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX);
> dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds &
> ETH_LINK_SPEED_FIXED);
> - if ((dev_link.link_speed && !dev_link.link_status) ||
> - (!dev_link.link_speed && dev_link.link_status)) {
> + if (!priv->representor &&
> + ((dev_link.link_speed && !dev_link.link_status) ||
> + (!dev_link.link_speed && dev_link.link_status))) {
> rte_errno = EAGAIN;
> return -rte_errno;
> }
> --
> 1.8.3.1
>
28/09/2018 02:13, Yongseok Koh:
>
> > On Sep 19, 2018, at 1:27 AM, Xueming Li <xuemingl@mellanox.com> wrote:
> >
> > Current code uses PF links status for representor port, not the
> > representor
> > interface itself. This caused wrong representor port link status when
> > toggling linterface up or down.
> >
> > Fixes: 2b7302638898 ("net/mlx5: probe all port representors")
> > Cc: adrien.mazarguil@6wind.com
> >
> > Signed-off-by: Xueming Li <xuemingl@mellanox.com>
> > ---
> Acked-by: Yongseok Koh <yskoh@mellanox.com>
applied to dpdk-next-net-mlx
@@ -627,16 +627,19 @@ struct ethtool_link_settings {
int link_speed = 0;
int ret;
- ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 1);
+ ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 0);
if (ret) {
DRV_LOG(WARNING, "port %u ioctl(SIOCGIFFLAGS) failed: %s",
dev->data->port_id, strerror(rte_errno));
return ret;
}
- memset(&dev_link, 0, sizeof(dev_link));
- dev_link.link_status = ((ifr.ifr_flags & IFF_UP) &&
- (ifr.ifr_flags & IFF_RUNNING));
- ifr.ifr_data = (void *)&edata;
+ dev_link = (struct rte_eth_link) {
+ .link_status = ((ifr.ifr_flags & IFF_UP) &&
+ (ifr.ifr_flags & IFF_RUNNING)),
+ };
+ ifr = (struct ifreq) {
+ .ifr_data = (void *)&edata,
+ };
ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
if (ret) {
DRV_LOG(WARNING,
@@ -666,8 +669,9 @@ struct ethtool_link_settings {
ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX);
dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds &
ETH_LINK_SPEED_FIXED);
- if ((dev_link.link_speed && !dev_link.link_status) ||
- (!dev_link.link_speed && dev_link.link_status)) {
+ if (!priv->representor &&
+ ((dev_link.link_speed && !dev_link.link_status) ||
+ (!dev_link.link_speed && dev_link.link_status))) {
rte_errno = EAGAIN;
return -rte_errno;
}
@@ -698,16 +702,19 @@ struct ethtool_link_settings {
uint64_t sc;
int ret;
- ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 1);
+ ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 0);
if (ret) {
DRV_LOG(WARNING, "port %u ioctl(SIOCGIFFLAGS) failed: %s",
dev->data->port_id, strerror(rte_errno));
return ret;
}
- memset(&dev_link, 0, sizeof(dev_link));
- dev_link.link_status = ((ifr.ifr_flags & IFF_UP) &&
- (ifr.ifr_flags & IFF_RUNNING));
- ifr.ifr_data = (void *)&gcmd;
+ dev_link = (struct rte_eth_link) {
+ .link_status = ((ifr.ifr_flags & IFF_UP) &&
+ (ifr.ifr_flags & IFF_RUNNING)),
+ };
+ ifr = (struct ifreq) {
+ .ifr_data = (void *)&gcmd,
+ };
ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
if (ret) {
DRV_LOG(DEBUG,
@@ -775,8 +782,9 @@ struct ethtool_link_settings {
ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX);
dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds &
ETH_LINK_SPEED_FIXED);
- if ((dev_link.link_speed && !dev_link.link_status) ||
- (!dev_link.link_speed && dev_link.link_status)) {
+ if (!priv->representor &&
+ ((dev_link.link_speed && !dev_link.link_status) ||
+ (!dev_link.link_speed && dev_link.link_status))) {
rte_errno = EAGAIN;
return -rte_errno;
}