OSDN Git Service

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 eacccac..779ca3a 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 4d048f7..701abd7 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;