OSDN Git Service

net/mlx5e: Refactor eswitch flow attr for destination specific properties
authorEli Britstein <elibr@mellanox.com>
Sat, 1 Dec 2018 07:40:43 +0000 (09:40 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 11 Dec 2018 22:52:19 +0000 (14:52 -0800)
Currently the eswitch flow attr structure stores each destination
specific property in its own specific array.
Group them in an array of destination structures as a pre-step towards
adding additional destination specific field properties.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 342f807..b24b758 100644 (file)
@@ -939,8 +939,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
                }
                out_priv = netdev_priv(encap_dev);
                rpriv = out_priv->ppriv;
-               attr->out_rep[attr->out_count] = rpriv->rep;
-               attr->out_mdev[attr->out_count++] = out_priv->mdev;
+               attr->dests[attr->out_count].rep = rpriv->rep;
+               attr->dests[attr->out_count++].mdev = out_priv->mdev;
        }
 
        err = mlx5_eswitch_add_vlan_action(esw, attr);
@@ -2468,8 +2468,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                          MLX5_FLOW_CONTEXT_ACTION_COUNT;
                                out_priv = netdev_priv(out_dev);
                                rpriv = out_priv->ppriv;
-                               attr->out_rep[attr->out_count] = rpriv->rep;
-                               attr->out_mdev[attr->out_count++] = out_priv->mdev;
+                               attr->dests[attr->out_count].rep = rpriv->rep;
+                               attr->dests[attr->out_count].mdev = out_priv->mdev;
+                               attr->out_count++;
                        } else if (encap) {
                                parse_attr->mirred_ifindex = out_dev->ifindex;
                                parse_attr->tun_info = *info;
@@ -2477,7 +2478,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
                                          MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
                                          MLX5_FLOW_CONTEXT_ACTION_COUNT;
-                               /* attr->out_rep is resolved when we handle encap */
+                               /* attr->dests[].rep is resolved when we
+                                * handle encap
+                                */
                        } else if (parse_attr->filter_dev != priv->netdev) {
                                /* All mlx5 devices are called to configure
                                 * high level device filters. Therefore, the
index c28ff64..5468975 100644 (file)
@@ -283,8 +283,6 @@ enum mlx5_flow_match_level {
 
 struct mlx5_esw_flow_attr {
        struct mlx5_eswitch_rep *in_rep;
-       struct mlx5_eswitch_rep *out_rep[MLX5_MAX_FLOW_FWD_VPORTS];
-       struct mlx5_core_dev    *out_mdev[MLX5_MAX_FLOW_FWD_VPORTS];
        struct mlx5_core_dev    *in_mdev;
 
        int split_count;
@@ -297,6 +295,10 @@ struct mlx5_esw_flow_attr {
        u8      total_vlan;
        bool    vlan_handled;
        u32     encap_id;
+       struct {
+               struct mlx5_eswitch_rep *rep;
+               struct mlx5_core_dev *mdev;
+       } dests[MLX5_MAX_FLOW_FWD_VPORTS];
        u32     mod_hdr_id;
        u8      match_level;
        struct mlx5_fc *counter;
index 63ac9d3..7cbe602 100644 (file)
@@ -122,9 +122,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                } else {
                        for (j = attr->split_count; j < attr->out_count; j++) {
                                dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-                               dest[i].vport.num = attr->out_rep[j]->vport;
+                               dest[i].vport.num = attr->dests[j].rep->vport;
                                dest[i].vport.vhca_id =
-                                       MLX5_CAP_GEN(attr->out_mdev[j], vhca_id);
+                                       MLX5_CAP_GEN(attr->dests[j].mdev, vhca_id);
                                if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
                                        dest[i].vport.flags |=
                                                MLX5_FLOW_DEST_VPORT_VHCA_ID;
@@ -218,9 +218,9 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
        for (i = 0; i < attr->split_count; i++) {
                dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-               dest[i].vport.num = attr->out_rep[i]->vport;
+               dest[i].vport.num = attr->dests[i].rep->vport;
                dest[i].vport.vhca_id =
-                       MLX5_CAP_GEN(attr->out_mdev[i], vhca_id);
+                       MLX5_CAP_GEN(attr->dests[i].mdev, vhca_id);
                if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
                        dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
        }
@@ -327,7 +327,7 @@ esw_vlan_action_get_vport(struct mlx5_esw_flow_attr *attr, bool push, bool pop)
        struct mlx5_eswitch_rep *in_rep, *out_rep, *vport = NULL;
 
        in_rep  = attr->in_rep;
-       out_rep = attr->out_rep[0];
+       out_rep = attr->dests[0].rep;
 
        if (push)
                vport = in_rep;
@@ -348,7 +348,7 @@ static int esw_add_vlan_action_check(struct mlx5_esw_flow_attr *attr,
                goto out_notsupp;
 
        in_rep  = attr->in_rep;
-       out_rep = attr->out_rep[0];
+       out_rep = attr->dests[0].rep;
 
        if (push && in_rep->vport == FDB_UPLINK_VPORT)
                goto out_notsupp;
@@ -400,7 +400,7 @@ int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
 
        if (!push && !pop && fwd) {
                /* tracks VF --> wire rules without vlan push action */
-               if (attr->out_rep[0]->vport == FDB_UPLINK_VPORT) {
+               if (attr->dests[0].rep->vport == FDB_UPLINK_VPORT) {
                        vport->vlan_refcount++;
                        attr->vlan_handled = true;
                }
@@ -460,7 +460,7 @@ int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
 
        if (!push && !pop && fwd) {
                /* tracks VF --> wire rules without vlan push action */
-               if (attr->out_rep[0]->vport == FDB_UPLINK_VPORT)
+               if (attr->dests[0].rep->vport == FDB_UPLINK_VPORT)
                        vport->vlan_refcount--;
 
                return 0;