]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net/mlx5: Accept flow rules without match
authorMark Bloch <markb@mellanox.com>
Fri, 17 Jan 2020 18:30:32 +0000 (18:30 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 13 Mar 2020 23:26:17 +0000 (16:26 -0700)
Allow passing NULL spec when creating a flow rule. Such rules will act
as "catch all" flow rules.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 2c75b2752f58de0e7d0c3e9760736d7ee8035211..014639ea06e344be5aeba144c0b5ff66293ecb48 100644 (file)
@@ -175,28 +175,20 @@ static int arfs_add_default_rule(struct mlx5e_priv *priv,
        struct mlx5e_tir *tir = priv->indir_tir;
        struct mlx5_flow_destination dest = {};
        MLX5_DECLARE_FLOW_ACT(flow_act);
-       struct mlx5_flow_spec *spec;
        enum mlx5e_traffic_types tt;
        int err = 0;
 
-       spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
-       if (!spec) {
-               err = -ENOMEM;
-               goto out;
-       }
-
        dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
        tt = arfs_get_tt(type);
        if (tt == -EINVAL) {
                netdev_err(priv->netdev, "%s: bad arfs_type: %d\n",
                           __func__, type);
-               err = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        dest.tir_num = tir[tt].tirn;
 
-       arfs_t->default_rule = mlx5_add_flow_rules(arfs_t->ft.t, spec,
+       arfs_t->default_rule = mlx5_add_flow_rules(arfs_t->ft.t, NULL,
                                                   &flow_act,
                                                   &dest, 1);
        if (IS_ERR(arfs_t->default_rule)) {
@@ -205,8 +197,7 @@ static int arfs_add_default_rule(struct mlx5e_priv *priv,
                netdev_err(priv->netdev, "%s: add rule failed, arfs type=%d\n",
                           __func__, type);
        }
-out:
-       kvfree(spec);
+
        return err;
 }
 
index 1de2472a72e7f71643deab4d513671a767bf4619..54e5334f02a7786edc7b1e2d9850e3c8c8603d88 100644 (file)
@@ -1334,7 +1334,6 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
                goto out;
        }
 
-       memset(spec, 0, sizeof(*spec));
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
 
        /* Attach drop flow counter */
@@ -1346,7 +1345,7 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
                dest_num++;
        }
        vport->ingress.legacy.drop_rule =
-               mlx5_add_flow_rules(vport->ingress.acl, spec,
+               mlx5_add_flow_rules(vport->ingress.acl, NULL,
                                    &flow_act, dst, dest_num);
        if (IS_ERR(vport->ingress.legacy.drop_rule)) {
                err = PTR_ERR(vport->ingress.legacy.drop_rule);
@@ -1409,7 +1408,6 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw,
        struct mlx5_flow_destination drop_ctr_dst = {0};
        struct mlx5_flow_destination *dst = NULL;
        struct mlx5_flow_act flow_act = {0};
-       struct mlx5_flow_spec *spec;
        int dest_num = 0;
        int err = 0;
 
@@ -1438,11 +1436,6 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw,
        if (err)
                return err;
 
-       /* Drop others rule (star rule) */
-       spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
-       if (!spec)
-               goto out;
-
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
 
        /* Attach egress drop flow counter */
@@ -1454,7 +1447,7 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw,
                dest_num++;
        }
        vport->egress.legacy.drop_rule =
-               mlx5_add_flow_rules(vport->egress.acl, spec,
+               mlx5_add_flow_rules(vport->egress.acl, NULL,
                                    &flow_act, dst, dest_num);
        if (IS_ERR(vport->egress.legacy.drop_rule)) {
                err = PTR_ERR(vport->egress.legacy.drop_rule);
@@ -1463,8 +1456,7 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw,
                         vport->vport, err);
                vport->egress.legacy.drop_rule = NULL;
        }
-out:
-       kvfree(spec);
+
        return err;
 }
 
@@ -2481,12 +2473,11 @@ static int _mlx5_eswitch_set_vepa_locked(struct mlx5_eswitch *esw,
        }
 
        /* Star rule to forward all traffic to uplink vport */
-       memset(spec, 0, sizeof(*spec));
        memset(&dest, 0, sizeof(dest));
        dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
        dest.vport.num = MLX5_VPORT_UPLINK;
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
-       flow_rule = mlx5_add_flow_rules(esw->fdb_table.legacy.vepa_fdb, spec,
+       flow_rule = mlx5_add_flow_rules(esw->fdb_table.legacy.vepa_fdb, NULL,
                                        &flow_act, &dest, 1);
        if (IS_ERR(flow_rule)) {
                err = PTR_ERR(flow_rule);
index aedbb026ed990fa0d0230df760089a60605d59de..8ff52e237bcb30b6afc2e3335983d162c0ea9c9f 100644 (file)
@@ -1881,7 +1881,6 @@ static int esw_vport_add_ingress_acl_modify_metadata(struct mlx5_eswitch *esw,
                                                     struct mlx5_vport *vport)
 {
        u8 action[MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto)] = {};
-       static const struct mlx5_flow_spec spec = {};
        struct mlx5_flow_act flow_act = {};
        int err = 0;
        u32 key;
@@ -1913,7 +1912,7 @@ static int esw_vport_add_ingress_acl_modify_metadata(struct mlx5_eswitch *esw,
        flow_act.modify_hdr = vport->ingress.offloads.modify_metadata;
        vport->ingress.offloads.modify_metadata_rule =
                                mlx5_add_flow_rules(vport->ingress.acl,
-                                                   &spec, &flow_act, NULL, 0);
+                                                   NULL, &flow_act, NULL, 0);
        if (IS_ERR(vport->ingress.offloads.modify_metadata_rule)) {
                err = PTR_ERR(vport->ingress.offloads.modify_metadata_rule);
                esw_warn(esw->dev,
index 0702c216a0317d6100888ef043dc095b2e538206..81421d4fb18d316ad1b746a0df48f419a38fc35e 100644 (file)
@@ -410,7 +410,6 @@ mlx5_esw_chains_add_miss_rule(struct fdb_chain *fdb_chain,
                              struct mlx5_flow_table *fdb,
                              struct mlx5_flow_table *next_fdb)
 {
-       static const struct mlx5_flow_spec spec = {};
        struct mlx5_eswitch *esw = fdb_chain->esw;
        struct mlx5_flow_destination dest = {};
        struct mlx5_flow_act act = {};
@@ -425,7 +424,7 @@ mlx5_esw_chains_add_miss_rule(struct fdb_chain *fdb_chain,
                act.action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
        }
 
-       return mlx5_add_flow_rules(fdb, &spec, &act, &dest, 1);
+       return mlx5_add_flow_rules(fdb, NULL, &act, &dest, 1);
 }
 
 static int
index f3a925e5ba88a2b2f51a9adec01d417b487fc3ec..269eddc3d38bba4aa3df051382275be01fee343d 100644 (file)
@@ -49,7 +49,6 @@ mlx5_eswitch_termtbl_create(struct mlx5_core_dev *dev,
                            struct mlx5_termtbl_handle *tt,
                            struct mlx5_flow_act *flow_act)
 {
-       static const struct mlx5_flow_spec spec = {};
        struct mlx5_flow_table_attr ft_attr = {};
        struct mlx5_flow_namespace *root_ns;
        int err;
@@ -73,7 +72,7 @@ mlx5_eswitch_termtbl_create(struct mlx5_core_dev *dev,
                return -EOPNOTSUPP;
        }
 
-       tt->rule = mlx5_add_flow_rules(tt->termtbl, &spec, flow_act,
+       tt->rule = mlx5_add_flow_rules(tt->termtbl, NULL, flow_act,
                                       &tt->dest, 1);
 
        if (IS_ERR(tt->rule)) {
index bd0b2e4f344601f04ee400d483b3642e0aa69a03..c93bd55fab0658f0706b63d9ceb9703b71cf45d6 100644 (file)
@@ -1892,12 +1892,16 @@ mlx5_add_flow_rules(struct mlx5_flow_table *ft,
                    int num_dest)
 {
        struct mlx5_flow_root_namespace *root = find_root(&ft->node);
+       static const struct mlx5_flow_spec zero_spec = {};
        struct mlx5_flow_destination gen_dest = {};
        struct mlx5_flow_table *next_ft = NULL;
        struct mlx5_flow_handle *handle = NULL;
        u32 sw_action = flow_act->action;
        struct fs_prio *prio;
 
+       if (!spec)
+               spec = &zero_spec;
+
        fs_get_obj(prio, ft->node.parent);
        if (flow_act->action == MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO) {
                if (!fwd_next_prio_supported(ft))