]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/mlx5: E-Switch, Get counters for offloaded flows from callers
authorMark Bloch <markb@mellanox.com>
Tue, 2 Oct 2018 22:57:24 +0000 (22:57 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 17 Oct 2018 21:15:48 +0000 (14:15 -0700)
There's no real reason for the e-switch logic to manage the creation of
counters for offloaded flows. The API already has the directive for the
caller to denote they want to attach a counter to the created flow.
As such, we go and move the management of flow counters to the mlx5e
tc offload logic. This also lets us remove an inelegant interface where
the FS layer had to provide a way to retrieve a counter from a flow rule.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@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
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
include/linux/mlx5/fs.h

index acf7a847f56167a9d872f8d3c6f4ed024571c5e9..8a27c0813a18b1e2bc4313f13ba9222aed94862c 100644 (file)
@@ -61,6 +61,7 @@ struct mlx5_nic_flow_attr {
        u32 hairpin_tirn;
        u8 match_level;
        struct mlx5_flow_table  *hairpin_ft;
+       struct mlx5_fc          *counter;
 };
 
 #define MLX5E_TC_FLOW_BASE (MLX5E_TC_LAST_EXPORTED_BIT + 1)
@@ -721,6 +722,7 @@ mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,
                dest[dest_ix].type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
                dest[dest_ix].counter = counter;
                dest_ix++;
+               attr->counter = counter;
        }
 
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
@@ -797,7 +799,7 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,
        struct mlx5_nic_flow_attr *attr = flow->nic_attr;
        struct mlx5_fc *counter = NULL;
 
-       counter = mlx5_flow_rule_counter(flow->rule[0]);
+       counter = attr->counter;
        mlx5_del_flow_rules(flow->rule[0]);
        mlx5_fc_destroy(priv->mdev, counter);
 
@@ -833,6 +835,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        struct mlx5_esw_flow_attr *attr = flow->esw_attr;
        struct net_device *out_dev, *encap_dev = NULL;
        struct mlx5_flow_handle *rule = NULL;
+       struct mlx5_fc *counter = NULL;
        struct mlx5e_rep_priv *rpriv;
        struct mlx5e_priv *out_priv;
        int err;
@@ -868,6 +871,16 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
                }
        }
 
+       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
+               counter = mlx5_fc_create(esw->dev, true);
+               if (IS_ERR(counter)) {
+                       rule = ERR_CAST(counter);
+                       goto err_create_counter;
+               }
+
+               attr->counter = counter;
+       }
+
        /* we get here if (1) there's no error (rule being null) or when
         * (2) there's an encap action and we're on -EAGAIN (no valid neigh)
         */
@@ -888,6 +901,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
        rule = flow->rule[1];
 err_add_rule:
+       mlx5_fc_destroy(esw->dev, counter);
+err_create_counter:
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
                mlx5e_detach_mod_hdr(priv, flow);
 err_mod_hdr:
@@ -921,6 +936,9 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
 
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
                mlx5e_detach_mod_hdr(priv, flow);
+
+       if (attr->action & MLX5_FLOW_CONTEXT_ACTION_COUNT)
+               mlx5_fc_destroy(esw->dev, attr->counter);
 }
 
 void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
@@ -992,6 +1010,14 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,
        }
 }
 
