> -----Original Message-----
> From: Ori Kam
> Sent: Thursday, March 28, 2019 18:33
> To: Matan Azrad <ma...@mellanox.com>; Yongseok Koh
> <ys...@mellanox.com>; Shahaf Shuler <shah...@mellanox.com>
> Cc: dev@dpdk.org; Ori Kam <or...@mellanox.com>; Slava Ovsiienko
> <viachesl...@mellanox.com>
> Subject: [PATCH v2 1/3] net/mlx5: prepare Direct Verbs for Direct Rule
> 
> This is the first patch of a series that is designed to enable the Direct 
> Rules
> API.
> 
> The main difference between Direct Verbs and Direct Rules from API
> prespective, is that in Direct Rules each action has it's own create function
> and the object itself is of type void.
> 
> In this patch I'm adding functions to generate actions that currenlty are done
> without create action, and I'm changing the action type to be void *, so in
> next patches only the glue functions will need to change.
> 
> Signed-off-by: Ori Kam <or...@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>

> 
> ---
>  drivers/net/mlx5/mlx5.h         |   2 +
>  drivers/net/mlx5/mlx5_flow.h    |  17 +++-
>  drivers/net/mlx5/mlx5_flow_dv.c | 188 ++++++++++++++++++++++++++++---
> ---------
>  drivers/net/mlx5/mlx5_glue.c    | 141 ++++++++++++++++++++++++------
>  drivers/net/mlx5/mlx5_glue.h    |  26 +++---
>  5 files changed, 278 insertions(+), 96 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index
> 7402798..b587359 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -269,6 +269,8 @@ struct mlx5_priv {
>       LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers;
>       LIST_HEAD(encap_decap, mlx5_flow_dv_encap_decap_resource)
> encaps_decaps;
>       LIST_HEAD(modify_cmd, mlx5_flow_dv_modify_hdr_resource)
> modify_cmds;
> +     LIST_HEAD(tag, mlx5_flow_dv_tag_resource) tags;
> +     /* Tags resources cache. */
>       uint32_t link_speed_capa; /* Link speed capabilities. */
>       struct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */
>       struct mlx5_stats_ctrl stats_ctrl; /* Stats control. */ diff --git
> a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index
> e1e798b..4f69ae2 100644
> --- a/drivers/net/mlx5/mlx5_flow.h
> +++ b/drivers/net/mlx5/mlx5_flow.h
> @@ -214,7 +214,7 @@ struct mlx5_flow_dv_encap_decap_resource {
>       LIST_ENTRY(mlx5_flow_dv_encap_decap_resource) next;
>       /* Pointer to next element. */
>       rte_atomic32_t refcnt; /**< Reference counter. */
> -     struct ibv_flow_action *verbs_action;
> +     void *verbs_action;
>       /**< Verbs encap/decap action object. */
>       uint8_t buf[MLX5_ENCAP_MAX_LEN];
>       size_t size;
> @@ -222,6 +222,16 @@ struct mlx5_flow_dv_encap_decap_resource {
>       uint8_t ft_type;
>  };
> 
> +/* Tag resource structure. */
> +struct mlx5_flow_dv_tag_resource {
> +     LIST_ENTRY(mlx5_flow_dv_tag_resource) next;
> +     /* Pointer to next element. */
> +     rte_atomic32_t refcnt; /**< Reference counter. */
> +     void *action;
> +     /**< Verbs tag action object. */
> +     uint32_t tag; /**< the tag value. */
> +};
> +
>  /* Number of modification commands. */
>  #define MLX5_MODIFY_NUM 8
> 
> @@ -259,7 +269,7 @@ struct mlx5_flow_dv {
>       /**< Pointer to modify header resource in cache. */
>       struct ibv_flow *flow; /**< Installed flow. */  #ifdef
> HAVE_IBV_FLOW_DV_SUPPORT
> -     struct mlx5dv_flow_action_attr
> actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];
> +     void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];
>       /**< Action list. */
>  #endif
>       int actions_n; /**< number of actions. */ @@ -332,6 +342,7 @@
> struct mlx5_flow_counter {
>       };
>       uint64_t hits; /**< Number of packets matched by the rule. */
>       uint64_t bytes; /**< Number of bytes matched by the rule. */
> +     void *action; /**< Pointer to the dv action. */
>  };
> 
>  /* Flow structure. */
> @@ -339,6 +350,8 @@ struct rte_flow {
>       TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure.
> */
>       enum mlx5_flow_drv_type drv_type; /**< Drvier type. */
>       struct mlx5_flow_counter *counter; /**< Holds flow counter. */
> +     struct mlx5_flow_dv_tag_resource *tag_resource;
> +     /**< pointer to the tag action. */
>       struct rte_flow_action_rss rss;/**< RSS context. */
>       uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
>       uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */
> diff --git a/drivers/net/mlx5/mlx5_flow_dv.c
> b/drivers/net/mlx5/mlx5_flow_dv.c index 57847fb..b0c50a7 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -32,13 +32,8 @@
>  #include "mlx5_prm.h"
>  #include "mlx5_glue.h"
>  #include "mlx5_flow.h"
> -
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> 
> -#ifndef HAVE_IBV_FLOW_DEVX_COUNTERS
> -#define MLX5DV_FLOW_ACTION_COUNTER_DEVX 0 -#endif
> -
>  union flow_dv_attr {
>       struct {
>               uint32_t valid:1;
> @@ -1537,6 +1532,11 @@ struct field_modify_info modify_tcp[] = {
>               .id = id,
>               .dcs = dcs,
>       };
> +     tmpl.action = mlx5_glue->dv_create_flow_action_counter(dcs->obj,
> 0);
> +     if (!tmpl.action) {
> +             ret = errno;
> +             goto error_exit;
> +     }
>       *cnt = tmpl;
>       LIST_INSERT_HEAD(&priv->flow_counters, cnt, next);
>       return cnt;
> @@ -2828,6 +2828,97 @@ struct field_modify_info modify_tcp[] = {  }
> 
>  /**
> + * Find existing tag resource or create and register a new one.
> + *
> + * @param dev[in, out]
> + *   Pointer to rte_eth_dev structure.
> + * @param[in, out] resource
> + *   Pointer to tag resource.
> + * @parm[in, out] dev_flow
> + *   Pointer to the dev_flow.
> + * @param[out] error
> + *   pointer to error structure.
> + *
> + * @return
> + *   0 on success otherwise -errno and errno is set.
> + */
> +static int
> +flow_dv_tag_resource_register
> +                     (struct rte_eth_dev *dev,
> +                      struct mlx5_flow_dv_tag_resource *resource,
> +                      struct mlx5_flow *dev_flow,
> +                      struct rte_flow_error *error)
> +{
> +     struct mlx5_priv *priv = dev->data->dev_private;
> +     struct mlx5_flow_dv_tag_resource *cache_resource;
> +
> +     /* Lookup a matching resource from cache. */
> +     LIST_FOREACH(cache_resource, &priv->tags, next) {
> +             if (resource->tag == cache_resource->tag) {
> +                     DRV_LOG(DEBUG, "tag resource %p: refcnt %d++",
> +                             (void *)cache_resource,
> +                             rte_atomic32_read(&cache_resource-
> >refcnt));
> +                     rte_atomic32_inc(&cache_resource->refcnt);
> +                     dev_flow->flow->tag_resource = cache_resource;
> +                     return 0;
> +             }
> +     }
> +     /* Register new  resource. */
> +     cache_resource = rte_calloc(__func__, 1, sizeof(*cache_resource), 0);
> +     if (!cache_resource)
> +             return rte_flow_error_set(error, ENOMEM,
> +
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
> +                                       "cannot allocate resource
> memory");
> +     *cache_resource = *resource;
> +     cache_resource->action = mlx5_glue->dv_create_flow_action_tag
> +             (resource->tag);
> +     if (!cache_resource->action) {
> +             rte_free(cache_resource);
> +             return rte_flow_error_set(error, ENOMEM,
> +
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +                                       NULL, "cannot create action");
> +     }
> +     rte_atomic32_init(&cache_resource->refcnt);
> +     rte_atomic32_inc(&cache_resource->refcnt);
> +     LIST_INSERT_HEAD(&priv->tags, cache_resource, next);
> +     dev_flow->flow->tag_resource = cache_resource;
> +     DRV_LOG(DEBUG, "new tag resource %p: refcnt %d++",
> +             (void *)cache_resource,
> +             rte_atomic32_read(&cache_resource->refcnt));
> +     return 0;
> +}
> +
> +/**
> + * Release the tag.
> + *
> + * @param dev
> + *   Pointer to Ethernet device.
> + * @param flow
> + *   Pointer to mlx5_flow.
> + *
> + * @return
> + *   1 while a reference on it exists, 0 when freed.
> + */
> +static int
> +flow_dv_tag_release(struct rte_eth_dev *dev,
> +                 struct mlx5_flow_dv_tag_resource *tag) {
> +     assert(tag);
> +     DRV_LOG(DEBUG, "port %u tag %p: refcnt %d--",
> +             dev->data->port_id, (void *)tag,
> +             rte_atomic32_read(&tag->refcnt));
> +     if (rte_atomic32_dec_and_test(&tag->refcnt)) {
> +             claim_zero(mlx5_glue->destroy_flow_action(tag->action));
> +             LIST_REMOVE(tag, next);
> +             DRV_LOG(DEBUG, "port %u tag %p: removed",
> +                     dev->data->port_id, (void *)tag);
> +             rte_free(tag);
> +             return 0;
> +     }
> +     return 1;
> +}
> +
> +/**
>   * Fill the flow with DV spec.
>   *
>   * @param[in] dev
> @@ -2872,6 +2963,7 @@ struct field_modify_info modify_tcp[] = {
> 
> MLX5DV_FLOW_TABLE_TYPE_NIC_RX
>       };
>       union flow_dv_attr flow_attr = { .attr = 0 };
> +     struct mlx5_flow_dv_tag_resource tag_resource;
> 
>       if (priority == MLX5_FLOW_PRIO_RSVD)
>               priority = priv->config.flow_prio - 1; @@ -2886,26 +2978,29
> @@ struct field_modify_info modify_tcp[] = {
>               case RTE_FLOW_ACTION_TYPE_VOID:
>                       break;
>               case RTE_FLOW_ACTION_TYPE_FLAG:
> -                     dev_flow->dv.actions[actions_n].type =
> -                             MLX5DV_FLOW_ACTION_TAG;
> -                     dev_flow->dv.actions[actions_n].tag_value =
> +                     tag_resource.tag =
> 
>       mlx5_flow_mark_set(MLX5_FLOW_MARK_DEFAULT);
> -                     actions_n++;
> +                     if (!flow->tag_resource)
> +                             if (flow_dv_tag_resource_register
> +                                 (dev, &tag_resource, dev_flow, error))
> +                                     return errno;
> +                     dev_flow->dv.actions[actions_n++] =
> +                             flow->tag_resource->action;
>                       action_flags |= MLX5_FLOW_ACTION_FLAG;
>                       break;
>               case RTE_FLOW_ACTION_TYPE_MARK:
> -                     dev_flow->dv.actions[actions_n].type =
> -                             MLX5DV_FLOW_ACTION_TAG;
> -                     dev_flow->dv.actions[actions_n].tag_value =
> -                             mlx5_flow_mark_set
> -                             (((const struct rte_flow_action_mark *)
> -                               (actions->conf))->id);
> -                     actions_n++;
> +                     tag_resource.tag = mlx5_flow_mark_set
> +                           (((const struct rte_flow_action_mark *)
> +                            (actions->conf))->id);
> +                     if (!flow->tag_resource)
> +                             if (flow_dv_tag_resource_register
> +                                 (dev, &tag_resource, dev_flow, error))
> +                                     return errno;
> +                     dev_flow->dv.actions[actions_n++] =
> +                             flow->tag_resource->action;
>                       action_flags |= MLX5_FLOW_ACTION_MARK;
>                       break;
>               case RTE_FLOW_ACTION_TYPE_DROP:
> -                     dev_flow->dv.actions[actions_n].type =
> -                             MLX5DV_FLOW_ACTION_DROP;
>                       action_flags |= MLX5_FLOW_ACTION_DROP;
>                       break;
>               case RTE_FLOW_ACTION_TYPE_QUEUE:
> @@ -2933,17 +3028,13 @@ struct field_modify_info modify_tcp[] = {
>                               rte_errno = ENOTSUP;
>                               goto cnt_err;
>                       }
> -                     flow->counter =
> -                             flow_dv_counter_new(dev,
> -                                                 count->shared, count->id);
> +                     flow->counter = flow_dv_counter_new(dev, count-
> >shared,
> +                                                         count->id);
>                       if (flow->counter == NULL)
>                               goto cnt_err;
> -                     dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_COUNTER_DEVX;
> -                     dev_flow->dv.actions[actions_n].obj =
> -                                             flow->counter->dcs->obj;
> +                     dev_flow->dv.actions[actions_n++] =
> +                             flow->counter->action;
>                       action_flags |= MLX5_FLOW_ACTION_COUNT;
> -                     ++actions_n;
>                       break;
>  cnt_err:
>                       if (rte_errno == ENOTSUP)
> @@ -2964,11 +3055,8 @@ struct field_modify_info modify_tcp[] = {
>                       if (flow_dv_create_action_l2_encap(dev, actions,
>                                                          dev_flow, error))
>                               return -rte_errno;
> -                     dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> -                     dev_flow->dv.actions[actions_n].action =
> +                     dev_flow->dv.actions[actions_n++] =
>                               dev_flow->dv.encap_decap->verbs_action;
> -                     actions_n++;
>                       action_flags |= actions->type ==
> 
>       RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP ?
>                                       MLX5_FLOW_ACTION_VXLAN_ENCAP
> :
> @@ -2979,11 +3067,8 @@ struct field_modify_info modify_tcp[] = {
>                       if (flow_dv_create_action_l2_decap(dev, dev_flow,
>                                                          error))
>                               return -rte_errno;
> -                     dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> -                     dev_flow->dv.actions[actions_n].action =
> +                     dev_flow->dv.actions[actions_n++] =
>                               dev_flow->dv.encap_decap->verbs_action;
> -                     actions_n++;
>                       action_flags |= actions->type ==
> 
>       RTE_FLOW_ACTION_TYPE_VXLAN_DECAP ?
>                                       MLX5_FLOW_ACTION_VXLAN_DECAP
> :
> @@ -2995,9 +3080,7 @@ struct field_modify_info modify_tcp[] = {
>                               if (flow_dv_create_action_raw_encap
>                                       (dev, actions, dev_flow, attr, error))
>                                       return -rte_errno;
> -                             dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> -                             dev_flow->dv.actions[actions_n].action =
> +                             dev_flow->dv.actions[actions_n++] =
>                                       dev_flow->dv.encap_decap-
> >verbs_action;
>                       } else {
>                               /* Handle encap without preceding decap. */
> @@ -3005,12 +3088,9 @@ struct field_modify_info modify_tcp[] = {
>                                                                  dev_flow,
>                                                                  error))
>                                       return -rte_errno;
> -                             dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> -                             dev_flow->dv.actions[actions_n].action =
> +                             dev_flow->dv.actions[actions_n++] =
>                                       dev_flow->dv.encap_decap-
> >verbs_action;
>                       }
> -                     actions_n++;
>                       action_flags |= MLX5_FLOW_ACTION_RAW_ENCAP;
>                       break;
>               case RTE_FLOW_ACTION_TYPE_RAW_DECAP:
> @@ -3025,11 +3105,8 @@ struct field_modify_info modify_tcp[] = {
>                                                                  dev_flow,
>                                                                  error))
>                                       return -rte_errno;
> -                             dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> -                             dev_flow->dv.actions[actions_n].action =
> +                             dev_flow->dv.actions[actions_n++] =
>                                       dev_flow->dv.encap_decap-
> >verbs_action;
> -                             actions_n++;
>                       }
>                       /* If decap is followed by encap, handle it at encap.
> */
>                       action_flags |= MLX5_FLOW_ACTION_RAW_DECAP;
> @@ -3098,11 +3175,8 @@ struct field_modify_info modify_tcp[] = {
>                                                                dev_flow,
>                                                                error))
>                                       return -rte_errno;
> -                             dev_flow->dv.actions[actions_n].type =
> -
>       MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> -                             dev_flow->dv.actions[actions_n].action =
> +                             dev_flow->dv.actions[actions_n++] =
>                                       dev_flow->dv.modify_hdr-
> >verbs_action;
> -                             actions_n++;
>                       }
>                       break;
>               default:
> @@ -3277,9 +3351,9 @@ struct field_modify_info modify_tcp[] = {
>                                        "cannot get drop hash queue");
>                               goto error;
>                       }
> -                     dv->actions[n].type =
> MLX5DV_FLOW_ACTION_DEST_IBV_QP;
> -                     dv->actions[n].qp = dv->hrxq->qp;
> -                     n++;
> +                     dv->actions[n++] =
> +                             mlx5_glue-
> >dv_create_flow_action_dest_ibv_qp
> +                             (dv->hrxq->qp);
>               } else if (flow->actions &
>                          (MLX5_FLOW_ACTION_QUEUE |
> MLX5_FLOW_ACTION_RSS)) {
>                       struct mlx5_hrxq *hrxq;
> @@ -3304,9 +3378,9 @@ struct field_modify_info modify_tcp[] = {
>                               goto error;
>                       }
>                       dv->hrxq = hrxq;
> -                     dv->actions[n].type =
> MLX5DV_FLOW_ACTION_DEST_IBV_QP;
> -                     dv->actions[n].qp = hrxq->qp;
> -                     n++;
> +                     dv->actions[n++] =
> +                             mlx5_glue-
> >dv_create_flow_action_dest_ibv_qp
> +                             (dv->hrxq->qp);
>               }
>               dv->flow =
>                       mlx5_glue->dv_create_flow(dv->matcher-
> >matcher_object,
> @@ -3484,6 +3558,10 @@ struct field_modify_info modify_tcp[] = {
>               flow_dv_counter_release(flow->counter);
>               flow->counter = NULL;
>       }
> +     if (flow->tag_resource) {
> +             flow_dv_tag_release(dev, flow->tag_resource);
> +             flow->tag_resource = NULL;
> +     }
>       while (!LIST_EMPTY(&flow->dev_flows)) {
>               dev_flow = LIST_FIRST(&flow->dev_flows);
>               LIST_REMOVE(dev_flow, next);
> diff --git a/drivers/net/mlx5/mlx5_glue.c b/drivers/net/mlx5/mlx5_glue.c
> index c817d86..cfd939d 100644
> --- a/drivers/net/mlx5/mlx5_glue.c
> +++ b/drivers/net/mlx5/mlx5_glue.c
> @@ -175,10 +175,20 @@
>  }
> 
>  static int
> -mlx5_glue_destroy_flow_action(struct ibv_flow_action *action)
> +mlx5_glue_destroy_flow_action(void *action)
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> -     return ibv_destroy_flow_action(action);
> +     struct mlx5dv_flow_action_attr *attr = action;
> +     int res = 0;
> +     switch (attr->type) {
> +     case MLX5DV_FLOW_ACTION_TAG:
> +             break;
> +     default:
> +             res = ibv_destroy_flow_action(attr->action);
> +             break;
> +     }
> +     free(action);
> +     return res;
>  #else
>       (void)action;
>       return ENOTSUP;
> @@ -430,16 +440,23 @@
>  mlx5_glue_dv_create_flow(struct mlx5dv_flow_matcher *matcher,
>                        struct mlx5dv_flow_match_parameters
> *match_value,
>                        size_t num_actions,
> -                      struct mlx5dv_flow_action_attr *actions_attr)
> +                      void *actions[])
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> +     struct mlx5dv_flow_action_attr actions_attr[8];
> +
> +     if (num_actions > 8)
> +             return NULL;
> +     for (size_t i = 0; i < num_actions; i++)
> +             actions_attr[i] =
> +                     *((struct mlx5dv_flow_action_attr *)(actions[i]));
>       return mlx5dv_create_flow(matcher, match_value,
>                                 num_actions, actions_attr);
>  #else
>       (void)matcher;
>       (void)match_value;
>       (void)num_actions;
> -     (void)actions_attr;
> +     (void)actions;
>       return NULL;
>  #endif
>  }
> @@ -455,31 +472,45 @@
>  #endif
>  }
> 
> -static struct ibv_flow_action *
> -mlx5_glue_dv_create_flow_action_packet_reformat
> -             (struct ibv_context *ctx,
> -              size_t data_sz,
> -              void *data,
> -              enum mlx5dv_flow_action_packet_reformat_type
> reformat_type,
> -              enum mlx5dv_flow_table_type ft_type)
> +static void *
> +mlx5_glue_dv_create_flow_action_counter(void *counter_obj, uint32_t
> +offset)
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> -     return mlx5dv_create_flow_action_packet_reformat(ctx,
> -                                                      data_sz,
> -                                                      data,
> -                                                      reformat_type,
> -                                                      ft_type);
> +     struct mlx5dv_flow_action_attr *action;
> +
> +     (void)offset;
> +     action = malloc(sizeof(*action));
> +     if (!action)
> +             return NULL;
> +     action->type = MLX5DV_FLOW_ACTION_COUNTER_DEVX;
> +     action->obj = counter_obj;
> +     return action;
>  #else
> -     (void)ctx;
> -     (void)data_sz;
> -     (void)data;
> -     (void)reformat_type;
> -     (void)ft_type;
> +     (void)counter_obj;
> +     (void)offset;
>       return NULL;
>  #endif
>  }
> 
> -static struct ibv_flow_action *
> +static void *
> +mlx5_glue_dv_create_flow_action_dest_ibv_qp(void *qp) { #ifdef
> +HAVE_IBV_FLOW_DV_SUPPORT
> +     struct mlx5dv_flow_action_attr *action;
> +
> +     action = malloc(sizeof(*action));
> +     if (!action)
> +             return NULL;
> +     action->type = MLX5DV_FLOW_ACTION_DEST_IBV_QP;
> +     action->obj = qp;
> +     return action;
> +#else
> +     (void)qp;
> +     return NULL;
> +#endif
> +}
> +
> +static void *
>  mlx5_glue_dv_create_flow_action_modify_header
>                                       (struct ibv_context *ctx,
>                                        size_t actions_sz,
> @@ -487,8 +518,15 @@
>                                        enum mlx5dv_flow_table_type
> ft_type)  {  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> -     return mlx5dv_create_flow_action_modify_header(ctx, actions_sz,
> -                                                    actions, ft_type);
> +     struct mlx5dv_flow_action_attr *action;
> +
> +     action = malloc(sizeof(*action));
> +     if (!action)
> +             return NULL;
> +     action->type = MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> +     action->action = mlx5dv_create_flow_action_modify_header
> +             (ctx, actions_sz, actions, ft_type);
> +     return action;
>  #else
>       (void)ctx;
>       (void)actions_sz;
> @@ -498,6 +536,50 @@
>  #endif
>  }
> 
> +static void *
> +mlx5_glue_dv_create_flow_action_packet_reformat
> +             (struct ibv_context *ctx,
> +              size_t data_sz,
> +              void *data,
> +              enum mlx5dv_flow_action_packet_reformat_type
> reformat_type,
> +              enum mlx5dv_flow_table_type ft_type) { #ifdef
> +HAVE_IBV_FLOW_DV_SUPPORT
> +     struct mlx5dv_flow_action_attr *action;
> +
> +     action = malloc(sizeof(*action));
> +     if (!action)
> +             return NULL;
> +     action->type = MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
> +     action->action = mlx5dv_create_flow_action_packet_reformat
> +             (ctx, data_sz, data, reformat_type, ft_type);
> +     return action;
> +#else
> +     (void)ctx;
> +     (void)data_sz;
> +     (void)data;
> +     (void)reformat_type;
> +     (void)ft_type;
> +     return NULL;
> +#endif
> +}
> +
> +static void *
> +mlx5_glue_dv_create_flow_action_tag(uint32_t tag) { #ifdef
> +HAVE_IBV_FLOW_DV_SUPPORT
> +     struct mlx5dv_flow_action_attr *action;
> +     action = malloc(sizeof(*action));
> +     if (!action)
> +             return NULL;
> +     action->type = MLX5DV_FLOW_ACTION_TAG;
> +     action->tag_value = tag;
> +     return action;
> +#endif
> +     (void)tag;
> +     return NULL;
> +}
> +
>  static struct ibv_context *
>  mlx5_glue_dv_open_device(struct ibv_device *device)  { @@ -645,10
> +727,15 @@
>       .dv_create_flow_matcher = mlx5_glue_dv_create_flow_matcher,
>       .dv_destroy_flow_matcher = mlx5_glue_dv_destroy_flow_matcher,
>       .dv_create_flow = mlx5_glue_dv_create_flow,
> -     .dv_create_flow_action_packet_reformat =
> -                     mlx5_glue_dv_create_flow_action_packet_reformat,
> +     .dv_create_flow_action_counter =
> +             mlx5_glue_dv_create_flow_action_counter,
> +     .dv_create_flow_action_dest_ibv_qp =
> +             mlx5_glue_dv_create_flow_action_dest_ibv_qp,
>       .dv_create_flow_action_modify_header =
> -                     mlx5_glue_dv_create_flow_action_modify_header,
> +             mlx5_glue_dv_create_flow_action_modify_header,
> +     .dv_create_flow_action_packet_reformat =
> +             mlx5_glue_dv_create_flow_action_packet_reformat,
> +     .dv_create_flow_action_tag =
> mlx5_glue_dv_create_flow_action_tag,
>       .dv_open_device = mlx5_glue_dv_open_device,
>       .devx_obj_create = mlx5_glue_devx_obj_create,
>       .devx_obj_destroy = mlx5_glue_devx_obj_destroy, diff --git
> a/drivers/net/mlx5/mlx5_glue.h b/drivers/net/mlx5/mlx5_glue.h index
> b118960..167f1f7 100644
> --- a/drivers/net/mlx5/mlx5_glue.h
> +++ b/drivers/net/mlx5/mlx5_glue.h
> @@ -55,6 +55,10 @@
>  enum mlx5dv_flow_table_type { flow_table_type = 0, };  #endif
> 
> +#ifndef HAVE_IBV_FLOW_DEVX_COUNTERS
> +#define MLX5DV_FLOW_ACTION_COUNTER_DEVX 0 #endif
> +
>  #ifndef HAVE_IBV_DEVX_OBJ
>  struct mlx5dv_devx_obj;
>  #endif
> @@ -98,7 +102,7 @@ struct mlx5_glue {
>       struct ibv_flow *(*create_flow)(struct ibv_qp *qp,
>                                       struct ibv_flow_attr *flow);
>       int (*destroy_flow)(struct ibv_flow *flow_id);
> -     int (*destroy_flow_action)(struct ibv_flow_action *action);
> +     int (*destroy_flow_action)(void *action);
>       struct ibv_qp *(*create_qp)(struct ibv_pd *pd,
>                                   struct ibv_qp_init_attr *qp_init_attr);
>       struct ibv_qp *(*create_qp_ex)
> @@ -160,19 +164,17 @@ struct mlx5_glue {
>       int (*dv_destroy_flow_matcher)(struct mlx5dv_flow_matcher
> *matcher);
>       struct ibv_flow *(*dv_create_flow)(struct mlx5dv_flow_matcher
> *matcher,
>                         struct mlx5dv_flow_match_parameters
> *match_value,
> -                       size_t num_actions,
> -                       struct mlx5dv_flow_action_attr *actions_attr);
> -     struct ibv_flow_action *(*dv_create_flow_action_packet_reformat)
> -             (struct ibv_context *ctx,
> -              size_t data_sz,
> -              void *data,
> +                       size_t num_actions, void *actions[]);
> +     void *(*dv_create_flow_action_counter)(void *obj, uint32_t  offset);
> +     void *(*dv_create_flow_action_dest_ibv_qp)(void *qp);
> +     void *(*dv_create_flow_action_modify_header)
> +             (struct ibv_context *ctx, size_t actions_sz, uint64_t actions[],
> +              enum mlx5dv_flow_table_type ft_type);
> +     void *(*dv_create_flow_action_packet_reformat)
> +             (struct ibv_context *ctx, size_t data_sz, void *data,
>                enum mlx5dv_flow_action_packet_reformat_type
> reformat_type,
>                enum mlx5dv_flow_table_type ft_type);
> -     struct ibv_flow_action *(*dv_create_flow_action_modify_header)
> -                                     (struct ibv_context *ctx,
> -                                      size_t actions_sz,
> -                                      uint64_t actions[],
> -                                      enum mlx5dv_flow_table_type
> ft_type);
> +     void *(*dv_create_flow_action_tag)(uint32_t tag);
>       struct ibv_context *(*dv_open_device)(struct ibv_device *device);
>       struct mlx5dv_devx_obj *(*devx_obj_create)
>                                       (struct ibv_context *ctx,
> --
> 1.8.3.1

Reply via email to