[dpdk-dev] [PATCH v2 1/3] net/mlx5: prepare Direct Verbs for Direct Rule

Ori Kam orika at mellanox.com
Thu Mar 28 17:32:55 CET 2019


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 <orika at 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



More information about the dev mailing list