@@ -83,12 +83,6 @@ struct mlx5_tc_ct_priv {
83
83
struct mlx5_tc_ct_debugfs debugfs ;
84
84
};
85
85
86
- struct mlx5_ct_flow {
87
- struct mlx5_flow_attr * pre_ct_attr ;
88
- struct mlx5_flow_handle * pre_ct_rule ;
89
- struct mlx5_ct_ft * ft ;
90
- };
91
-
92
86
struct mlx5_ct_zone_rule {
93
87
struct mlx5_ct_fs_rule * rule ;
94
88
struct mlx5e_mod_hdr_handle * mh ;
@@ -598,12 +592,6 @@ mlx5_tc_ct_entry_set_registers(struct mlx5_tc_ct_priv *ct_priv,
598
592
return 0 ;
599
593
}
600
594
601
- int mlx5_tc_ct_set_ct_clear_regs (struct mlx5_tc_ct_priv * priv ,
602
- struct mlx5e_tc_mod_hdr_acts * mod_acts )
603
- {
604
- return mlx5_tc_ct_entry_set_registers (priv , mod_acts , 0 , 0 , 0 , 0 );
605
- }
606
-
607
595
static int
608
596
mlx5_tc_ct_parse_mangle_to_mod_act (struct flow_action_entry * act ,
609
597
char * modact )
@@ -1545,7 +1533,6 @@ mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
1545
1533
int
1546
1534
mlx5_tc_ct_parse_action (struct mlx5_tc_ct_priv * priv ,
1547
1535
struct mlx5_flow_attr * attr ,
1548
- struct mlx5e_tc_mod_hdr_acts * mod_acts ,
1549
1536
const struct flow_action_entry * act ,
1550
1537
struct netlink_ext_ack * extack )
1551
1538
{
@@ -1555,8 +1542,8 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
1555
1542
return - EOPNOTSUPP ;
1556
1543
}
1557
1544
1545
+ attr -> ct_attr .ct_action |= act -> ct .action ; /* So we can have clear + ct */
1558
1546
attr -> ct_attr .zone = act -> ct .zone ;
1559
- attr -> ct_attr .ct_action = act -> ct .action ;
1560
1547
attr -> ct_attr .nf_ft = act -> ct .flow_table ;
1561
1548
attr -> ct_attr .act_miss_cookie = act -> miss_cookie ;
1562
1549
@@ -1892,14 +1879,14 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
1892
1879
1893
1880
/* We translate the tc filter with CT action to the following HW model:
1894
1881
*
1895
- * +---------------------+
1896
- * + ft prio (tc chain) +
1897
- * + original match +
1898
- * +---------------------+
1882
+ * +----------------------- +
1883
+ * + rule (either original +
1884
+ * + or post_act rule) +
1885
+ * +----------------------- +
1899
1886
* | set act_miss_cookie mapping
1900
1887
* | set fte_id
1901
1888
* | set tunnel_id
1902
- * | do decap
1889
+ * | rest of actions before the CT action (for this orig/post_act rule)
1903
1890
* |
1904
1891
* +-------------+
1905
1892
* | Chain 0 |
@@ -1924,32 +1911,21 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
1924
1911
* | do nat (if needed)
1925
1912
* v
1926
1913
* +--------------+
1927
- * + post_act + original filter actions
1914
+ * + post_act + rest of parsed filter's actions
1928
1915
* + fte_id match +------------------------>
1929
1916
* +--------------+
1930
1917
*
1931
1918
*/
1932
- static struct mlx5_flow_handle *
1919
+ static int
1933
1920
__mlx5_tc_ct_flow_offload (struct mlx5_tc_ct_priv * ct_priv ,
1934
- struct mlx5_flow_spec * orig_spec ,
1935
1921
struct mlx5_flow_attr * attr )
1936
1922
{
1937
1923
bool nat = attr -> ct_attr .ct_action & TCA_CT_ACT_NAT ;
1938
1924
struct mlx5e_priv * priv = netdev_priv (ct_priv -> netdev );
1939
- struct mlx5e_tc_mod_hdr_acts * pre_mod_acts ;
1940
- u32 attr_sz = ns_to_attr_sz (ct_priv -> ns_type );
1941
- struct mlx5_flow_attr * pre_ct_attr ;
1942
- struct mlx5_modify_hdr * mod_hdr ;
1943
- struct mlx5_ct_flow * ct_flow ;
1944
1925
int act_miss_mapping = 0 , err ;
1945
1926
struct mlx5_ct_ft * ft ;
1946
1927
u16 zone ;
1947
1928
1948
- ct_flow = kzalloc (sizeof (* ct_flow ), GFP_KERNEL );
1949
- if (!ct_flow ) {
1950
- return ERR_PTR (- ENOMEM );
1951
- }
1952
-
1953
1929
/* Register for CT established events */
1954
1930
ft = mlx5_tc_ct_add_ft_cb (ct_priv , attr -> ct_attr .zone ,
1955
1931
attr -> ct_attr .nf_ft );
@@ -1958,160 +1934,97 @@ __mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *ct_priv,
1958
1934
ct_dbg ("Failed to register to ft callback" );
1959
1935
goto err_ft ;
1960
1936
}
1961
- ct_flow -> ft = ft ;
1962
-
1963
- /* Base flow attributes of both rules on original rule attribute */
1964
- ct_flow -> pre_ct_attr = mlx5_alloc_flow_attr (ct_priv -> ns_type );
1965
- if (!ct_flow -> pre_ct_attr ) {
1966
- err = - ENOMEM ;
1967
- goto err_alloc_pre ;
1968
- }
1969
-
1970
- pre_ct_attr = ct_flow -> pre_ct_attr ;
1971
- memcpy (pre_ct_attr , attr , attr_sz );
1972
- pre_mod_acts = & pre_ct_attr -> parse_attr -> mod_hdr_acts ;
1973
-
1974
- /* Modify the original rule's action to fwd and modify, leave decap */
1975
- pre_ct_attr -> action = attr -> action & MLX5_FLOW_CONTEXT_ACTION_DECAP ;
1976
- pre_ct_attr -> action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
1977
- MLX5_FLOW_CONTEXT_ACTION_MOD_HDR ;
1937
+ attr -> ct_attr .ft = ft ;
1978
1938
1979
1939
err = mlx5e_tc_action_miss_mapping_get (ct_priv -> priv , attr , attr -> ct_attr .act_miss_cookie ,
1980
1940
& act_miss_mapping );
1981
1941
if (err ) {
1982
1942
ct_dbg ("Failed to get register mapping for act miss" );
1983
1943
goto err_get_act_miss ;
1984
1944
}
1985
- attr -> ct_attr .act_miss_mapping = act_miss_mapping ;
1986
1945
1987
- err = mlx5e_tc_match_to_reg_set (priv -> mdev , pre_mod_acts , ct_priv -> ns_type ,
1988
- MAPPED_OBJ_TO_REG , act_miss_mapping );
1946
+ err = mlx5e_tc_match_to_reg_set (priv -> mdev , & attr -> parse_attr -> mod_hdr_acts ,
1947
+ ct_priv -> ns_type , MAPPED_OBJ_TO_REG , act_miss_mapping );
1989
1948
if (err ) {
1990
1949
ct_dbg ("Failed to set act miss register mapping" );
1991
1950
goto err_mapping ;
1992
1951
}
1993
1952
1994
- /* If original flow is decap, we do it before going into ct table
1995
- * so add a rewrite for the tunnel match_id.
1996
- */
1997
- if ((pre_ct_attr -> action & MLX5_FLOW_CONTEXT_ACTION_DECAP ) &&
1998
- attr -> chain == 0 ) {
1999
- err = mlx5e_tc_match_to_reg_set (priv -> mdev , pre_mod_acts ,
2000
- ct_priv -> ns_type ,
2001
- TUNNEL_TO_REG ,
2002
- attr -> tunnel_id );
2003
- if (err ) {
2004
- ct_dbg ("Failed to set tunnel register mapping" );
2005
- goto err_mapping ;
2006
- }
2007
- }
2008
-
2009
- /* Change original rule point to ct table
2010
- * Chain 0 sets the zone and jumps to ct table
1953
+ /* Chain 0 sets the zone and jumps to ct table
2011
1954
* Other chains jump to pre_ct table to align with act_ct cached logic
2012
1955
*/
2013
- pre_ct_attr -> dest_chain = 0 ;
2014
1956
if (!attr -> chain ) {
2015
1957
zone = ft -> zone & MLX5_CT_ZONE_MASK ;
2016
- err = mlx5e_tc_match_to_reg_set (priv -> mdev , pre_mod_acts , ct_priv -> ns_type ,
2017
- ZONE_TO_REG , zone );
1958
+ err = mlx5e_tc_match_to_reg_set (priv -> mdev , & attr -> parse_attr -> mod_hdr_acts ,
1959
+ ct_priv -> ns_type , ZONE_TO_REG , zone );
2018
1960
if (err ) {
2019
1961
ct_dbg ("Failed to set zone register mapping" );
2020
1962
goto err_mapping ;
2021
1963
}
2022
1964
2023
- pre_ct_attr -> dest_ft = nat ? ct_priv -> ct_nat : ct_priv -> ct ;
1965
+ attr -> dest_ft = nat ? ct_priv -> ct_nat : ct_priv -> ct ;
2024
1966
} else {
2025
- pre_ct_attr -> dest_ft = nat ? ft -> pre_ct_nat .ft : ft -> pre_ct .ft ;
2026
- }
2027
-
2028
- mod_hdr = mlx5_modify_header_alloc (priv -> mdev , ct_priv -> ns_type ,
2029
- pre_mod_acts -> num_actions ,
2030
- pre_mod_acts -> actions );
2031
- if (IS_ERR (mod_hdr )) {
2032
- err = PTR_ERR (mod_hdr );
2033
- ct_dbg ("Failed to create pre ct mod hdr" );
2034
- goto err_mapping ;
2035
- }
2036
- pre_ct_attr -> modify_hdr = mod_hdr ;
2037
- ct_flow -> pre_ct_rule = mlx5_tc_rule_insert (priv , orig_spec ,
2038
- pre_ct_attr );
2039
- if (IS_ERR (ct_flow -> pre_ct_rule )) {
2040
- err = PTR_ERR (ct_flow -> pre_ct_rule );
2041
- ct_dbg ("Failed to add pre ct rule" );
2042
- goto err_insert_orig ;
1967
+ attr -> dest_ft = nat ? ft -> pre_ct_nat .ft : ft -> pre_ct .ft ;
2043
1968
}
2044
1969
2045
- attr -> ct_attr . ct_flow = ct_flow ;
2046
- mlx5e_mod_hdr_dealloc ( pre_mod_acts ) ;
1970
+ attr -> action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_MOD_HDR ;
1971
+ attr -> ct_attr . act_miss_mapping = act_miss_mapping ;
2047
1972
2048
- return ct_flow -> pre_ct_rule ;
1973
+ return 0 ;
2049
1974
2050
- err_insert_orig :
2051
- mlx5_modify_header_dealloc (priv -> mdev , pre_ct_attr -> modify_hdr );
2052
1975
err_mapping :
2053
- mlx5e_mod_hdr_dealloc (pre_mod_acts );
2054
1976
mlx5e_tc_action_miss_mapping_put (ct_priv -> priv , attr , act_miss_mapping );
2055
1977
err_get_act_miss :
2056
- kfree (ct_flow -> pre_ct_attr );
2057
- err_alloc_pre :
2058
1978
mlx5_tc_ct_del_ft_cb (ct_priv , ft );
2059
1979
err_ft :
2060
- kfree (ct_flow );
2061
1980
netdev_warn (priv -> netdev , "Failed to offload ct flow, err %d\n" , err );
2062
- return ERR_PTR ( err ) ;
1981
+ return err ;
2063
1982
}
2064
1983
2065
- struct mlx5_flow_handle *
2066
- mlx5_tc_ct_flow_offload (struct mlx5_tc_ct_priv * priv ,
2067
- struct mlx5_flow_spec * spec ,
2068
- struct mlx5_flow_attr * attr ,
2069
- struct mlx5e_tc_mod_hdr_acts * mod_hdr_acts )
1984
+ int
1985
+ mlx5_tc_ct_flow_offload (struct mlx5_tc_ct_priv * priv , struct mlx5_flow_attr * attr )
2070
1986
{
2071
- struct mlx5_flow_handle * rule ;
1987
+ int err ;
2072
1988
2073
1989
if (!priv )
2074
- return ERR_PTR (- EOPNOTSUPP );
1990
+ return - EOPNOTSUPP ;
1991
+
1992
+ if (attr -> ct_attr .ct_action & TCA_CT_ACT_CLEAR ) {
1993
+ err = mlx5_tc_ct_entry_set_registers (priv , & attr -> parse_attr -> mod_hdr_acts ,
1994
+ 0 , 0 , 0 , 0 );
1995
+ if (err )
1996
+ return err ;
1997
+
1998
+ attr -> action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR ;
1999
+ }
2000
+
2001
+ if (!attr -> ct_attr .nf_ft ) /* means only ct clear action, and not ct_clear,ct() */
2002
+ return 0 ;
2075
2003
2076
2004
mutex_lock (& priv -> control_lock );
2077
- rule = __mlx5_tc_ct_flow_offload (priv , spec , attr );
2005
+ err = __mlx5_tc_ct_flow_offload (priv , attr );
2078
2006
mutex_unlock (& priv -> control_lock );
2079
2007
2080
- return rule ;
2008
+ return err ;
2081
2009
}
2082
2010
2083
2011
static void
2084
2012
__mlx5_tc_ct_delete_flow (struct mlx5_tc_ct_priv * ct_priv ,
2085
- struct mlx5_ct_flow * ct_flow ,
2086
2013
struct mlx5_flow_attr * attr )
2087
2014
{
2088
- struct mlx5_flow_attr * pre_ct_attr = ct_flow -> pre_ct_attr ;
2089
- struct mlx5e_priv * priv = netdev_priv (ct_priv -> netdev );
2090
-
2091
- mlx5_tc_rule_delete (priv , ct_flow -> pre_ct_rule , pre_ct_attr );
2092
- mlx5_modify_header_dealloc (priv -> mdev , pre_ct_attr -> modify_hdr );
2093
-
2094
2015
mlx5e_tc_action_miss_mapping_put (ct_priv -> priv , attr , attr -> ct_attr .act_miss_mapping );
2095
- mlx5_tc_ct_del_ft_cb (ct_priv , ct_flow -> ft );
2096
-
2097
- kfree (ct_flow -> pre_ct_attr );
2098
- kfree (ct_flow );
2016
+ mlx5_tc_ct_del_ft_cb (ct_priv , attr -> ct_attr .ft );
2099
2017
}
2100
2018
2101
2019
void
2102
2020
mlx5_tc_ct_delete_flow (struct mlx5_tc_ct_priv * priv ,
2103
2021
struct mlx5_flow_attr * attr )
2104
2022
{
2105
- struct mlx5_ct_flow * ct_flow = attr -> ct_attr .ct_flow ;
2106
-
2107
- /* We are called on error to clean up stuff from parsing
2108
- * but we don't have anything for now
2109
- */
2110
- if (!ct_flow )
2023
+ if (!attr -> ct_attr .nf_ft ) /* means only ct clear action, and not ct_clear,ct() */
2111
2024
return ;
2112
2025
2113
2026
mutex_lock (& priv -> control_lock );
2114
- __mlx5_tc_ct_delete_flow (priv , ct_flow , attr );
2027
+ __mlx5_tc_ct_delete_flow (priv , attr );
2115
2028
mutex_unlock (& priv -> control_lock );
2116
2029
}
2117
2030
0 commit comments