|
@@ -1571,6 +1571,32 @@ static void deallocate_uars(struct mlx5_ib_dev *dev,
|
|
|
mlx5_cmd_free_uar(dev->mdev, bfregi->sys_pages[i]);
|
|
|
}
|
|
|
|
|
|
+static int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev)
|
|
|
+{
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+ mutex_lock(&dev->lb.mutex);
|
|
|
+ dev->lb.user_td++;
|
|
|
+
|
|
|
+ if (dev->lb.user_td == 2)
|
|
|
+ err = mlx5_nic_vport_update_local_lb(dev->mdev, true);
|
|
|
+
|
|
|
+ mutex_unlock(&dev->lb.mutex);
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+static void mlx5_ib_disable_lb(struct mlx5_ib_dev *dev)
|
|
|
+{
|
|
|
+ mutex_lock(&dev->lb.mutex);
|
|
|
+ dev->lb.user_td--;
|
|
|
+
|
|
|
+ if (dev->lb.user_td < 2)
|
|
|
+ mlx5_nic_vport_update_local_lb(dev->mdev, false);
|
|
|
+
|
|
|
+ mutex_unlock(&dev->lb.mutex);
|
|
|
+}
|
|
|
+
|
|
|
static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn)
|
|
|
{
|
|
|
int err;
|
|
@@ -1587,14 +1613,7 @@ static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn)
|
|
|
!MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
|
|
|
return err;
|
|
|
|
|
|
- mutex_lock(&dev->lb_mutex);
|
|
|
- dev->user_td++;
|
|
|
-
|
|
|
- if (dev->user_td == 2)
|
|
|
- err = mlx5_nic_vport_update_local_lb(dev->mdev, true);
|
|
|
-
|
|
|
- mutex_unlock(&dev->lb_mutex);
|
|
|
- return err;
|
|
|
+ return mlx5_ib_enable_lb(dev);
|
|
|
}
|
|
|
|
|
|
static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn)
|
|
@@ -1609,13 +1628,7 @@ static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn)
|
|
|
!MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
|
|
|
return;
|
|
|
|
|
|
- mutex_lock(&dev->lb_mutex);
|
|
|
- dev->user_td--;
|
|
|
-
|
|
|
- if (dev->user_td < 2)
|
|
|
- mlx5_nic_vport_update_local_lb(dev->mdev, false);
|
|
|
-
|
|
|
- mutex_unlock(&dev->lb_mutex);
|
|
|
+ mlx5_ib_disable_lb(dev);
|
|
|
}
|
|
|
|
|
|
static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|
@@ -5880,7 +5893,7 @@ int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
|
|
|
if ((MLX5_CAP_GEN(dev->mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) &&
|
|
|
(MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) ||
|
|
|
MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
|
|
|
- mutex_init(&dev->lb_mutex);
|
|
|
+ mutex_init(&dev->lb.mutex);
|
|
|
|
|
|
return 0;
|
|
|
}
|