RDMA/mlx5: Fix vport loopback for MPV device
authorPatrisious Haddad <phaddad@nvidia.com>
Mon, 16 Jun 2025 09:14:54 +0000 (12:14 +0300)
committerLeon Romanovsky <leon@kernel.org>
Wed, 25 Jun 2025 07:41:59 +0000 (03:41 -0400)
Always enable vport loopback for both MPV devices on driver start.

Previously in some cases related to MPV RoCE, packets weren't correctly
executing loopback check at vport in FW, since it was disabled.
Due to complexity of identifying such cases for MPV always enable vport
loopback for both GVMIs when binding the slave to the master port.

Fixes: 0042f9e458a5 ("RDMA/mlx5: Enable vport loopback when user context or QP mandate")
Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/d4298f5ebb2197459e9e7221c51ecd6a34699847.1750064969.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/mlx5/main.c

index ce7610740412a41a9f5090928c613cd796db81f9..df6557ddbdfc5ce5f085b8b8b22dacb372538cd3 100644 (file)
@@ -1791,6 +1791,33 @@ static void deallocate_uars(struct mlx5_ib_dev *dev,
                                             context->devx_uid);
 }
 
+static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master,
+                               struct mlx5_core_dev *slave)
+{
+       int err;
+
+       err = mlx5_nic_vport_update_local_lb(master, true);
+       if (err)
+               return err;
+
+       err = mlx5_nic_vport_update_local_lb(slave, true);
+       if (err)
+               goto out;
+
+       return 0;
+
+out:
+       mlx5_nic_vport_update_local_lb(master, false);
+       return err;
+}
+
+static void mlx5_ib_disable_lb_mp(struct mlx5_core_dev *master,
+                                 struct mlx5_core_dev *slave)
+{
+       mlx5_nic_vport_update_local_lb(slave, false);
+       mlx5_nic_vport_update_local_lb(master, false);
+}
+
 int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
 {
        int err = 0;
@@ -3495,6 +3522,8 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
 
        lockdep_assert_held(&mlx5_ib_multiport_mutex);
 
+       mlx5_ib_disable_lb_mp(ibdev->mdev, mpi->mdev);
+
        mlx5_core_mp_event_replay(ibdev->mdev,
                                  MLX5_DRIVER_EVENT_AFFILIATION_REMOVED,
                                  NULL);
@@ -3590,6 +3619,10 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
                                  MLX5_DRIVER_EVENT_AFFILIATION_DONE,
                                  &key);
 
+       err = mlx5_ib_enable_lb_mp(ibdev->mdev, mpi->mdev);
+       if (err)
+               goto unbind;
+
        return true;
 
 unbind: