Commit b0bb369e authored by Mark Bloch's avatar Mark Bloch Committed by Saeed Mahameed
Browse files

net/mlx5: fs, allow flow table creation with a UID



Add UID field to flow table attributes to allow creating flow tables
with a non default (zero) uid.

Signed-off-by: default avatarMark Bloch <mbloch@nvidia.com>
Reviewed-by: default avatarAlex Vesker <valex@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 6c27c56c
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -50,10 +50,12 @@ static int mlx5_cmd_stub_update_root_ft(struct mlx5_flow_root_namespace *ns,

static int mlx5_cmd_stub_create_flow_table(struct mlx5_flow_root_namespace *ns,
					   struct mlx5_flow_table *ft,
					   unsigned int size,
					   struct mlx5_flow_table_attr *ft_attr,
					   struct mlx5_flow_table *next_ft)
{
	ft->max_fte = size ? roundup_pow_of_two(size) : 1;
	int max_fte = ft_attr->max_fte;

	ft->max_fte = max_fte ? roundup_pow_of_two(max_fte) : 1;

	return 0;
}
@@ -258,7 +260,7 @@ static int mlx5_cmd_update_root_ft(struct mlx5_flow_root_namespace *ns,

static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
				      struct mlx5_flow_table *ft,
				      unsigned int size,
				      struct mlx5_flow_table_attr *ft_attr,
				      struct mlx5_flow_table *next_ft)
{
	int en_encap = !!(ft->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
@@ -267,17 +269,19 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
	u32 out[MLX5_ST_SZ_DW(create_flow_table_out)] = {};
	u32 in[MLX5_ST_SZ_DW(create_flow_table_in)] = {};
	struct mlx5_core_dev *dev = ns->dev;
	unsigned int size;
	int err;

	if (size != POOL_NEXT_SIZE)
		size = roundup_pow_of_two(size);
	size = mlx5_ft_pool_get_avail_sz(dev, ft->type, size);
	if (ft_attr->max_fte != POOL_NEXT_SIZE)
		size = roundup_pow_of_two(ft_attr->max_fte);
	size = mlx5_ft_pool_get_avail_sz(dev, ft->type, ft_attr->max_fte);
	if (!size)
		return -ENOSPC;

	MLX5_SET(create_flow_table_in, in, opcode,
		 MLX5_CMD_OP_CREATE_FLOW_TABLE);

	MLX5_SET(create_flow_table_in, in, uid, ft_attr->uid);
	MLX5_SET(create_flow_table_in, in, table_type, ft->type);
	MLX5_SET(create_flow_table_in, in, flow_table_context.level, ft->level);
	MLX5_SET(create_flow_table_in, in, flow_table_context.log_size, size ? ilog2(size) : 0);
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@
struct mlx5_flow_cmds {
	int (*create_flow_table)(struct mlx5_flow_root_namespace *ns,
				 struct mlx5_flow_table *ft,
				 unsigned int size,
				 struct mlx5_flow_table_attr *ft_attr,
				 struct mlx5_flow_table *next_ft);
	int (*destroy_flow_table)(struct mlx5_flow_root_namespace *ns,
				  struct mlx5_flow_table *ft);
+1 −1
Original line number Diff line number Diff line
@@ -1155,7 +1155,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
			      find_next_chained_ft(fs_prio);
	ft->def_miss_action = ns->def_miss_action;
	ft->ns = ns;
	err = root->cmds->create_flow_table(root, ft, ft_attr->max_fte, next_ft);
	err = root->cmds->create_flow_table(root, ft, ft_attr, next_ft);
	if (err)
		goto free_ft;

+1 −0
Original line number Diff line number Diff line
@@ -439,6 +439,7 @@ int mlx5dr_cmd_create_flow_table(struct mlx5_core_dev *mdev,

	MLX5_SET(create_flow_table_in, in, opcode, MLX5_CMD_OP_CREATE_FLOW_TABLE);
	MLX5_SET(create_flow_table_in, in, table_type, attr->table_type);
	MLX5_SET(create_flow_table_in, in, uid, attr->uid);

	ft_mdev = MLX5_ADDR_OF(create_flow_table_in, in, flow_table_context);
	MLX5_SET(flow_table_context, ft_mdev, termination_table, attr->term_tbl);
+5 −3
Original line number Diff line number Diff line
@@ -214,7 +214,7 @@ static int dr_table_destroy_sw_owned_tbl(struct mlx5dr_table *tbl)
					     tbl->table_type);
}

static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl, u16 uid)
{
	bool en_encap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
	bool en_decap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
@@ -236,6 +236,7 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
	ft_attr.sw_owner = true;
	ft_attr.decap_en = en_decap;
	ft_attr.reformat_en = en_encap;
	ft_attr.uid = uid;

	ret = mlx5dr_cmd_create_flow_table(tbl->dmn->mdev, &ft_attr,
					   NULL, &tbl->table_id);
@@ -243,7 +244,8 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
	return ret;
}

struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u32 flags)
struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level,
					 u32 flags, u16 uid)
{
	struct mlx5dr_table *tbl;
	int ret;
@@ -263,7 +265,7 @@ struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u
	if (ret)
		goto free_tbl;

	ret = dr_table_create_sw_owned_tbl(tbl);
	ret = dr_table_create_sw_owned_tbl(tbl, uid);
	if (ret)
		goto uninit_tbl;

Loading