Skip to content

Commit 2c3b266

Browse files
prathameshdeshpande7gregkh
authored andcommitted
IB/mlx5: Fix transport-domain rollback and initialize lb mutex earlier
[ Upstream commit e793891 ] mlx5_ib_alloc_transport_domain() allocates a transport domain and then may fail in mlx5_ib_enable_lb(). In that case, the allocated TD is leaked. Fix this by deallocating the TD when mlx5_ib_enable_lb() returns an error. Also return 0 explicitly in the no-loopback-capability success branch, and move dev->lb.mutex initialization to mlx5_ib_stage_init_init(). Fixes: 146d2f1 ("IB/mlx5: Allocate a Transport Domain for each ucontext") Signed-off-by: Prathamesh Deshpande <prathameshdeshpande7@gmail.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 8ed0ce9 commit 2c3b266

1 file changed

Lines changed: 8 additions & 7 deletions

File tree

  • drivers/infiniband/hw/mlx5

drivers/infiniband/hw/mlx5/main.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1785,9 +1785,13 @@ static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn,
17851785
if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) ||
17861786
(!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) &&
17871787
!MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
1788-
return err;
1788+
return 0;
1789+
1790+
err = mlx5_ib_enable_lb(dev, true, false);
1791+
if (err)
1792+
mlx5_cmd_dealloc_transport_domain(dev->mdev, *tdn, uid);
17891793

1790-
return mlx5_ib_enable_lb(dev, true, false);
1794+
return err;
17911795
}
17921796

17931797
static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn,
@@ -3791,6 +3795,8 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
37913795
dev->port[i].roce.last_port_state = IB_PORT_DOWN;
37923796
}
37933797

3798+
mutex_init(&dev->lb.mutex);
3799+
37943800
err = mlx5r_cmd_query_special_mkeys(dev);
37953801
if (err)
37963802
return err;
@@ -4006,11 +4012,6 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
40064012
if (err)
40074013
return err;
40084014

4009-
if ((MLX5_CAP_GEN(dev->mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) &&
4010-
(MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) ||
4011-
MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
4012-
mutex_init(&dev->lb.mutex);
4013-
40144015
if (MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
40154016
MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q) {
40164017
err = mlx5_ib_init_var_table(dev);

0 commit comments

Comments
 (0)