> On Apr 12, 2019, at 4:51 PM, dwilder <dwil...@us.ibm.com> wrote: > > I am seeing a build break when building on ubuntu 19.04 beta after this > commit (cbb66daa3). > > The build produces a number of the following errors. > > drivers/net/mlx5/mlx5_glue.c:194:2: error: implicit declaration of function > ‘free’ > .... > drivers/net/mlx5/mlx5_glue.c:552:11: error: incompatible implicit declaration > of built-in function ‘malloc’ [-Werror] > .... > > Adding "#include <stdlib.h>" to drivers/net/mlx5/mlx5_glue.c fixed it for me. > > I do not see this problem on Ubuntu 18.04, maybe some headers have changed. > I have only tested on ppc64le.
Thanks for the notice. That patch's been merged on to the PMD branch and will be merged on to the master soon http://git.dpdk.org/next/dpdk-next-net-mlx/commit/?id=4d6b192ccc15a4adfe575900519ba90059e2abd2 Yongseok > On 2019-04-04 02:54, Ori Kam wrote: >> 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: Shahaf Shuler <shah...@mellanox.com> >> --- >> drivers/net/mlx5/Makefile | 2 +- >> drivers/net/mlx5/meson.build | 2 +- >> drivers/net/mlx5/mlx5.h | 2 + >> drivers/net/mlx5/mlx5_flow.h | 17 +++- >> drivers/net/mlx5/mlx5_flow_dv.c | 184 >> +++++++++++++++++++++++++++++----------- >> drivers/net/mlx5/mlx5_glue.c | 141 ++++++++++++++++++++++++------ >> drivers/net/mlx5/mlx5_glue.h | 26 +++--- >> 7 files changed, 280 insertions(+), 94 deletions(-) >> diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile >> index ccd179c..0d20f0f 100644 >> --- a/drivers/net/mlx5/Makefile >> +++ b/drivers/net/mlx5/Makefile >> @@ -8,7 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk >> LIB = librte_pmd_mlx5.a >> LIB_GLUE = $(LIB_GLUE_BASE).$(LIB_GLUE_VERSION) >> LIB_GLUE_BASE = librte_pmd_mlx5_glue.so >> -LIB_GLUE_VERSION = 19.02.0 >> +LIB_GLUE_VERSION = 19.05.0 >> # Sources. >> SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5.c >> diff --git a/drivers/net/mlx5/meson.build b/drivers/net/mlx5/meson.build >> index a429655..a4c684e 100644 >> --- a/drivers/net/mlx5/meson.build >> +++ b/drivers/net/mlx5/meson.build >> @@ -4,7 +4,7 @@ >> pmd_dlopen = (get_option('ibverbs_link') == 'dlopen') >> LIB_GLUE_BASE = 'librte_pmd_mlx5_glue.so' >> -LIB_GLUE_VERSION = '19.02.0' >> +LIB_GLUE_VERSION = '19.05.0' >> LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION >> if pmd_dlopen >> dpdk_conf.set('RTE_IBVERBS_LINK_DLOPEN', 1) >> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h >> index 47a7d75..784bf9b 100644 >> --- a/drivers/net/mlx5/mlx5.h >> +++ b/drivers/net/mlx5/mlx5.h >> @@ -309,6 +309,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 ad84dea..d9e2ac9 100644 >> --- a/drivers/net/mlx5/mlx5_flow_dv.c >> +++ b/drivers/net/mlx5/mlx5_flow_dv.c >> @@ -32,7 +32,6 @@ >> #include "mlx5_prm.h" >> #include "mlx5_glue.h" >> #include "mlx5_flow.h" >> - >> #ifdef HAVE_IBV_FLOW_DV_SUPPORT >> #ifndef HAVE_IBV_FLOW_DEVX_COUNTERS >> @@ -1537,6 +1536,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 +2832,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 +2967,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 +2982,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 +3032,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_COUNTERS_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 +3059,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 +3071,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 +3084,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 +3092,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 +3109,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 +3179,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 +3355,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 +3382,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 +3562,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..4b5aade 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_COUNTERS_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..32487ea 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_COUNTERS_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, >