net/mlx5: fix flow split combined with age action
authorDekel Peled <dekelp@nvidia.com>
Sun, 17 Jan 2021 09:40:45 +0000 (11:40 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Jan 2021 17:16:07 +0000 (18:16 +0100)
Currently, for a flow containing an age action, if flow is split to
sub-flows, a new age action will be created for each sub-flow.
However only the action created for the last sub-flow will be queried
on flow query and cleared on flow removal.

This behavior is wrong, causing a leak of resources.
Need to create just one action per flow, and use it for all sub-flows.

This patch adds the required check to make sure an age action is
created just once per flow, and used by all sub-flows.

Fixes: f935ed4b645a ("net/mlx5: support flow hit action for aging")
Cc: stable@dpdk.org
Signed-off-by: Dekel Peled <dekelp@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/net/mlx5/mlx5_flow_dv.c

index 012d589..f32d6c1 100644 (file)
@@ -10344,14 +10344,22 @@ flow_dv_translate(struct rte_eth_dev *dev,
                        break;
                case RTE_FLOW_ACTION_TYPE_AGE:
                        if (priv->sh->flow_hit_aso_en && attr->group) {
-                               flow->age = flow_dv_translate_create_aso_age
-                                               (dev, action->conf, error);
-                               if (!flow->age)
-                                       return rte_flow_error_set
+                               /*
+                                * Create one shared age action, to be used
+                                * by all sub-flows.
+                                */
+                               if (!flow->age) {
+                                       flow->age =
+                                               flow_dv_translate_create_aso_age
+                                                       (dev, action->conf,
+                                                        error);
+                                       if (!flow->age)
+                                               return rte_flow_error_set
                                                (error, rte_errno,
                                                 RTE_FLOW_ERROR_TYPE_ACTION,
                                                 NULL,
                                                 "can't create ASO age action");
+                               }
                                dev_flow->dv.actions[actions_n++] =
                                          (flow_aso_age_get_by_idx
                                                (dev, flow->age))->dr_action;