PMD running in HWS FDB mode can be configured to steer group 0 to FW. In that case PMD activates legacy DV pattern processing. There are control flows that require HWS pattern processing in group 0.
Pattern template validation tried to create a matcher both in group 0 and HWS group. As the result, during group 0 validation HWS tuned pattern was processed as DV. The patch removed pattern validation for group 0. Fixes: f3aadd103358 ("net/mlx5: improve pattern template validation") Signed-off-by: Gregory Etelson <getel...@nvidia.com> Acked-by: Dariusz Sosnowski <dsosnow...@nvidia.com> --- drivers/net/mlx5/mlx5_flow_hw.c | 49 +++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c index 4216433c6e..b37348c972 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -7668,48 +7668,57 @@ flow_hw_pattern_has_sq_match(const struct rte_flow_item *items) return false; } +/* + * Verify that the tested flow patterns fits STE size limit in HWS group. + * + * + * Return values: + * 0 : Tested patterns fit STE size limit + * -EINVAL : Invalid parameters detected + * -E2BIG : Tested patterns exceed STE size limit + */ static int pattern_template_validate(struct rte_eth_dev *dev, struct rte_flow_pattern_template *pt[], uint32_t pt_num) { - uint32_t group = 0; + struct rte_flow_error error; struct mlx5_flow_template_table_cfg tbl_cfg = { - .attr = (struct rte_flow_template_table_attr) { + .attr = { .nb_flows = 64, .insertion_type = RTE_FLOW_TABLE_INSERTION_TYPE_PATTERN, .hash_func = RTE_FLOW_TABLE_HASH_FUNC_DEFAULT, .flow_attr = { + .group = 1, .ingress = pt[0]->attr.ingress, .egress = pt[0]->attr.egress, .transfer = pt[0]->attr.transfer } - }, - .external = true + } }; struct mlx5_priv *priv = dev->data->dev_private; struct rte_flow_actions_template *action_template; + struct rte_flow_template_table *tmpl_tbl; + int ret; - if (pt[0]->attr.ingress) { + if (pt[0]->attr.ingress) action_template = priv->action_template_drop[MLX5DR_TABLE_TYPE_NIC_RX]; - } else if (pt[0]->attr.egress) { + else if (pt[0]->attr.egress) action_template = priv->action_template_drop[MLX5DR_TABLE_TYPE_NIC_TX]; - } else if (pt[0]->attr.transfer) { + else if (pt[0]->attr.transfer) action_template = priv->action_template_drop[MLX5DR_TABLE_TYPE_FDB]; + else + return -EINVAL; + if (pt[0]->item_flags & MLX5_FLOW_ITEM_COMPARE) + tbl_cfg.attr.nb_flows = 1; + tmpl_tbl = flow_hw_table_create(dev, &tbl_cfg, pt, pt_num, + &action_template, 1, NULL); + if (tmpl_tbl) { + ret = 0; + flow_hw_table_destroy(dev, tmpl_tbl, &error); } else { - rte_errno = EINVAL; - return rte_errno; + ret = rte_errno == E2BIG ? -E2BIG : 0; } - do { - struct rte_flow_template_table *tmpl_tbl; - - tbl_cfg.attr.flow_attr.group = group; - tmpl_tbl = flow_hw_table_create(dev, &tbl_cfg, pt, pt_num, - &action_template, 1, NULL); - if (!tmpl_tbl) - return rte_errno; - flow_hw_table_destroy(dev, tmpl_tbl, NULL); - } while (++group <= 1); - return 0; + return ret; } /** -- 2.39.2