net/mlx5e: CT, Don't set flow flag CT for ct clear flow
authorRoi Dayan <roid@nvidia.com>
Wed, 15 Dec 2021 08:48:36 +0000 (10:48 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 27 Jan 2022 20:37:34 +0000 (12:37 -0800)
ct clear action is a normal flow with a modify header for registers to
0. there is no need for any special handling in tc_ct.c.
Parsing of ct clear action still allocates mod acts to set 0 on the
registers and the driver continue to add a normal rule with modify hdr
context.

Signed-off-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Oz Shlomo <ozsh@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ct.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 4a04e0a7a52e492742607b21cd4bebc1840b1149..e8ff9493368835b841f10d59eb18a6b509857beb 100644 (file)
@@ -43,13 +43,14 @@ tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state,
        if (err)
                return err;
 
-       flow_flag_set(parse_state->flow, CT);
 
        if (mlx5e_is_eswitch_flow(parse_state->flow))
                attr->esw_attr->split_count = attr->esw_attr->out_count;
 
-       if (!clear_action)
+       if (!clear_action) {
+               flow_flag_set(parse_state->flow, CT);
                parse_state->ct = true;
+       }
 
        return 0;
 }
index 4a0d38d219edcc59761697796d1a509b9040274d..090e02548a75e4ef0d1ccc213f4552005705fdda 100644 (file)
@@ -1926,68 +1926,6 @@ err_ft:
        return ERR_PTR(err);
 }
 
-static struct mlx5_flow_handle *
-__mlx5_tc_ct_flow_offload_clear(struct mlx5_tc_ct_priv *ct_priv,
-                               struct mlx5_flow_spec *orig_spec,
-                               struct mlx5_flow_attr *attr,
-                               struct mlx5e_tc_mod_hdr_acts *mod_acts)
-{
-       struct mlx5e_priv *priv = netdev_priv(ct_priv->netdev);
-       u32 attr_sz = ns_to_attr_sz(ct_priv->ns_type);
-       struct mlx5_flow_attr *pre_ct_attr;
-       struct mlx5_modify_hdr *mod_hdr;
-       struct mlx5_flow_handle *rule;
-       struct mlx5_ct_flow *ct_flow;
-       int err;
-
-       ct_flow = kzalloc(sizeof(*ct_flow), GFP_KERNEL);
-       if (!ct_flow)
-               return ERR_PTR(-ENOMEM);
-
-       /* Base esw attributes on original rule attribute */
-       pre_ct_attr = mlx5_alloc_flow_attr(ct_priv->ns_type);
-       if (!pre_ct_attr) {
-               err = -ENOMEM;
-               goto err_attr;
-       }
-
-       memcpy(pre_ct_attr, attr, attr_sz);
-
-       mod_hdr = mlx5_modify_header_alloc(priv->mdev, ct_priv->ns_type,
-                                          mod_acts->num_actions,
-                                          mod_acts->actions);
-       if (IS_ERR(mod_hdr)) {
-               err = PTR_ERR(mod_hdr);
-               ct_dbg("Failed to add create ct clear mod hdr");
-               goto err_mod_hdr;
-       }
-
-       pre_ct_attr->modify_hdr = mod_hdr;
-
-       rule = mlx5_tc_rule_insert(priv, orig_spec, pre_ct_attr);
-       if (IS_ERR(rule)) {
-               err = PTR_ERR(rule);
-               ct_dbg("Failed to add ct clear rule");
-               goto err_insert;
-       }
-
-       attr->ct_attr.ct_flow = ct_flow;
-       ct_flow->pre_ct_attr = pre_ct_attr;
-       ct_flow->pre_ct_rule = rule;
-       return rule;
-
-err_insert:
-       mlx5_modify_header_dealloc(priv->mdev, mod_hdr);
-err_mod_hdr:
-       netdev_warn(priv->netdev,
-                   "Failed to offload ct clear flow, err %d\n", err);
-       kfree(pre_ct_attr);
-err_attr:
-       kfree(ct_flow);
-
-       return ERR_PTR(err);
-}
-
 struct mlx5_flow_handle *
 mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
                        struct mlx5e_tc_flow *flow,
@@ -1995,18 +1933,13 @@ mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
                        struct mlx5_flow_attr *attr,
                        struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts)
 {
-       bool clear_action = attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR;
        struct mlx5_flow_handle *rule;
 
        if (!priv)
                return ERR_PTR(-EOPNOTSUPP);
 
        mutex_lock(&priv->control_lock);
-
-       if (clear_action)
-               rule = __mlx5_tc_ct_flow_offload_clear(priv, spec, attr, mod_hdr_acts);
-       else
-               rule = __mlx5_tc_ct_flow_offload(priv, flow, spec, attr);
+       rule = __mlx5_tc_ct_flow_offload(priv, flow, spec, attr);
        mutex_unlock(&priv->control_lock);
 
        return rule;
@@ -2020,8 +1953,7 @@ __mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *ct_priv,
        struct mlx5_flow_attr *pre_ct_attr = ct_flow->pre_ct_attr;
        struct mlx5e_priv *priv = netdev_priv(ct_priv->netdev);
 
-       mlx5_tc_rule_delete(priv, ct_flow->pre_ct_rule,
-                           pre_ct_attr);
+       mlx5_tc_rule_delete(priv, ct_flow->pre_ct_rule, pre_ct_attr);
        mlx5_modify_header_dealloc(priv->mdev, pre_ct_attr->modify_hdr);
 
        if (ct_flow->post_act_handle) {
index e3195f6e67c712098af3ff99400f89d34ba0b0d0..a1007af89ddc138eb4f90a4359fecfd73b512cfa 100644 (file)
@@ -1574,8 +1574,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        if (err)
                goto err_out;
 
-       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
-           !(attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR)) {
+       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
                if (vf_tun) {
                        err = mlx5e_tc_add_flow_mod_hdr(priv, flow, attr);
                        if (err)