mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
RDMA/mlx5: Fix vport loopback forcing for MPV device
Previously loopback for MPV was supposed to be permanently enabled,
however other driver flows were able to over-ride that configuration and
disable it.
Add force_lb parameter that indicates that loopback should always be
enabled which prevents all other driver flows from disabling it.
Fixes: a9a9e68954 ("RDMA/mlx5: Fix vport loopback for MPV device")
Link: https://patch.msgid.link/r/cfc6b1f0f99f8100b087483cc14da6025317f901.1755088808.git.leon@kernel.org
Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
1a7c18c485
commit
08aae78604
|
|
@ -1839,7 +1839,8 @@ static void deallocate_uars(struct mlx5_ib_dev *dev,
|
|||
}
|
||||
|
||||
static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master,
|
||||
struct mlx5_core_dev *slave)
|
||||
struct mlx5_core_dev *slave,
|
||||
struct mlx5_ib_lb_state *lb_state)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
|
@ -1851,6 +1852,7 @@ static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master,
|
|||
if (err)
|
||||
goto out;
|
||||
|
||||
lb_state->force_enable = true;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
|
|
@ -1859,16 +1861,22 @@ static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master,
|
|||
}
|
||||
|
||||
static void mlx5_ib_disable_lb_mp(struct mlx5_core_dev *master,
|
||||
struct mlx5_core_dev *slave)
|
||||
struct mlx5_core_dev *slave,
|
||||
struct mlx5_ib_lb_state *lb_state)
|
||||
{
|
||||
mlx5_nic_vport_update_local_lb(slave, false);
|
||||
mlx5_nic_vport_update_local_lb(master, false);
|
||||
|
||||
lb_state->force_enable = false;
|
||||
}
|
||||
|
||||
int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (dev->lb.force_enable)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&dev->lb.mutex);
|
||||
if (td)
|
||||
dev->lb.user_td++;
|
||||
|
|
@ -1890,6 +1898,9 @@ int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
|
|||
|
||||
void mlx5_ib_disable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
|
||||
{
|
||||
if (dev->lb.force_enable)
|
||||
return;
|
||||
|
||||
mutex_lock(&dev->lb.mutex);
|
||||
if (td)
|
||||
dev->lb.user_td--;
|
||||
|
|
@ -3597,7 +3608,7 @@ 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_ib_disable_lb_mp(ibdev->mdev, mpi->mdev, &ibdev->lb);
|
||||
|
||||
mlx5_core_mp_event_replay(ibdev->mdev,
|
||||
MLX5_DRIVER_EVENT_AFFILIATION_REMOVED,
|
||||
|
|
@ -3694,7 +3705,7 @@ 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);
|
||||
err = mlx5_ib_enable_lb_mp(ibdev->mdev, mpi->mdev, &ibdev->lb);
|
||||
if (err)
|
||||
goto unbind;
|
||||
|
||||
|
|
|
|||
|
|
@ -1111,6 +1111,7 @@ struct mlx5_ib_lb_state {
|
|||
u32 user_td;
|
||||
int qps;
|
||||
bool enabled;
|
||||
bool force_enable;
|
||||
};
|
||||
|
||||
struct mlx5_ib_pf_eq {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user