net/mlx5: Consolidate flow rules regardless their flow tag
authorMaor Gottlieb <maorg@mellanox.com>
Wed, 18 Jan 2017 12:59:47 +0000 (14:59 +0200)
committerDoug Ledford <dledford@redhat.com>
Tue, 14 Feb 2017 15:21:01 +0000 (10:21 -0500)
Flow rules with same match criteria and value should be mapped to
the same flow table entry regardless the flow tag identifier.

Flow tag is part of flow table entry context and not of the
destination, therefore we should return error when we try to add
destination to flow table entry with different flow tag.

Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 0ac7a2fc916c438bc535b20d45964009747f0b33..2f4eb99a50fa0001bfaf27236203569f8f445929 100644 (file)
@@ -1232,10 +1232,18 @@ static struct mlx5_flow_handle *add_rule_fg(struct mlx5_flow_group *fg,
        fs_for_each_fte(fte, fg) {
                nested_lock_ref_node(&fte->node, FS_MUTEX_CHILD);
                if (compare_match_value(&fg->mask, match_value, &fte->val) &&
-                   (flow_act->action & fte->action) &&
-                   flow_act->flow_tag == fte->flow_tag) {
+                   (flow_act->action & fte->action)) {
                        int old_action = fte->action;
 
+                       if (fte->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",
+                                              fte->flow_tag,
+                                              flow_act->flow_tag);
+                               handle = ERR_PTR(-EEXIST);
+                               goto unlock_fte;
+                       }
+
                        fte->action |= flow_act->action;
                        handle = add_rule_fte(fte, fg, dest, dest_num,
                                              old_action != flow_act->action);