net/mlx5e: CT: Re-use tuple modify headers for identical modify actions
After removing the tupleid register which changed per tuple, tuple modify headers set the ct_state, zone, mark, and label registers. For non-natted tuples going through the same tc rules path, their values will be the same, and all their modify headers will be the same. Re-use tuple modify header when possible, by adding each new modify header to an hahstable, and looking up identical ones before creating a new one. Signed-off-by: Paul Blakey <paulb@mellanox.com> Reviewed-by: Oz Shlomo <ozsh@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
b2fdf3d047
commit
6702d39355
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include "esw/chains.h"
|
#include "esw/chains.h"
|
||||||
#include "en/tc_ct.h"
|
#include "en/tc_ct.h"
|
||||||
|
#include "en/mod_hdr.h"
|
||||||
#include "en.h"
|
#include "en.h"
|
||||||
#include "en_tc.h"
|
#include "en_tc.h"
|
||||||
#include "en_rep.h"
|
#include "en_rep.h"
|
||||||
@ -59,6 +60,7 @@ struct mlx5_ct_flow {
|
|||||||
|
|
||||||
struct mlx5_ct_zone_rule {
|
struct mlx5_ct_zone_rule {
|
||||||
struct mlx5_flow_handle *rule;
|
struct mlx5_flow_handle *rule;
|
||||||
|
struct mlx5e_mod_hdr_handle *mh;
|
||||||
struct mlx5_esw_flow_attr attr;
|
struct mlx5_esw_flow_attr attr;
|
||||||
bool nat;
|
bool nat;
|
||||||
};
|
};
|
||||||
@ -397,7 +399,8 @@ mlx5_tc_ct_entry_del_rule(struct mlx5_tc_ct_priv *ct_priv,
|
|||||||
ct_dbg("Deleting ct entry rule in zone %d", entry->tuple.zone);
|
ct_dbg("Deleting ct entry rule in zone %d", entry->tuple.zone);
|
||||||
|
|
||||||
mlx5_eswitch_del_offloaded_rule(esw, zone_rule->rule, attr);
|
mlx5_eswitch_del_offloaded_rule(esw, zone_rule->rule, attr);
|
||||||
mlx5_modify_header_dealloc(esw->dev, attr->modify_hdr);
|
mlx5e_mod_hdr_detach(ct_priv->esw->dev,
|
||||||
|
&esw->offloads.mod_hdr, zone_rule->mh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -579,11 +582,10 @@ static int
|
|||||||
mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,
|
mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,
|
||||||
struct mlx5_esw_flow_attr *attr,
|
struct mlx5_esw_flow_attr *attr,
|
||||||
struct flow_rule *flow_rule,
|
struct flow_rule *flow_rule,
|
||||||
|
struct mlx5e_mod_hdr_handle **mh,
|
||||||
u16 zone, bool nat)
|
u16 zone, bool nat)
|
||||||
{
|
{
|
||||||
struct mlx5e_tc_mod_hdr_acts mod_acts = {};
|
struct mlx5e_tc_mod_hdr_acts mod_acts = {};
|
||||||
struct mlx5_eswitch *esw = ct_priv->esw;
|
|
||||||
struct mlx5_modify_hdr *mod_hdr;
|
|
||||||
struct flow_action_entry *meta;
|
struct flow_action_entry *meta;
|
||||||
u16 ct_state = 0;
|
u16 ct_state = 0;
|
||||||
int err;
|
int err;
|
||||||
@ -617,14 +619,15 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_mapping;
|
goto err_mapping;
|
||||||
|
|
||||||
mod_hdr = mlx5_modify_header_alloc(esw->dev, MLX5_FLOW_NAMESPACE_FDB,
|
*mh = mlx5e_mod_hdr_attach(ct_priv->esw->dev,
|
||||||
mod_acts.num_actions,
|
&ct_priv->esw->offloads.mod_hdr,
|
||||||
mod_acts.actions);
|
MLX5_FLOW_NAMESPACE_FDB,
|
||||||
if (IS_ERR(mod_hdr)) {
|
&mod_acts);
|
||||||
err = PTR_ERR(mod_hdr);
|
if (IS_ERR(*mh)) {
|
||||||
|
err = PTR_ERR(*mh);
|
||||||
goto err_mapping;
|
goto err_mapping;
|
||||||
}
|
}
|
||||||
attr->modify_hdr = mod_hdr;
|
attr->modify_hdr = mlx5e_mod_hdr_get(*mh);
|
||||||
|
|
||||||
dealloc_mod_hdr_actions(&mod_acts);
|
dealloc_mod_hdr_actions(&mod_acts);
|
||||||
return 0;
|
return 0;
|
||||||
@ -653,6 +656,7 @@ mlx5_tc_ct_entry_add_rule(struct mlx5_tc_ct_priv *ct_priv,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
err = mlx5_tc_ct_entry_create_mod_hdr(ct_priv, attr, flow_rule,
|
err = mlx5_tc_ct_entry_create_mod_hdr(ct_priv, attr, flow_rule,
|
||||||
|
&zone_rule->mh,
|
||||||
entry->tuple.zone, nat);
|
entry->tuple.zone, nat);
|
||||||
if (err) {
|
if (err) {
|
||||||
ct_dbg("Failed to create ct entry mod hdr");
|
ct_dbg("Failed to create ct entry mod hdr");
|
||||||
@ -687,7 +691,8 @@ mlx5_tc_ct_entry_add_rule(struct mlx5_tc_ct_priv *ct_priv,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_rule:
|
err_rule:
|
||||||
mlx5_modify_header_dealloc(esw->dev, attr->modify_hdr);
|
mlx5e_mod_hdr_detach(ct_priv->esw->dev,
|
||||||
|
&esw->offloads.mod_hdr, zone_rule->mh);
|
||||||
err_mod_hdr:
|
err_mod_hdr:
|
||||||
kfree(spec);
|
kfree(spec);
|
||||||
return err;
|
return err;
|
||||||
|
Loading…
Reference in New Issue
Block a user