@@ -806,38 +806,38 @@ mlx5e_generate_ttc_rule(struct mlx5e_priv *priv,
806
806
return err ? ERR_PTR (err ) : rule ;
807
807
}
808
808
809
- static int mlx5e_generate_ttc_table_rules (struct mlx5e_priv * priv )
809
+ static int mlx5e_generate_ttc_table_rules (struct mlx5e_priv * priv ,
810
+ struct ttc_params * params ,
811
+ struct mlx5e_ttc_table * ttc )
810
812
{
811
813
struct mlx5_flow_destination dest = {};
812
- struct mlx5e_ttc_table * ttc ;
813
814
struct mlx5_flow_handle * * rules ;
814
815
struct mlx5_flow_table * ft ;
815
816
int tt ;
816
817
int err ;
817
818
818
- ttc = & priv -> fs .ttc ;
819
819
ft = ttc -> ft .t ;
820
820
rules = ttc -> rules ;
821
821
822
822
dest .type = MLX5_FLOW_DESTINATION_TYPE_TIR ;
823
823
for (tt = 0 ; tt < MLX5E_NUM_TT ; tt ++ ) {
824
824
if (tt == MLX5E_TT_ANY )
825
- dest .tir_num = priv -> direct_tir [ 0 ]. tirn ;
825
+ dest .tir_num = params -> any_tt_tirn ;
826
826
else
827
- dest .tir_num = priv -> indir_tir [tt ]. tirn ;
827
+ dest .tir_num = params -> indir_tirn [tt ];
828
828
rules [tt ] = mlx5e_generate_ttc_rule (priv , ft , & dest ,
829
829
ttc_rules [tt ].etype ,
830
830
ttc_rules [tt ].proto );
831
831
if (IS_ERR (rules [tt ]))
832
832
goto del_rules ;
833
833
}
834
834
835
- if (!mlx5e_tunnel_inner_ft_supported (priv -> mdev ))
835
+ if (!params -> inner_ttc || ! mlx5e_tunnel_inner_ft_supported (priv -> mdev ))
836
836
return 0 ;
837
837
838
838
rules = ttc -> tunnel_rules ;
839
839
dest .type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE ;
840
- dest .ft = priv -> fs . inner_ttc . ft .t ;
840
+ dest .ft = params -> inner_ttc -> ft .t ;
841
841
for (tt = 0 ; tt < MLX5E_NUM_TUNNEL_TT ; tt ++ ) {
842
842
rules [tt ] = mlx5e_generate_ttc_rule (priv , ft , & dest ,
843
843
ttc_tunnel_rules [tt ].etype ,
@@ -977,25 +977,25 @@ mlx5e_generate_inner_ttc_rule(struct mlx5e_priv *priv,
977
977
return err ? ERR_PTR (err ) : rule ;
978
978
}
979
979
980
- static int mlx5e_generate_inner_ttc_table_rules (struct mlx5e_priv * priv )
980
+ static int mlx5e_generate_inner_ttc_table_rules (struct mlx5e_priv * priv ,
981
+ struct ttc_params * params ,
982
+ struct mlx5e_ttc_table * ttc )
981
983
{
982
984
struct mlx5_flow_destination dest = {};
983
985
struct mlx5_flow_handle * * rules ;
984
- struct mlx5e_ttc_table * ttc ;
985
986
struct mlx5_flow_table * ft ;
986
987
int err ;
987
988
int tt ;
988
989
989
- ttc = & priv -> fs .inner_ttc ;
990
990
ft = ttc -> ft .t ;
991
991
rules = ttc -> rules ;
992
992
993
993
dest .type = MLX5_FLOW_DESTINATION_TYPE_TIR ;
994
994
for (tt = 0 ; tt < MLX5E_NUM_TT ; tt ++ ) {
995
995
if (tt == MLX5E_TT_ANY )
996
- dest .tir_num = priv -> direct_tir [ 0 ]. tirn ;
996
+ dest .tir_num = params -> any_tt_tirn ;
997
997
else
998
- dest .tir_num = priv -> inner_indir_tir [tt ]. tirn ;
998
+ dest .tir_num = params -> indir_tirn [tt ];
999
999
1000
1000
rules [tt ] = mlx5e_generate_inner_ttc_rule (priv , ft , & dest ,
1001
1001
ttc_rules [tt ].etype ,
@@ -1075,21 +1075,42 @@ static int mlx5e_create_inner_ttc_table_groups(struct mlx5e_ttc_table *ttc)
1075
1075
return err ;
1076
1076
}
1077
1077
1078
- int mlx5e_create_inner_ttc_table (struct mlx5e_priv * priv )
1078
+ void mlx5e_set_ttc_basic_params (struct mlx5e_priv * priv ,
1079
+ struct ttc_params * ttc_params )
1080
+ {
1081
+ ttc_params -> any_tt_tirn = priv -> direct_tir [0 ].tirn ;
1082
+ ttc_params -> inner_ttc = & priv -> fs .inner_ttc ;
1083
+ }
1084
+
1085
+ void mlx5e_set_inner_ttc_ft_params (struct ttc_params * ttc_params )
1086
+ {
1087
+ struct mlx5_flow_table_attr * ft_attr = & ttc_params -> ft_attr ;
1088
+
1089
+ ft_attr -> max_fte = MLX5E_INNER_TTC_TABLE_SIZE ;
1090
+ ft_attr -> level = MLX5E_INNER_TTC_FT_LEVEL ;
1091
+ ft_attr -> prio = MLX5E_NIC_PRIO ;
1092
+ }
1093
+
1094
+ void mlx5e_set_ttc_ft_params (struct ttc_params * ttc_params )
1095
+
1096
+ {
1097
+ struct mlx5_flow_table_attr * ft_attr = & ttc_params -> ft_attr ;
1098
+
1099
+ ft_attr -> max_fte = MLX5E_TTC_TABLE_SIZE ;
1100
+ ft_attr -> level = MLX5E_TTC_FT_LEVEL ;
1101
+ ft_attr -> prio = MLX5E_NIC_PRIO ;
1102
+ }
1103
+
1104
+ int mlx5e_create_inner_ttc_table (struct mlx5e_priv * priv , struct ttc_params * params ,
1105
+ struct mlx5e_ttc_table * ttc )
1079
1106
{
1080
- struct mlx5e_ttc_table * ttc = & priv -> fs .inner_ttc ;
1081
- struct mlx5_flow_table_attr ft_attr = {};
1082
1107
struct mlx5e_flow_table * ft = & ttc -> ft ;
1083
1108
int err ;
1084
1109
1085
1110
if (!mlx5e_tunnel_inner_ft_supported (priv -> mdev ))
1086
1111
return 0 ;
1087
1112
1088
- ft_attr .max_fte = MLX5E_INNER_TTC_TABLE_SIZE ;
1089
- ft_attr .level = MLX5E_INNER_TTC_FT_LEVEL ;
1090
- ft_attr .prio = MLX5E_NIC_PRIO ;
1091
-
1092
- ft -> t = mlx5_create_flow_table (priv -> fs .ns , & ft_attr );
1113
+ ft -> t = mlx5_create_flow_table (priv -> fs .ns , & params -> ft_attr );
1093
1114
if (IS_ERR (ft -> t )) {
1094
1115
err = PTR_ERR (ft -> t );
1095
1116
ft -> t = NULL ;
@@ -1100,7 +1121,7 @@ int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv)
1100
1121
if (err )
1101
1122
goto err ;
1102
1123
1103
- err = mlx5e_generate_inner_ttc_table_rules (priv );
1124
+ err = mlx5e_generate_inner_ttc_table_rules (priv , params , ttc );
1104
1125
if (err )
1105
1126
goto err ;
1106
1127
@@ -1111,38 +1132,31 @@ int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv)
1111
1132
return err ;
1112
1133
}
1113
1134
1114
- void mlx5e_destroy_inner_ttc_table (struct mlx5e_priv * priv )
1135
+ void mlx5e_destroy_inner_ttc_table (struct mlx5e_priv * priv ,
1136
+ struct mlx5e_ttc_table * ttc )
1115
1137
{
1116
- struct mlx5e_ttc_table * ttc = & priv -> fs .inner_ttc ;
1117
-
1118
1138
if (!mlx5e_tunnel_inner_ft_supported (priv -> mdev ))
1119
1139
return ;
1120
1140
1121
1141
mlx5e_cleanup_ttc_rules (ttc );
1122
1142
mlx5e_destroy_flow_table (& ttc -> ft );
1123
1143
}
1124
1144
1125
- void mlx5e_destroy_ttc_table (struct mlx5e_priv * priv )
1145
+ void mlx5e_destroy_ttc_table (struct mlx5e_priv * priv ,
1146
+ struct mlx5e_ttc_table * ttc )
1126
1147
{
1127
- struct mlx5e_ttc_table * ttc = & priv -> fs .ttc ;
1128
-
1129
1148
mlx5e_cleanup_ttc_rules (ttc );
1130
1149
mlx5e_destroy_flow_table (& ttc -> ft );
1131
1150
}
1132
1151
1133
- int mlx5e_create_ttc_table (struct mlx5e_priv * priv )
1152
+ int mlx5e_create_ttc_table (struct mlx5e_priv * priv , struct ttc_params * params ,
1153
+ struct mlx5e_ttc_table * ttc )
1134
1154
{
1135
1155
bool match_ipv_outer = MLX5_CAP_FLOWTABLE_NIC_RX (priv -> mdev , ft_field_support .outer_ip_version );
1136
- struct mlx5e_ttc_table * ttc = & priv -> fs .ttc ;
1137
- struct mlx5_flow_table_attr ft_attr = {};
1138
1156
struct mlx5e_flow_table * ft = & ttc -> ft ;
1139
1157
int err ;
1140
1158
1141
- ft_attr .max_fte = MLX5E_TTC_TABLE_SIZE ;
1142
- ft_attr .level = MLX5E_TTC_FT_LEVEL ;
1143
- ft_attr .prio = MLX5E_NIC_PRIO ;
1144
-
1145
- ft -> t = mlx5_create_flow_table (priv -> fs .ns , & ft_attr );
1159
+ ft -> t = mlx5_create_flow_table (priv -> fs .ns , & params -> ft_attr );
1146
1160
if (IS_ERR (ft -> t )) {
1147
1161
err = PTR_ERR (ft -> t );
1148
1162
ft -> t = NULL ;
@@ -1153,7 +1167,7 @@ int mlx5e_create_ttc_table(struct mlx5e_priv *priv)
1153
1167
if (err )
1154
1168
goto err ;
1155
1169
1156
- err = mlx5e_generate_ttc_table_rules (priv );
1170
+ err = mlx5e_generate_ttc_table_rules (priv , params , ttc );
1157
1171
if (err )
1158
1172
goto err ;
1159
1173
@@ -1474,7 +1488,8 @@ static void mlx5e_destroy_vlan_table(struct mlx5e_priv *priv)
1474
1488
1475
1489
int mlx5e_create_flow_steering (struct mlx5e_priv * priv )
1476
1490
{
1477
- int err ;
1491
+ struct ttc_params ttc_params = {};
1492
+ int tt , err ;
1478
1493
1479
1494
priv -> fs .ns = mlx5_get_flow_namespace (priv -> mdev ,
1480
1495
MLX5_FLOW_NAMESPACE_KERNEL );
@@ -1489,14 +1504,23 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
1489
1504
priv -> netdev -> hw_features &= ~NETIF_F_NTUPLE ;
1490
1505
}
1491
1506
1492
- err = mlx5e_create_inner_ttc_table (priv );
1507
+ mlx5e_set_ttc_basic_params (priv , & ttc_params );
1508
+ mlx5e_set_inner_ttc_ft_params (& ttc_params );
1509
+ for (tt = 0 ; tt < MLX5E_NUM_INDIR_TIRS ; tt ++ )
1510
+ ttc_params .indir_tirn [tt ] = priv -> inner_indir_tir [tt ].tirn ;
1511
+
1512
+ err = mlx5e_create_inner_ttc_table (priv , & ttc_params , & priv -> fs .inner_ttc );
1493
1513
if (err ) {
1494
1514
netdev_err (priv -> netdev , "Failed to create inner ttc table, err=%d\n" ,
1495
1515
err );
1496
1516
goto err_destroy_arfs_tables ;
1497
1517
}
1498
1518
1499
- err = mlx5e_create_ttc_table (priv );
1519
+ mlx5e_set_ttc_ft_params (& ttc_params );
1520
+ for (tt = 0 ; tt < MLX5E_NUM_INDIR_TIRS ; tt ++ )
1521
+ ttc_params .indir_tirn [tt ] = priv -> indir_tir [tt ].tirn ;
1522
+
1523
+ err = mlx5e_create_ttc_table (priv , & ttc_params , & priv -> fs .ttc );
1500
1524
if (err ) {
1501
1525
netdev_err (priv -> netdev , "Failed to create ttc table, err=%d\n" ,
1502
1526
err );
@@ -1524,9 +1548,9 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
1524
1548
err_destroy_l2_table :
1525
1549
mlx5e_destroy_l2_table (priv );
1526
1550
err_destroy_ttc_table :
1527
- mlx5e_destroy_ttc_table (priv );
1551
+ mlx5e_destroy_ttc_table (priv , & priv -> fs . ttc );
1528
1552
err_destroy_inner_ttc_table :
1529
- mlx5e_destroy_inner_ttc_table (priv );
1553
+ mlx5e_destroy_inner_ttc_table (priv , & priv -> fs . inner_ttc );
1530
1554
err_destroy_arfs_tables :
1531
1555
mlx5e_arfs_destroy_tables (priv );
1532
1556
@@ -1537,8 +1561,8 @@ void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv)
1537
1561
{
1538
1562
mlx5e_destroy_vlan_table (priv );
1539
1563
mlx5e_destroy_l2_table (priv );
1540
- mlx5e_destroy_ttc_table (priv );
1541
- mlx5e_destroy_inner_ttc_table (priv );
1564
+ mlx5e_destroy_ttc_table (priv , & priv -> fs . ttc );
1565
+ mlx5e_destroy_inner_ttc_table (priv , & priv -> fs . inner_ttc );
1542
1566
mlx5e_arfs_destroy_tables (priv );
1543
1567
mlx5e_ethtool_cleanup_steering (priv );
1544
1568
}
0 commit comments