summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c
diff options
context:
space:
mode:
authorJianbo Liu <jianbol@nvidia.com>2021-06-18 06:47:15 +0000
committerSaeed Mahameed <saeedm@nvidia.com>2022-07-02 11:58:29 -0700
commit06fe52a476599f309b230e0f0f8e17ec68b49ae9 (patch)
tree8e2d2c734af2150de04d3c45d7785caf688b15fa /drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c
parent17c5da03879b97da91968e3db58c19e1679e457c (diff)
net/mlx5e: Add post meter table for flow metering
Flow meter object monitors the packets rate for the flows it is attached to, and color packets with GREEN or RED. The post meter table is used to check the color. Packet is dropped if it's RED, or forwarded to post_act table if GREEN. Packet color will be set to 8 LSB of the register C5, so they are reserved for metering, which are previously used for matching fte id. Signed-off-by: Jianbo Liu <jianbol@nvidia.com> Reviewed-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Ariel Levkovich <lariel@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c
index e406651a1dc2..d847181a6c37 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c
@@ -5,6 +5,7 @@
#include "en/tc/post_act.h"
#include "meter.h"
#include "en/tc_priv.h"
+#include "post_meter.h"
#define MLX5_START_COLOR_SHIFT 28
#define MLX5_METER_MODE_SHIFT 24
@@ -45,6 +46,8 @@ struct mlx5e_flow_meters {
struct mlx5_core_dev *mdev;
struct mlx5e_post_act *post_act;
+
+ struct mlx5e_post_meter_priv *post_meter;
};
static void
@@ -422,6 +425,12 @@ mlx5e_flow_meters_init(struct mlx5e_priv *priv,
goto err_sq;
}
+ flow_meters->post_meter = mlx5e_post_meter_init(priv, ns_type, post_act);
+ if (IS_ERR(flow_meters->post_meter)) {
+ err = PTR_ERR(flow_meters->post_meter);
+ goto err_post_meter;
+ }
+
mutex_init(&flow_meters->sync_lock);
INIT_LIST_HEAD(&flow_meters->partial_list);
INIT_LIST_HEAD(&flow_meters->full_list);
@@ -435,6 +444,8 @@ mlx5e_flow_meters_init(struct mlx5e_priv *priv,
return flow_meters;
+err_post_meter:
+ mlx5_aso_destroy(flow_meters->aso);
err_sq:
mlx5_core_dealloc_pd(mdev, flow_meters->pdn);
err_out:
@@ -448,6 +459,7 @@ mlx5e_flow_meters_cleanup(struct mlx5e_flow_meters *flow_meters)
if (IS_ERR_OR_NULL(flow_meters))
return;
+ mlx5e_post_meter_cleanup(flow_meters->post_meter);
mlx5_aso_destroy(flow_meters->aso);
mlx5_core_dealloc_pd(flow_meters->mdev, flow_meters->pdn);