net/mlx5e: Enhance flow counter scheme for offloaded TC eswitch rules
authorShahar Klein <shahark@mellanox.com>
Thu, 30 Nov 2017 15:55:46 +0000 (17:55 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 14 Dec 2018 21:28:52 +0000 (13:28 -0800)
Assign a counter dev attribute according to device capability and use
it for management of counters related to offloaded eswitch TC flows.

With upcoming support for uplink LAG, we have two HW rules per one
logical SW (TC) rule. Although the HW supports attaching one counter
to multiple rules, we are allocating counter per HW rule.

We need this separation for two reasons:

1. "flow eswitch" counter affinity HW require the counter to be
allocated on the device where the eswitch rule is set.

2. for some use-cases (multi-path routing) each HW flow relates to
different neighbour, hence our neigh update logic must have a per-rule
HW accountant in order to provide the proper feedback to the kernel.

Signed-off-by: Shahar Klein <shahark@mellanox.com>
Signed-off-by: Roi Dayan <roid@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

index eacccac05dda5920f0b8933c8806b36c2dfe3f97..779ca3a43bec7e5f29e7b435ba9d665efdade771 100644 (file)
@@ -994,7 +994,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        }
 
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
-               counter = mlx5_fc_create(esw->dev, true);
+               counter = mlx5_fc_create(attr->counter_dev, true);
                if (IS_ERR(counter)) {
                        err = PTR_ERR(counter);
                        goto err_create_counter;
@@ -1023,7 +1023,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        return 0;
 
 err_add_rule:
-       mlx5_fc_destroy(esw->dev, counter);
+       mlx5_fc_destroy(attr->counter_dev, counter);
 err_create_counter:
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
                mlx5e_detach_mod_hdr(priv, flow);
@@ -1064,7 +1064,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
                mlx5e_detach_mod_hdr(priv, flow);
 
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_COUNT)
-               mlx5_fc_destroy(esw->dev, attr->counter);
+               mlx5_fc_destroy(attr->counter_dev, attr->counter);
 }
 
 void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
@@ -2746,6 +2746,7 @@ __mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
                     struct mlx5e_tc_flow **__flow)
 {
        struct netlink_ext_ack *extack = f->common.extack;
+       struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
        struct mlx5e_tc_flow_parse_attr *parse_attr;
        struct mlx5e_tc_flow *flow;
        int attr_size, err;
@@ -2771,6 +2772,13 @@ __mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
 
        flow->esw_attr->in_rep = in_rep;
        flow->esw_attr->in_mdev = in_mdev;
+
+       if (MLX5_CAP_ESW(esw->dev, counter_eswitch_affinity) ==
+           MLX5_COUNTER_SOURCE_ESWITCH)
+               flow->esw_attr->counter_dev = in_mdev;
+       else
+               flow->esw_attr->counter_dev = priv->mdev;
+
        err = mlx5e_tc_add_fdb_flow(priv, parse_attr, flow, extack);
        if (err)
                goto err_free;
index 4d048f7e703b96a793f9554202a7ac2fa9b47f8e..701abd794dab032bf82e7d40182ea91e6ca6f3a4 100644 (file)
@@ -293,6 +293,7 @@ enum {
 struct mlx5_esw_flow_attr {
        struct mlx5_eswitch_rep *in_rep;
        struct mlx5_core_dev    *in_mdev;
+       struct mlx5_core_dev    *counter_dev;
 
        int split_count;
        int out_count;