Thursday, March 28, 2019 6:33 PM, Ori Kam: > Subject: [PATCH v2 3/3] net/mlx5: add jump action support for NIC > > When using Direct Rules we can add actions to jump between tables. > This is extra useful since rule insertion rate is much higher on other tables > compared to table zero. > > if no group is selected the rule is added to group 0. > > Signed-off-by: Ori Kam <or...@mellanox.com> > --- > drivers/net/mlx5/mlx5.h | 6 + > drivers/net/mlx5/mlx5_flow.h | 15 ++- > drivers/net/mlx5/mlx5_flow_dv.c | 278 > +++++++++++++++++++++++++++++++++++----- > drivers/net/mlx5/mlx5_glue.c | 13 ++ > drivers/net/mlx5/mlx5_glue.h | 1 + > 5 files changed, 282 insertions(+), 31 deletions(-) >
[...] > /** > * Register the flow matcher. > * > @@ -2784,6 +2952,9 @@ struct field_modify_info modify_tcp[] = { > .match_mask = (void *)&matcher->mask, > }; > struct mlx5_flow_tbl_resource *tbl = NULL; > +#ifndef HAVE_MLX5DV_DR > + struct mlx5_flow_tbl_resource tbl_tmp; #endif > > /* Lookup from cache. */ > LIST_FOREACH(cache_matcher, &priv->matchers, next) { @@ - > 2805,33 +2976,24 @@ struct field_modify_info modify_tcp[] = { > return 0; > } > } > -#ifdef HAVE_MLX5DV_DR > - if (matcher->egress) { > - tbl = &priv->tx_tbl[matcher->group]; > - if (!tbl->obj) > - tbl->obj = mlx5_glue->dr_create_flow_tbl > - (priv->tx_ns, > - matcher->group * MLX5_GROUP_FACTOR); > - } else { > - tbl = &priv->rx_tbl[matcher->group]; > - if (!tbl->obj) > - tbl->obj = mlx5_glue->dr_create_flow_tbl > - (priv->rx_ns, > - matcher->group * MLX5_GROUP_FACTOR); > - } > - if (!tbl->obj) > - return rte_flow_error_set(error, ENOMEM, > - > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > - NULL, "cannot create table"); > - > - rte_atomic32_inc(&tbl->refcnt); > -#endif > /* Register new matcher. */ > cache_matcher = rte_calloc(__func__, 1, sizeof(*cache_matcher), > 0); > if (!cache_matcher) > return rte_flow_error_set(error, ENOMEM, > > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, > "cannot allocate matcher memory"); > +#ifdef HAVE_MLX5DV_DR > + tbl = flow_dv_tbl_resource_get(dev, matcher->group * > MLX5_GROUP_FACTOR, > + matcher->egress, error); > + if (!tbl) { > + rte_free(cache_matcher); > + return rte_flow_error_set(error, ENOMEM, > + > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, "cannot create table"); > + } > +#else > + tbl = &tbl_tmp; > +#endif I suggest to have the HAVE_MLX5DV_DR inside the flow_dv_tbl_resource_get (return NULL if no DR support). Then we can have a cleaner code of this function.