Skip to content

Commit a9a9e68

Browse files
PatrisiousHaddadrleon
authored andcommitted
RDMA/mlx5: Fix vport loopback for MPV device
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: 0042f9e ("RDMA/mlx5: Enable vport loopback when user context or QP mandate") Signed-off-by: Patrisious Haddad <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Link: https://patch.msgid.link/d4298f5ebb2197459e9e7221c51ecd6a34699847.1750064969.git.leon@kernel.org Signed-off-by: Leon Romanovsky <[email protected]>
1 parent acd245b commit a9a9e68

File tree

1 file changed

+33
-0
lines changed
  • drivers/infiniband/hw/mlx5

1 file changed

+33
-0
lines changed

drivers/infiniband/hw/mlx5/main.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,6 +1791,33 @@ static void deallocate_uars(struct mlx5_ib_dev *dev,
17911791
context->devx_uid);
17921792
}
17931793

1794+
static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master,
1795+
struct mlx5_core_dev *slave)
1796+
{
1797+
int err;
1798+
1799+
err = mlx5_nic_vport_update_local_lb(master, true);
1800+
if (err)
1801+
return err;
1802+
1803+
err = mlx5_nic_vport_update_local_lb(slave, true);
1804+
if (err)
1805+
goto out;
1806+
1807+
return 0;
1808+
1809+
out:
1810+
mlx5_nic_vport_update_local_lb(master, false);
1811+
return err;
1812+
}
1813+
1814+
static void mlx5_ib_disable_lb_mp(struct mlx5_core_dev *master,
1815+
struct mlx5_core_dev *slave)
1816+
{
1817+
mlx5_nic_vport_update_local_lb(slave, false);
1818+
mlx5_nic_vport_update_local_lb(master, false);
1819+
}
1820+
17941821
int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
17951822
{
17961823
int err = 0;
@@ -3495,6 +3522,8 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
34953522

34963523
lockdep_assert_held(&mlx5_ib_multiport_mutex);
34973524

3525+
mlx5_ib_disable_lb_mp(ibdev->mdev, mpi->mdev);
3526+
34983527
mlx5_core_mp_event_replay(ibdev->mdev,
34993528
MLX5_DRIVER_EVENT_AFFILIATION_REMOVED,
35003529
NULL);
@@ -3590,6 +3619,10 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
35903619
MLX5_DRIVER_EVENT_AFFILIATION_DONE,
35913620
&key);
35923621

3622+
err = mlx5_ib_enable_lb_mp(ibdev->mdev, mpi->mdev);
3623+
if (err)
3624+
goto unbind;
3625+
35933626
return true;
35943627

35953628
unbind:

0 commit comments

Comments
 (0)