Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a560f1d9 authored by Mark Bloch's avatar Mark Bloch Committed by Doug Ledford
Browse files

RDMA/mlx5: Refactor transport domain bookkeeping logic



In preparation to enable loopback on a single user context move the logic
that enables/disables loopback to separate functions and group variables
under a single struct.

Signed-off-by: default avatarMark Bloch <markb@mellanox.com>
Reviewed-by: default avatarYishai Hadas <yishaih@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 5d773ff4
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -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;
}
+7 −3
Original line number Diff line number Diff line
@@ -858,6 +858,12 @@ to_mcounters(struct ib_counters *ibcntrs)
	return container_of(ibcntrs, struct mlx5_ib_mcounters, ibcntrs);
}

struct mlx5_ib_lb_state {
	/* protect the user_td */
	struct mutex		mutex;
	u32			user_td;
};

struct mlx5_ib_dev {
	struct ib_device		ib_dev;
	const struct uverbs_object_tree_def *driver_trees[6];
@@ -899,9 +905,7 @@ struct mlx5_ib_dev {
	const struct mlx5_ib_profile	*profile;
	struct mlx5_eswitch_rep		*rep;

	/* protect the user_td */
	struct mutex		lb_mutex;
	u32			user_td;
	struct mlx5_ib_lb_state		lb;
	u8			umr_fence;
	struct list_head	ib_dev_list;
	u64			sys_image_guid;