Current the ASO age action was supported in the non-root table,
and the counter based age action was be used in the root table.

The FDB table skips group 0 on MLX5 PMD by adding implicit rule
that jump to non-root table, but PMD code use the original group
value for checking.

This patch uses the actual group value for age action checking,

Fixes: f9bc5274a6f9 ("net/mlx5: allow age modes combination")
Cc: sta...@dpdk.org

Signed-off-by: Jiawei Wang <jiaw...@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow_dv.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 70e8d0b113..8eddd850f2 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -12252,12 +12252,16 @@ flow_dv_translate(struct rte_eth_dev *dev,
                                MLX5_FLOW_FATE_QUEUE;
                        break;
                case MLX5_RTE_FLOW_ACTION_TYPE_AGE:
-                       flow->age = (uint32_t)(uintptr_t)(action->conf);
-                       age_act = flow_aso_age_get_by_idx(dev, flow->age);
-                       __atomic_fetch_add(&age_act->refcnt, 1,
-                                          __ATOMIC_RELAXED);
-                       age_act_pos = actions_n++;
-                       action_flags |= MLX5_FLOW_ACTION_AGE;
+                       if (priv->sh->flow_hit_aso_en && (attr->group ||
+                           attr->transfer)) {
+                               flow->age = (uint32_t)(uintptr_t)(action->conf);
+                               age_act = flow_aso_age_get_by_idx(dev,
+                                                                 flow->age);
+                               __atomic_fetch_add(&age_act->refcnt, 1,
+                                                  __ATOMIC_RELAXED);
+                               age_act_pos = actions_n++;
+                               action_flags |= MLX5_FLOW_ACTION_AGE;
+                       }
                        break;
                case RTE_FLOW_ACTION_TYPE_AGE:
                        non_shared_age = action->conf;
@@ -12615,7 +12619,7 @@ flow_dv_translate(struct rte_eth_dev *dev,
                                if ((non_shared_age &&
                                     count && !count->shared) ||
                                    !(priv->sh->flow_hit_aso_en &&
-                                     attr->group)) {
+                                     dev_flow->dv.group)) {
                                        /* Creates age by counters. */
                                        cnt_act = flow_dv_prepare_counter
                                                                (dev, dev_flow,
@@ -12628,7 +12632,9 @@ flow_dv_translate(struct rte_eth_dev *dev,
                                                                cnt_act->action;
                                        break;
                                }
-                               if (!flow->age && non_shared_age) {
+                               if (!flow->age && non_shared_age &&
+                                   priv->sh->flow_hit_aso_en &&
+                                   dev_flow->dv.group) {
                                        flow->age =
                                                flow_dv_translate_create_aso_age
                                                                (dev,
@@ -12641,6 +12647,8 @@ flow_dv_translate(struct rte_eth_dev *dev,
                                                     NULL,
                                                     "can't create ASO age 
action");
                                }
+                               if (!flow->age)
+                                       return -rte_errno;
                                age_act = flow_aso_age_get_by_idx(dev,
                                                                  flow->age);
                                dev_flow->dv.actions[age_act_pos] =
-- 
2.18.1

Reply via email to