Skip to content

Commit e5b1db2

Browse files
roidayanSaeed Mahameed
authored andcommitted
net/mlx5e: TC, Allocate post meter ft per rule
To support a TC police action notexceed counter and supporting actions other than drop/pipe there is a need to create separate ft and rules per rule and not to use a common one created on eswitch init. Signed-off-by: Roi Dayan <[email protected]> Reviewed-by: Jianbo Liu <[email protected]> Reviewed-by: Oz Shlomo <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 8920d92 commit e5b1db2

File tree

3 files changed

+31
-20
lines changed

3 files changed

+31
-20
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include "en/tc/post_act.h"
77
#include "meter.h"
88
#include "en/tc_priv.h"
9-
#include "post_meter.h"
109

1110
#define MLX5_START_COLOR_SHIFT 28
1211
#define MLX5_METER_MODE_SHIFT 24
@@ -47,8 +46,6 @@ struct mlx5e_flow_meters {
4746

4847
struct mlx5_core_dev *mdev;
4948
struct mlx5e_post_act *post_act;
50-
51-
struct mlx5e_post_meter_priv *post_meter;
5249
};
5350

5451
static void
@@ -390,10 +387,10 @@ mlx5e_tc_meter_put(struct mlx5e_flow_meter_handle *meter)
390387
mutex_unlock(&flow_meters->sync_lock);
391388
}
392389

393-
struct mlx5_flow_table *
394-
mlx5e_tc_meter_get_post_meter_ft(struct mlx5e_flow_meters *flow_meters)
390+
enum mlx5_flow_namespace_type
391+
mlx5e_tc_meter_get_namespace(struct mlx5e_flow_meters *flow_meters)
395392
{
396-
return mlx5e_post_meter_get_ft(flow_meters->post_meter);
393+
return flow_meters->ns_type;
397394
}
398395

399396
struct mlx5e_flow_meters *
@@ -432,12 +429,6 @@ mlx5e_flow_meters_init(struct mlx5e_priv *priv,
432429
goto err_sq;
433430
}
434431

435-
flow_meters->post_meter = mlx5e_post_meter_init(priv, ns_type, post_act);
436-
if (IS_ERR(flow_meters->post_meter)) {
437-
err = PTR_ERR(flow_meters->post_meter);
438-
goto err_post_meter;
439-
}
440-
441432
mutex_init(&flow_meters->sync_lock);
442433
INIT_LIST_HEAD(&flow_meters->partial_list);
443434
INIT_LIST_HEAD(&flow_meters->full_list);
@@ -451,8 +442,6 @@ mlx5e_flow_meters_init(struct mlx5e_priv *priv,
451442

452443
return flow_meters;
453444

454-
err_post_meter:
455-
mlx5_aso_destroy(flow_meters->aso);
456445
err_sq:
457446
mlx5_core_dealloc_pd(mdev, flow_meters->pdn);
458447
err_out:
@@ -466,9 +455,7 @@ mlx5e_flow_meters_cleanup(struct mlx5e_flow_meters *flow_meters)
466455
if (IS_ERR_OR_NULL(flow_meters))
467456
return;
468457

469-
mlx5e_post_meter_cleanup(flow_meters->post_meter);
470458
mlx5_aso_destroy(flow_meters->aso);
471459
mlx5_core_dealloc_pd(flow_meters->mdev, flow_meters->pdn);
472-
473460
kfree(flow_meters);
474461
}

drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#ifndef __MLX5_EN_FLOW_METER_H__
55
#define __MLX5_EN_FLOW_METER_H__
66

7+
struct mlx5e_post_meter_priv;
78
struct mlx5e_flow_meter_aso_obj;
89
struct mlx5e_flow_meters;
910
struct mlx5_flow_attr;
@@ -35,6 +36,7 @@ struct mlx5e_flow_meter_handle {
3536
struct mlx5e_meter_attr {
3637
struct mlx5e_flow_meter_params params;
3738
struct mlx5e_flow_meter_handle *meter;
39+
struct mlx5e_post_meter_priv *post_meter;
3840
};
3941

4042
int
@@ -47,8 +49,8 @@ mlx5e_tc_meter_get(struct mlx5_core_dev *mdev, struct mlx5e_flow_meter_params *p
4749
void
4850
mlx5e_tc_meter_put(struct mlx5e_flow_meter_handle *meter);
4951

50-
struct mlx5_flow_table *
51-
mlx5e_tc_meter_get_post_meter_ft(struct mlx5e_flow_meters *flow_meters);
52+
enum mlx5_flow_namespace_type
53+
mlx5e_tc_meter_get_namespace(struct mlx5e_flow_meters *flow_meters);
5254

5355
struct mlx5e_flow_meters *
5456
mlx5e_flow_meters_init(struct mlx5e_priv *priv,

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,9 @@ static int
356356
mlx5e_tc_add_flow_meter(struct mlx5e_priv *priv,
357357
struct mlx5_flow_attr *attr)
358358
{
359+
struct mlx5e_post_act *post_act = get_post_action(priv);
360+
struct mlx5e_post_meter_priv *post_meter;
361+
enum mlx5_flow_namespace_type ns_type;
359362
struct mlx5e_flow_meter_handle *meter;
360363

361364
meter = mlx5e_tc_meter_get(priv->mdev, &attr->meter_attr.params);
@@ -364,11 +367,30 @@ mlx5e_tc_add_flow_meter(struct mlx5e_priv *priv,
364367
return PTR_ERR(meter);
365368
}
366369

370+
ns_type = mlx5e_tc_meter_get_namespace(meter->flow_meters);
371+
post_meter = mlx5e_post_meter_init(priv, ns_type, post_act);
372+
if (IS_ERR(post_meter)) {
373+
mlx5_core_err(priv->mdev, "Failed to init post meter\n");
374+
goto err_meter_init;
375+
}
376+
367377
attr->meter_attr.meter = meter;
368-
attr->dest_ft = mlx5e_tc_meter_get_post_meter_ft(meter->flow_meters);
378+
attr->meter_attr.post_meter = post_meter;
379+
attr->dest_ft = mlx5e_post_meter_get_ft(post_meter);
369380
attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
370381

371382
return 0;
383+
384+
err_meter_init:
385+
mlx5e_tc_meter_put(meter);
386+
return PTR_ERR(post_meter);
387+
}
388+
389+
static void
390+
mlx5e_tc_del_flow_meter(struct mlx5_flow_attr *attr)
391+
{
392+
mlx5e_post_meter_cleanup(attr->meter_attr.post_meter);
393+
mlx5e_tc_meter_put(attr->meter_attr.meter);
372394
}
373395

374396
struct mlx5_flow_handle *
@@ -428,7 +450,7 @@ mlx5e_tc_rule_unoffload(struct mlx5e_priv *priv,
428450
mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
429451

430452
if (attr->meter_attr.meter)
431-
mlx5e_tc_meter_put(attr->meter_attr.meter);
453+
mlx5e_tc_del_flow_meter(attr);
432454
}
433455

434456
int

0 commit comments

Comments
 (0)