On Mon, 2018-07-23 at 15:25 +0300, Leon Romanovsky wrote: > From: Yishai Hadas <yishaih@xxxxxxxxxxxx> > > Add support to set a destination from a flow table number. > This functionality will be used in downstream patches from this > series by the DEVX stuff. > > Signed-off-by: Yishai Hadas <yishaih@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > Acked-by: Saeed Mahameed <saeedm@xxxxxxxxxxxx> > --- > .../mellanox/mlx5/core/diag/fs_tracepoint.c | 3 +++ > drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c | 24 > ++++++++++++++-------- > drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 4 +++- > include/linux/mlx5/fs.h | 1 + > include/linux/mlx5/mlx5_ifc.h | 1 + > 5 files changed, 23 insertions(+), 10 deletions(-) > > diff --git > a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c > b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c > index b3820a34e773..0f11fff32a9b 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c > @@ -240,6 +240,9 @@ const char *parse_fs_dst(struct trace_seq *p, > case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE: > trace_seq_printf(p, "ft=%p\n", dst->ft); > break; > + case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM: > + trace_seq_printf(p, "ft_num=%u\n", dst->ft_num); > + break; > case MLX5_FLOW_DESTINATION_TYPE_TIR: > trace_seq_printf(p, "tir=%u\n", dst->tir_num); > break; > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c > b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c > index 5a00deff5457..910d25f84f2f 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c > @@ -362,18 +362,20 @@ static int mlx5_cmd_set_fte(struct > mlx5_core_dev *dev, > int list_size = 0; > > list_for_each_entry(dst, &fte->node.children, > node.list) { > - unsigned int id; > + unsigned int id, type = dst->dest_attr.type; > > - if (dst->dest_attr.type == > MLX5_FLOW_DESTINATION_TYPE_COUNTER) > + if (type == > MLX5_FLOW_DESTINATION_TYPE_COUNTER) > continue; > > - MLX5_SET(dest_format_struct, in_dests, > destination_type, > - dst->dest_attr.type); > - if (dst->dest_attr.type == > - MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE) { > + switch (type) { > + case > MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM: > + id = dst->dest_attr.ft_num; > + type = > MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE; > + break; > + case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE: > id = dst->dest_attr.ft->id; > - } else if (dst->dest_attr.type == > - MLX5_FLOW_DESTINATION_TYPE_VPORT) > { > + break; > + case MLX5_FLOW_DESTINATION_TYPE_VPORT: > id = dst->dest_attr.vport.num; > MLX5_SET(dest_format_struct, > in_dests, > destination_eswitch_owner_v > hca_id_valid, > @@ -381,9 +383,13 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev > *dev, > MLX5_SET(dest_format_struct, > in_dests, > destination_eswitch_owner_v > hca_id, > dst- > >dest_attr.vport.vhca_id); > - } else { > + break; > + default: > id = dst->dest_attr.tir_num; > } > + > + MLX5_SET(dest_format_struct, in_dests, > destination_type, > + type); > MLX5_SET(dest_format_struct, in_dests, > destination_id, id); > in_dests += > MLX5_ST_SZ_BYTES(dest_format_struct); > list_size++; > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c > b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c > index eba113cf1117..69aa298a0b1c 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c > @@ -1356,7 +1356,9 @@ static bool mlx5_flow_dests_cmp(struct > mlx5_flow_destination *d1, > (d1->type == > MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE && > d1->ft == d2->ft) || > (d1->type == MLX5_FLOW_DESTINATION_TYPE_TIR && > - d1->tir_num == d2->tir_num)) > + d1->tir_num == d2->tir_num) || > + (d1->type == > MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM && > + d1->ft_num == d2->ft_num)) > return true; > } > > diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h > index 757b4a30281e..a45febcf6b51 100644 > --- a/include/linux/mlx5/fs.h > +++ b/include/linux/mlx5/fs.h > @@ -89,6 +89,7 @@ struct mlx5_flow_destination { > enum mlx5_flow_destination_type type; > union { > u32 tir_num; > + u32 ft_num; > struct mlx5_flow_table *ft; > struct mlx5_fc *counter; > struct { > diff --git a/include/linux/mlx5/mlx5_ifc.h > b/include/linux/mlx5/mlx5_ifc.h > index 44a6ce01c3bb..fb89cc519703 100644 > --- a/include/linux/mlx5/mlx5_ifc.h > +++ b/include/linux/mlx5/mlx5_ifc.h > @@ -1181,6 +1181,7 @@ enum mlx5_flow_destination_type { > > MLX5_FLOW_DESTINATION_TYPE_PORT = 0x99, > MLX5_FLOW_DESTINATION_TYPE_COUNTER = 0x100, > + MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM = 0x101, > }; > > struct mlx5_ifc_dest_format_struct_bits {��.n��������+%������w��{.n�����{���fk��ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f