net/mlx5: Add a no-append flow insertion mode
authorPaul Blakey <paulb@mellanox.com>
Thu, 20 Sep 2018 10:17:48 +0000 (12:17 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 17 Oct 2018 21:18:50 +0000 (14:18 -0700)
If no-append flag is set, we will add a new FTE, instead of appending
the actions of the inserted rule when the same match already exists.

While here, move the has_flow_tag boolean indicator to be a flag too.

This patch doesn't change any functionality.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanmox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/infiniband/hw/mlx5/main.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
include/linux/mlx5/fs.h

index 5ced0cc46ba15a0cec72a57ad6fabbb7ad106fab..af32899bb72a7c00f882b386de49f391b1e0bf6d 100644 (file)
@@ -2793,7 +2793,7 @@ static int parse_flow_attr(struct mlx5_core_dev *mdev, u32 *match_c,
                        return -EINVAL;
 
                action->flow_tag = ib_spec->flow_tag.tag_id;
-               action->has_flow_tag = true;
+               action->flags |= FLOW_ACT_HAS_TAG;
                break;
        case IB_FLOW_SPEC_ACTION_DROP:
                if (FIELDS_NOT_SUPPORTED(ib_spec->drop,
@@ -2886,7 +2886,7 @@ is_valid_esp_aes_gcm(struct mlx5_core_dev *mdev,
                return egress ? VALID_SPEC_INVALID : VALID_SPEC_NA;
 
        return is_crypto && is_ipsec &&
-               (!egress || (!is_drop && !flow_act->has_flow_tag)) ?
+               (!egress || (!is_drop && !(flow_act->flags & FLOW_ACT_HAS_TAG))) ?
                VALID_SPEC_VALID : VALID_SPEC_INVALID;
 }
 
@@ -3349,7 +3349,7 @@ static struct mlx5_ib_flow_handler *_create_flow_rule(struct mlx5_ib_dev *dev,
                                        MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;
        }
 
-       if (flow_act.has_flow_tag &&
+       if ((flow_act.flags & FLOW_ACT_HAS_TAG)  &&
            (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||
             flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT)) {
                mlx5_ib_warn(dev, "Flow tag %u and attribute type %x isn't allowed in leftovers\n",
index 6c04e11f9a05671e48675fa9ed9122c347ce36ef..a9c68b7859b42c8feb1d1a72cf76094ca9442413 100644 (file)
@@ -684,9 +684,9 @@ mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,
        struct mlx5_flow_destination dest[2] = {};
        struct mlx5_flow_act flow_act = {
                .action = attr->action,
-               .has_flow_tag = true,
                .flow_tag = attr->flow_tag,
                .reformat_id = 0,
+               .flags    = FLOW_ACT_HAS_TAG,
        };
        struct mlx5_fc *counter = NULL;
        bool table_created = false;
index 5645a4facad2f3e5cc1a4a48553e6f83142e72dc..28aa8c968a80ddfb0513ab4d70300790dd87b0b1 100644 (file)
@@ -650,7 +650,7 @@ static bool mlx5_is_fpga_egress_ipsec_rule(struct mlx5_core_dev *dev,
            (match_criteria_enable &
             ~(MLX5_MATCH_OUTER_HEADERS | MLX5_MATCH_MISC_PARAMETERS)) ||
            (flow_act->action & ~(MLX5_FLOW_CONTEXT_ACTION_ENCRYPT | MLX5_FLOW_CONTEXT_ACTION_ALLOW)) ||
-            flow_act->has_flow_tag)
+            (flow_act->flags & FLOW_ACT_HAS_TAG))
                return false;
 
        return true;
index 7eb6d58733accb64ffa679a3c20d68d7fa7c2bf1..67ba4c975d814a6705a4431c0cf2f4861ee7ae44 100644 (file)
@@ -1428,7 +1428,7 @@ static int check_conflicting_ftes(struct fs_fte *fte, const struct mlx5_flow_act
                return -EEXIST;
        }
 
-       if (flow_act->has_flow_tag &&
+       if ((flow_act->flags & FLOW_ACT_HAS_TAG) &&
            fte->action.flow_tag != flow_act->flow_tag) {
                mlx5_core_warn(get_dev(&fte->node),
                               "FTE flow tag %u already exists with different flow tag %u\n",
@@ -1628,6 +1628,8 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
 
 search_again_locked:
        version = matched_fgs_get_version(match_head);
+       if (flow_act->flags & FLOW_ACT_NO_APPEND)
+               goto skip_search;
        /* Try to find a fg that already contains a matching fte */
        list_for_each_entry(iter, match_head, list) {
                struct fs_fte *fte_tmp;
@@ -1644,6 +1646,11 @@ search_again_locked:
                return rule;
        }
 
+skip_search:
+       /* No group with matching fte found, or we skipped the search.
+        * Try to add a new fte to any matching fg.
+        */
+
        /* Check the ft version, for case that new flow group
         * was added while the fgs weren't locked
         */
index f8d00872c7d370e752971918afcbef9a33fe24a9..5660f07d3be00082c58cb1df64ba8a273a675d3d 100644 (file)
@@ -158,20 +158,28 @@ struct mlx5_fs_vlan {
 
 #define MLX5_FS_VLAN_DEPTH     2
 
+enum {
+       FLOW_ACT_HAS_TAG   = BIT(0),
+       FLOW_ACT_NO_APPEND = BIT(1),
+};
+
 struct mlx5_flow_act {
        u32 action;
-       bool has_flow_tag;
        u32 flow_tag;
        u32 reformat_id;
        u32 modify_id;
        uintptr_t esp_id;
+       u32 flags;
        struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
        struct ib_counters *counters;
 };
 
 #define MLX5_DECLARE_FLOW_ACT(name) \
-       struct mlx5_flow_act name = {MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\
-                                    MLX5_FS_DEFAULT_FLOW_TAG, 0, 0}
+       struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\
+                                     .flow_tag = MLX5_FS_DEFAULT_FLOW_TAG, \
+                                     .reformat_id = 0, \
+                                     .modify_id = 0, \
+                                     .flags =  0, }
 
 /* Single destination per rule.
  * Group ID is implied by the match criteria.