Commit 13a43765 authored by Mark Bloch's avatar Mark Bloch Committed by Jason Gunthorpe
Browse files

RDMA/mlx5: Access the prio bypass inside the FDB flow table namespace



Now that we have a specific prio inside the FDB namespace allow retrieving
it from the RDMA side.

Signed-off-by: default avatarMark Bloch <markb@mellanox.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 2e5b8a01
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -3809,11 +3809,16 @@ _get_flow_table(struct mlx5_ib_dev *dev,
		bool mcast)
{
	struct mlx5_flow_namespace *ns = NULL;
	struct mlx5_ib_flow_prio *prio;
	int max_table_size;
	struct mlx5_ib_flow_prio *prio = NULL;
	int max_table_size = 0;
	u32 flags = 0;
	int priority;

	if (mcast)
		priority = MLX5_IB_FLOW_MCAST_PRIO;
	else
		priority = ib_prio_to_core_prio(fs_matcher->priority, false);

	if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS) {
		max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
					log_max_ft_size));
@@ -3822,29 +3827,33 @@ _get_flow_table(struct mlx5_ib_dev *dev,
		if (MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
					      reformat_l3_tunnel_to_l2))
			flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
	} else { /* Can only be MLX5_FLOW_NAMESPACE_EGRESS */
		max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev,
					log_max_ft_size));
	} else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS) {
		max_table_size = BIT(
			MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, log_max_ft_size));
		if (MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, reformat))
			flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
	} else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB) {
		max_table_size = BIT(
			MLX5_CAP_ESW_FLOWTABLE_FDB(dev->mdev, log_max_ft_size));
		priority = FDB_BYPASS_PATH;
	}

	if (max_table_size < MLX5_FS_MAX_ENTRIES)
		return ERR_PTR(-ENOMEM);

	if (mcast)
		priority = MLX5_IB_FLOW_MCAST_PRIO;
	else
		priority = ib_prio_to_core_prio(fs_matcher->priority, false);

	ns = mlx5_get_flow_namespace(dev->mdev, fs_matcher->ns_type);
	if (!ns)
		return ERR_PTR(-ENOTSUPP);

	if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS)
		prio = &dev->flow_db->prios[priority];
	else
	else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS)
		prio = &dev->flow_db->egress_prios[priority];
	else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB)
		prio = &dev->flow_db->fdb;

	if (!prio)
		return ERR_PTR(-EINVAL);

	if (prio->flow_table)
		return prio;
+1 −0
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ struct mlx5_ib_flow_db {
	struct mlx5_ib_flow_prio	egress_prios[MLX5_IB_NUM_FLOW_FT];
	struct mlx5_ib_flow_prio	sniffer[MLX5_IB_NUM_SNIFFER_FTS];
	struct mlx5_ib_flow_prio	egress[MLX5_IB_NUM_EGRESS_FTS];
	struct mlx5_ib_flow_prio	fdb;
	struct mlx5_flow_table		*lag_demux_ft;
	/* Protect flow steering bypass flow tables
	 * when add/del flow rules.