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

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
...@@ -50,10 +50,12 @@ static int mlx5_cmd_stub_update_root_ft(struct mlx5_flow_root_namespace *ns, ...@@ -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, static int mlx5_cmd_stub_create_flow_table(struct mlx5_flow_root_namespace *ns,
struct mlx5_flow_table *ft, struct mlx5_flow_table *ft,
unsigned int size, struct mlx5_flow_table_attr *ft_attr,
struct mlx5_flow_table *next_ft) 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; return 0;
} }
...@@ -258,7 +260,7 @@ static int mlx5_cmd_update_root_ft(struct mlx5_flow_root_namespace *ns, ...@@ -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, static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
struct mlx5_flow_table *ft, struct mlx5_flow_table *ft,
unsigned int size, struct mlx5_flow_table_attr *ft_attr,
struct mlx5_flow_table *next_ft) struct mlx5_flow_table *next_ft)
{ {
int en_encap = !!(ft->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT); 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, ...@@ -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 out[MLX5_ST_SZ_DW(create_flow_table_out)] = {};
u32 in[MLX5_ST_SZ_DW(create_flow_table_in)] = {}; u32 in[MLX5_ST_SZ_DW(create_flow_table_in)] = {};
struct mlx5_core_dev *dev = ns->dev; struct mlx5_core_dev *dev = ns->dev;
unsigned int size;
int err; int err;
if (size != POOL_NEXT_SIZE) if (ft_attr->max_fte != POOL_NEXT_SIZE)
size = roundup_pow_of_two(size); size = roundup_pow_of_two(ft_attr->max_fte);
size = mlx5_ft_pool_get_avail_sz(dev, ft->type, size); size = mlx5_ft_pool_get_avail_sz(dev, ft->type, ft_attr->max_fte);
if (!size) if (!size)
return -ENOSPC; return -ENOSPC;
MLX5_SET(create_flow_table_in, in, opcode, MLX5_SET(create_flow_table_in, in, opcode,
MLX5_CMD_OP_CREATE_FLOW_TABLE); 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, 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.level, ft->level);
MLX5_SET(create_flow_table_in, in, flow_table_context.log_size, size ? ilog2(size) : 0); MLX5_SET(create_flow_table_in, in, flow_table_context.log_size, size ? ilog2(size) : 0);
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
struct mlx5_flow_cmds { struct mlx5_flow_cmds {
int (*create_flow_table)(struct mlx5_flow_root_namespace *ns, int (*create_flow_table)(struct mlx5_flow_root_namespace *ns,
struct mlx5_flow_table *ft, struct mlx5_flow_table *ft,
unsigned int size, struct mlx5_flow_table_attr *ft_attr,
struct mlx5_flow_table *next_ft); struct mlx5_flow_table *next_ft);
int (*destroy_flow_table)(struct mlx5_flow_root_namespace *ns, int (*destroy_flow_table)(struct mlx5_flow_root_namespace *ns,
struct mlx5_flow_table *ft); struct mlx5_flow_table *ft);
......
...@@ -1155,7 +1155,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa ...@@ -1155,7 +1155,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
find_next_chained_ft(fs_prio); find_next_chained_ft(fs_prio);
ft->def_miss_action = ns->def_miss_action; ft->def_miss_action = ns->def_miss_action;
ft->ns = ns; 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) if (err)
goto free_ft; goto free_ft;
......
...@@ -439,6 +439,7 @@ int mlx5dr_cmd_create_flow_table(struct mlx5_core_dev *mdev, ...@@ -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, 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, 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); 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); MLX5_SET(flow_table_context, ft_mdev, termination_table, attr->term_tbl);
......
...@@ -214,7 +214,7 @@ static int dr_table_destroy_sw_owned_tbl(struct mlx5dr_table *tbl) ...@@ -214,7 +214,7 @@ static int dr_table_destroy_sw_owned_tbl(struct mlx5dr_table *tbl)
tbl->table_type); 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_encap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
bool en_decap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP); 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) ...@@ -236,6 +236,7 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
ft_attr.sw_owner = true; ft_attr.sw_owner = true;
ft_attr.decap_en = en_decap; ft_attr.decap_en = en_decap;
ft_attr.reformat_en = en_encap; ft_attr.reformat_en = en_encap;
ft_attr.uid = uid;
ret = mlx5dr_cmd_create_flow_table(tbl->dmn->mdev, &ft_attr, ret = mlx5dr_cmd_create_flow_table(tbl->dmn->mdev, &ft_attr,
NULL, &tbl->table_id); NULL, &tbl->table_id);
...@@ -243,7 +244,8 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl) ...@@ -243,7 +244,8 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
return ret; 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; struct mlx5dr_table *tbl;
int ret; int ret;
...@@ -263,7 +265,7 @@ struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u ...@@ -263,7 +265,7 @@ struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u
if (ret) if (ret)
goto free_tbl; goto free_tbl;
ret = dr_table_create_sw_owned_tbl(tbl); ret = dr_table_create_sw_owned_tbl(tbl, uid);
if (ret) if (ret)
goto uninit_tbl; goto uninit_tbl;
......
...@@ -1200,6 +1200,7 @@ struct mlx5dr_cmd_query_flow_table_details { ...@@ -1200,6 +1200,7 @@ struct mlx5dr_cmd_query_flow_table_details {
struct mlx5dr_cmd_create_flow_table_attr { struct mlx5dr_cmd_create_flow_table_attr {
u32 table_type; u32 table_type;
u16 uid;
u64 icm_addr_rx; u64 icm_addr_rx;
u64 icm_addr_tx; u64 icm_addr_tx;
u8 level; u8 level;
......
...@@ -62,7 +62,7 @@ static int set_miss_action(struct mlx5_flow_root_namespace *ns, ...@@ -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, static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,
struct mlx5_flow_table *ft, struct mlx5_flow_table *ft,
unsigned int size, struct mlx5_flow_table_attr *ft_attr,
struct mlx5_flow_table *next_ft) struct mlx5_flow_table *next_ft)
{ {
struct mlx5dr_table *tbl; struct mlx5dr_table *tbl;
...@@ -71,7 +71,7 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns, ...@@ -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)) if (mlx5_dr_is_fw_table(ft->flags))
return mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft, return mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft,
size, ft_attr,
next_ft); next_ft);
flags = ft->flags; flags = ft->flags;
/* turn off encap/decap if not supported for sw-str by fw */ /* 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, ...@@ -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 | flags = ft->flags & ~(MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |
MLX5_FLOW_TABLE_TUNNEL_EN_DECAP); 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) { if (!tbl) {
mlx5_core_err(ns->dev, "Failed creating dr flow_table\n"); mlx5_core_err(ns->dev, "Failed creating dr flow_table\n");
return -EINVAL; return -EINVAL;
......
...@@ -51,7 +51,8 @@ void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn, ...@@ -51,7 +51,8 @@ void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
struct mlx5dr_domain *peer_dmn); struct mlx5dr_domain *peer_dmn);
struct mlx5dr_table * 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 * struct mlx5dr_table *
mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft); mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft);
......
...@@ -178,6 +178,7 @@ struct mlx5_flow_table_attr { ...@@ -178,6 +178,7 @@ struct mlx5_flow_table_attr {
int max_fte; int max_fte;
u32 level; u32 level;
u32 flags; u32 flags;
u16 uid;
struct mlx5_flow_table *next_ft; struct mlx5_flow_table *next_ft;
struct { struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment