net/mlx5: fix flow split combined with counter
authorDekel Peled <dekelp@nvidia.com>
Sun, 17 Jan 2021 09:40:46 +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 a count action, if flow is split to
sub-flows, a new counter will be created for each sub-flow.
However only the counter 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 counter per flow, and use it for all sub-flows.

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

Fixes: fa2d01c87d2b ("net/mlx5: support flow 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 5e34cbe..012d589 100644 (file)
@@ -10681,17 +10681,22 @@ flow_dv_translate(struct rte_eth_dev *dev,
                                        handle->dvh.modify_hdr->action;
                        }
                        if (action_flags & MLX5_FLOW_ACTION_COUNT) {
-                               flow->counter =
-                                       flow_dv_translate_create_counter(dev,
-                                               dev_flow, count, age);
-
-                               if (!flow->counter)
-                                       return rte_flow_error_set
+                               /*
+                                * Create one count action, to be used
+                                * by all sub-flows.
+                                */
+                               if (!flow->counter) {
+                                       flow->counter =
+                                               flow_dv_translate_create_counter
+                                                       (dev, dev_flow, count,
+                                                        age);
+                                       if (!flow->counter)
+                                               return rte_flow_error_set
                                                (error, rte_errno,
-                                               RTE_FLOW_ERROR_TYPE_ACTION,
-                                               NULL,
-                                               "cannot create counter"
-                                               " object.");
+                                                RTE_FLOW_ERROR_TYPE_ACTION,
+                                                NULL, "cannot create counter"
+                                                " object.");
+                               }
                                dev_flow->dv.actions[actions_n] =
                                          (flow_dv_counter_get_by_idx(dev,
                                          flow->counter, NULL))->action;