diff options
9 files changed, 26 insertions, 15 deletions
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c index 735dc805dad7..e735e19461ba 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c @@ -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); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h index 274004e80f03..8ef4254b9ea1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h @@ -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); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c index 1da3dc7c95fa..35d89edb1bcd 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c @@ -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; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c index 223c8741b7ae..16d65fe4f654 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c @@ -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); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c index e5f6412baea9..31d443dd8386 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c @@ -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; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h index 98320e3945ad..50b0dd4fb4a9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h @@ -1200,6 +1200,7 @@ struct mlx5dr_cmd_query_flow_table_details {  struct mlx5dr_cmd_create_flow_table_attr {  	u32 table_type; +	u16 uid;  	u64 icm_addr_rx;  	u64 icm_addr_tx;  	u8 level; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c index 6a9abba92df6..c30ed8e18458 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c @@ -62,7 +62,7 @@ static int set_miss_action(struct mlx5_flow_root_namespace *ns,  static int mlx5_cmd_dr_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)  {  	struct mlx5dr_table *tbl; @@ -71,7 +71,7 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,  	if (mlx5_dr_is_fw_table(ft->flags))  		return mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft, -								    size, +								    ft_attr,  								    next_ft);  	flags = ft->flags;  	/* turn off encap/decap if not supported for sw-str by fw */ @@ -79,7 +79,8 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,  		flags = ft->flags & ~(MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |  				      MLX5_FLOW_TABLE_TUNNEL_EN_DECAP); -	tbl = mlx5dr_table_create(ns->fs_dr_domain.dr_domain, ft->level, flags); +	tbl = mlx5dr_table_create(ns->fs_dr_domain.dr_domain, ft->level, flags, +				  ft_attr->uid);  	if (!tbl) {  		mlx5_core_err(ns->dev, "Failed creating dr flow_table\n");  		return -EINVAL; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h index 7626c85643b1..3bb14860b36d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h @@ -51,7 +51,8 @@ void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,  			    struct mlx5dr_domain *peer_dmn);  struct mlx5dr_table * -mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags); +mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags, +		    u16 uid);  struct mlx5dr_table *  mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft); diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h index eee07d416b56..8e73c377da2c 100644 --- a/include/linux/mlx5/fs.h +++ b/include/linux/mlx5/fs.h @@ -178,6 +178,7 @@ struct mlx5_flow_table_attr {  	int max_fte;  	u32 level;  	u32 flags; +	u16 uid;  	struct mlx5_flow_table *next_ft;  	struct { | 