+static struct mlx5_fc *mlx5e_tc_get_counter(struct mlx5e_tc_flow *flow)
+{
+       if (flow->flags & MLX5E_TC_FLOW_ESWITCH)
+               return flow->esw_attr->counter;
+       else
+               return flow->nic_attr->counter;
+}
+
 void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
 {
        struct mlx5e_neigh *m_neigh = &nhe->m_neigh;
@@ -1017,7 +1043,7 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
                        continue;
                list_for_each_entry(flow, &e->flows, encap) {
                        if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) {
-                               counter = mlx5_flow_rule_counter(flow->rule[0]);
+                               counter = mlx5e_tc_get_counter(flow);
                                mlx5_fc_query_cached(counter, &bytes, &packets, &lastuse);
                                if (time_after((unsigned long)lastuse, nhe->reported_lastuse)) {
                                        neigh_used = true;
@@ -3019,7 +3045,7 @@ int mlx5e_stats_flower(struct mlx5e_priv *priv,
        if (!(flow->flags & MLX5E_TC_FLOW_OFFLOADED))
                return 0;
 
-       counter = mlx5_flow_rule_counter(flow->rule[0]);
+       counter = mlx5e_tc_get_counter(flow);
        if (!counter)
                return 0;
 
index dfc642de4e6d5783c56365c80e8ef0910a025233..c1b6275770038aa090bbcea382426ba052a80704 100644 (file)
@@ -266,6 +266,7 @@ struct mlx5_esw_flow_attr {
        u32     encap_id;
        u32     mod_hdr_id;
        u8      match_level;
+       struct mlx5_fc *counter;
        struct mlx5e_tc_flow_parse_attr *parse_attr;
 };
 
index 0741683f7d7011b95e8c27747776c213beec0c4e..a2f2d726c99b30c76671f6766b3a0a57ab1d33fc 100644 (file)
@@ -51,7 +51,6 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
        struct mlx5_flow_destination dest[MLX5_MAX_FLOW_FWD_VPORTS + 1] = {};
        struct mlx5_flow_act flow_act = {0};
        struct mlx5_flow_table *ft = NULL;
-       struct mlx5_fc *counter = NULL;
        struct mlx5_flow_handle *rule;
        int j, i = 0;
        void *misc;
@@ -91,13 +90,8 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                }
        }
        if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
-               counter = mlx5_fc_create(esw->dev, true);
-               if (IS_ERR(counter)) {
-                       rule = ERR_CAST(counter);
-                       goto err_counter_alloc;
-               }
                dest[i].type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
-               dest[i].counter = counter;
+               dest[i].counter = attr->counter;
                i++;
        }
 
@@ -132,15 +126,11 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 
        rule = mlx5_add_flow_rules(ft, spec, &flow_act, dest, i);
        if (IS_ERR(rule))
-               goto err_add_rule;
+               goto out;
        else
                esw->offloads.num_flows++;
 
-       return rule;
-
-err_add_rule:
-       mlx5_fc_destroy(esw->dev, counter);
-err_counter_alloc:
+out:
        return rule;
 }
 
@@ -200,11 +190,7 @@ mlx5_eswitch_del_offloaded_rule(struct mlx5_eswitch *esw,
                                struct mlx5_flow_handle *rule,
                                struct mlx5_esw_flow_attr *attr)
 {
-       struct mlx5_fc *counter = NULL;
-
-       counter = mlx5_flow_rule_counter(rule);
        mlx5_del_flow_rules(rule);
-       mlx5_fc_destroy(esw->dev, counter);
        esw->offloads.num_flows--;
 }
 
index 8d340e5181f8dadea456133ff9eb2279861e8521..9e18e6c0a8b3267554f6f076c45e53c073746d5d 100644 (file)
@@ -1474,21 +1474,6 @@ static struct mlx5_flow_handle *add_rule_fg(struct mlx5_flow_group *fg,
        return handle;
 }
 
-struct mlx5_fc *mlx5_flow_rule_counter(struct mlx5_flow_handle *handle)
-{
-       struct mlx5_flow_rule *dst;
-       struct fs_fte *fte;
-
-       fs_get_obj(fte, handle->rule[0]->node.parent);
-
-       fs_for_each_dst(dst, fte) {
-               if (dst->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_COUNTER)
-                       return dst->dest_attr.counter;
-       }
-
-       return NULL;
-}
-
 static bool counter_is_valid(struct mlx5_fc *counter, u32 action)
 {
        if (!(action & MLX5_FLOW_CONTEXT_ACTION_COUNT))
index b1c026f1c8ba7efb1a25fb03e2d9a722436db222..74d0ea146c9aff75ef7f1b21bd23b2f88b418e11 100644 (file)
@@ -186,7 +186,6 @@ int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler,
                                 struct mlx5_flow_destination *new_dest,
                                 struct mlx5_flow_destination *old_dest);
 
-struct mlx5_fc *mlx5_flow_rule_counter(struct mlx5_flow_handle *handler);
 struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
 void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
 void mlx5_fc_query_cached(struct mlx5_fc *counter,