{net,IB}/mlx5: Add has_tag to mlx5_flow_act
authorMatan Barak <matanb@mellanox.com>
Wed, 16 Aug 2017 06:43:48 +0000 (09:43 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 7 Mar 2018 06:06:33 +0000 (22:06 -0800)
The has_tag member will indicate whether a tag action was specified
in flow specification.

A flow tag 0 = MLX5_FS_DEFAULT_FLOW_TAG is assumed a valid flow tag
that is currently used by mlx5 RDMA driver, whereas in HW flow_tag = 0
means that the user doesn't care about flow_tag.  HW always provide
a flow_tag = 0 if all flow tags requested on a specific flow are 0.

So we need a way (in the driver) to differentiate between a user really
requesting flow_tag = 0 and a user who does not care, in order to be
able to report conflicting flow tags on a specific flow.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Reviewed-by: Aviad Yehezkel <aviadye@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/fs_core.c
include/linux/mlx5/fs.h

index 1b305367a8179954593cbfff1ded8e8263d25c61..d50ace805995478ebcda3940cd8a9805784b9d59 100644 (file)
@@ -2535,6 +2535,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;
                break;
        case IB_FLOW_SPEC_ACTION_DROP:
                if (FIELDS_NOT_SUPPORTED(ib_spec->drop,
@@ -2847,7 +2848,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.flow_tag != MLX5_FS_DEFAULT_FLOW_TAG &&
+       if (flow_act.has_flow_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 fd98b0dc610fffce72c7702598271825be6e9160..eeff1fac77ef3843c0ef2a685da27f3a7dda1e17 100644 (file)
@@ -675,6 +675,7 @@ 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,
                .encap_id = 0,
        };
index c025c98700e4cd627a503d8a982f7854421da5b6..d81da6920be86e2be0bdf137c3ac466067f88242 100644 (file)
@@ -1443,7 +1443,7 @@ static int check_conflicting_ftes(struct fs_fte *fte, const struct mlx5_flow_act
                return -EEXIST;
        }
 
-       if (fte->flow_tag != flow_act->flow_tag) {
+       if (flow_act->has_flow_tag && 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,
index a0b48afcb4222aa548b62d8d4e8d87f605273bf8..f580bc4c2443ab0b493febfac35851b3e49ed330 100644 (file)
@@ -141,6 +141,7 @@ void mlx5_destroy_flow_group(struct mlx5_flow_group *fg);
 
 struct mlx5_flow_act {
        u32 action;
+       bool has_flow_tag;
        u32 flow_tag;
        u32 encap_id;
        u32 modify_id;