net/mlx5: E-Switch, Fix double allocation of acl flow counter
[ Upstream commit a586775f83bd729ad60b56352dbe067f4bb0beee ] Flow counter is allocated in eswitch legacy acl setting functions without checking if already allocated by previous setting. Add a check to avoid such double allocation. Fixes:07bab95026
("net/mlx5: E-Switch, Refactor eswitch ingress acl codes") Fixes:ea651a86d4
("net/mlx5: E-Switch, Refactor eswitch egress acl codes") Signed-off-by: Moshe Shemesh <moshe@nvidia.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
d70cb6c77a
commit
6e6f79e398
@ -79,12 +79,16 @@ int esw_acl_egress_lgcy_setup(struct mlx5_eswitch *esw,
|
|||||||
int dest_num = 0;
|
int dest_num = 0;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (MLX5_CAP_ESW_EGRESS_ACL(esw->dev, flow_counter)) {
|
if (vport->egress.legacy.drop_counter) {
|
||||||
|
drop_counter = vport->egress.legacy.drop_counter;
|
||||||
|
} else if (MLX5_CAP_ESW_EGRESS_ACL(esw->dev, flow_counter)) {
|
||||||
drop_counter = mlx5_fc_create(esw->dev, false);
|
drop_counter = mlx5_fc_create(esw->dev, false);
|
||||||
if (IS_ERR(drop_counter))
|
if (IS_ERR(drop_counter)) {
|
||||||
esw_warn(esw->dev,
|
esw_warn(esw->dev,
|
||||||
"vport[%d] configure egress drop rule counter err(%ld)\n",
|
"vport[%d] configure egress drop rule counter err(%ld)\n",
|
||||||
vport->vport, PTR_ERR(drop_counter));
|
vport->vport, PTR_ERR(drop_counter));
|
||||||
|
drop_counter = NULL;
|
||||||
|
}
|
||||||
vport->egress.legacy.drop_counter = drop_counter;
|
vport->egress.legacy.drop_counter = drop_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +127,7 @@ int esw_acl_egress_lgcy_setup(struct mlx5_eswitch *esw,
|
|||||||
flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
|
flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
|
||||||
|
|
||||||
/* Attach egress drop flow counter */
|
/* Attach egress drop flow counter */
|
||||||
if (!IS_ERR_OR_NULL(drop_counter)) {
|
if (drop_counter) {
|
||||||
flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
||||||
drop_ctr_dst.type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
|
drop_ctr_dst.type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
|
||||||
drop_ctr_dst.counter_id = mlx5_fc_id(drop_counter);
|
drop_ctr_dst.counter_id = mlx5_fc_id(drop_counter);
|
||||||
@ -162,7 +166,7 @@ void esw_acl_egress_lgcy_cleanup(struct mlx5_eswitch *esw,
|
|||||||
esw_acl_egress_table_destroy(vport);
|
esw_acl_egress_table_destroy(vport);
|
||||||
|
|
||||||
clean_drop_counter:
|
clean_drop_counter:
|
||||||
if (!IS_ERR_OR_NULL(vport->egress.legacy.drop_counter)) {
|
if (vport->egress.legacy.drop_counter) {
|
||||||
mlx5_fc_destroy(esw->dev, vport->egress.legacy.drop_counter);
|
mlx5_fc_destroy(esw->dev, vport->egress.legacy.drop_counter);
|
||||||
vport->egress.legacy.drop_counter = NULL;
|
vport->egress.legacy.drop_counter = NULL;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,9 @@ int esw_acl_ingress_lgcy_setup(struct mlx5_eswitch *esw,
|
|||||||
|
|
||||||
esw_acl_ingress_lgcy_rules_destroy(vport);
|
esw_acl_ingress_lgcy_rules_destroy(vport);
|
||||||
|
|
||||||
if (MLX5_CAP_ESW_INGRESS_ACL(esw->dev, flow_counter)) {
|
if (vport->ingress.legacy.drop_counter) {
|
||||||
|
counter = vport->ingress.legacy.drop_counter;
|
||||||
|
} else if (MLX5_CAP_ESW_INGRESS_ACL(esw->dev, flow_counter)) {
|
||||||
counter = mlx5_fc_create(esw->dev, false);
|
counter = mlx5_fc_create(esw->dev, false);
|
||||||
if (IS_ERR(counter)) {
|
if (IS_ERR(counter)) {
|
||||||
esw_warn(esw->dev,
|
esw_warn(esw->dev,
|
||||||
|
Loading…
Reference in New Issue
Block a user