All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Baum <michaelba@nvidia.com>
To: dev@dpdk.org
Cc: Matan Azrad <matan@nvidia.com>,
	Raslan Darawsheh <rasland@nvidia.com>,
	Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Subject: [dpdk-dev] [PATCH v1 18/18] net/mlx5: share Rx queue drop action code
Date: Thu,  3 Sep 2020 10:13:49 +0000	[thread overview]
Message-ID: <1599128029-2092-19-git-send-email-michaelba@nvidia.com> (raw)
In-Reply-To: <1599128029-2092-1-git-send-email-michaelba@nvidia.com>

Move Rx queue drop action similar resources allocations from Verbs
module to a shared location.

Signed-off-by: Michael Baum <michaelba@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
---
 drivers/net/mlx5/linux/mlx5_os.c    |   6 +-
 drivers/net/mlx5/linux/mlx5_verbs.c | 246 ++++++++++++------------------------
 drivers/net/mlx5/mlx5.h             |   4 +-
 drivers/net/mlx5/mlx5_devx.c        |  16 +--
 drivers/net/mlx5/mlx5_flow_dv.c     |  10 +-
 drivers/net/mlx5/mlx5_flow_verbs.c  |  10 +-
 drivers/net/mlx5/mlx5_rxq.c         |  72 +++++++++++
 drivers/net/mlx5/mlx5_rxtx.h        |   4 +-
 8 files changed, 180 insertions(+), 188 deletions(-)

diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index 505e7d9..ae871fe 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -1269,8 +1269,10 @@
 	}
 	if (config->devx && config->dv_flow_en) {
 		priv->obj_ops = devx_obj_ops;
-		priv->obj_ops.hrxq_drop_new = ibv_obj_ops.hrxq_drop_new;
-		priv->obj_ops.hrxq_drop_release = ibv_obj_ops.hrxq_drop_release;
+		priv->obj_ops.drop_action_create =
+						ibv_obj_ops.drop_action_create;
+		priv->obj_ops.drop_action_destroy =
+						ibv_obj_ops.drop_action_destroy;
 	} else {
 		priv->obj_ops = ibv_obj_ops;
 	}
diff --git a/drivers/net/mlx5/linux/mlx5_verbs.c b/drivers/net/mlx5/linux/mlx5_verbs.c
index 0a8ae65..d6e670f 100644
--- a/drivers/net/mlx5/linux/mlx5_verbs.c
+++ b/drivers/net/mlx5/linux/mlx5_verbs.c
@@ -614,73 +614,13 @@
 }
 
 /**
- * Create a drop Rx queue Verbs object.
- *
- * @param dev
- *   Pointer to Ethernet device.
- *
- * @return
- *   The Verbs object initialized, NULL otherwise and rte_errno is set.
- */
-static struct mlx5_rxq_obj *
-mlx5_rxq_obj_drop_new(struct rte_eth_dev *dev)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct ibv_context *ctx = priv->sh->ctx;
-	struct ibv_cq *cq;
-	struct ibv_wq *wq = NULL;
-	struct mlx5_rxq_obj *rxq;
-
-	if (priv->drop_queue.rxq)
-		return priv->drop_queue.rxq;
-	cq = mlx5_glue->create_cq(ctx, 1, NULL, NULL, 0);
-	if (!cq) {
-		DEBUG("Port %u cannot allocate CQ for drop queue.",
-		      dev->data->port_id);
-		rte_errno = errno;
-		goto error;
-	}
-	wq = mlx5_glue->create_wq(ctx,
-		 &(struct ibv_wq_init_attr){
-			.wq_type = IBV_WQT_RQ,
-			.max_wr = 1,
-			.max_sge = 1,
-			.pd = priv->sh->pd,
-			.cq = cq,
-		 });
-	if (!wq) {
-		DEBUG("Port %u cannot allocate WQ for drop queue.",
-		      dev->data->port_id);
-		rte_errno = errno;
-		goto error;
-	}
-	rxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*rxq), 0, SOCKET_ID_ANY);
-	if (!rxq) {
-		DEBUG("Port %u cannot allocate drop Rx queue memory.",
-		      dev->data->port_id);
-		rte_errno = ENOMEM;
-		goto error;
-	}
-	rxq->ibv_cq = cq;
-	rxq->wq = wq;
-	priv->drop_queue.rxq = rxq;
-	return rxq;
-error:
-	if (wq)
-		claim_zero(mlx5_glue->destroy_wq(wq));
-	if (cq)
-		claim_zero(mlx5_glue->destroy_cq(cq));
-	return NULL;
-}
-
-/**
  * Release a drop Rx queue Verbs object.
  *
  * @param dev
  *   Pointer to Ethernet device.
  */
 static void
-mlx5_rxq_obj_drop_release(struct rte_eth_dev *dev)
+mlx5_rxq_ibv_obj_drop_release(struct rte_eth_dev *dev)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_rxq_obj *rxq = priv->drop_queue.rxq;
@@ -694,127 +634,115 @@
 }
 
 /**
- * Create a drop indirection table.
+ * Create a drop Rx queue Verbs object.
  *
  * @param dev
  *   Pointer to Ethernet device.
  *
  * @return
- *   The Verbs object initialized, NULL otherwise and rte_errno is set.
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
-static struct mlx5_ind_table_obj *
-mlx5_ind_table_obj_drop_new(struct rte_eth_dev *dev)
+static int
+mlx5_rxq_ibv_obj_drop_create(struct rte_eth_dev *dev)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_ind_table_obj *ind_tbl;
-	struct mlx5_rxq_obj *rxq;
-	struct mlx5_ind_table_obj tmpl;
-
-	rxq = mlx5_rxq_obj_drop_new(dev);
-	if (!rxq)
-		return NULL;
-	tmpl.ind_table = mlx5_glue->create_rwq_ind_table
-		(priv->sh->ctx,
-		 &(struct ibv_rwq_ind_table_init_attr){
-			.log_ind_tbl_size = 0,
-			.ind_tbl = (struct ibv_wq **)&rxq->wq,
-			.comp_mask = 0,
-		 });
-	if (!tmpl.ind_table) {
-		DEBUG("Port %u cannot allocate indirection table for drop"
-		      " queue.", dev->data->port_id);
+	struct ibv_context *ctx = priv->sh->ctx;
+	struct mlx5_rxq_obj *rxq = priv->drop_queue.rxq;
+
+	if (rxq)
+		return 0;
+	rxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*rxq), 0, SOCKET_ID_ANY);
+	if (!rxq) {
+		DEBUG("Port %u cannot allocate drop Rx queue memory.",
+		      dev->data->port_id);
+		rte_errno = ENOMEM;
+		return -rte_errno;
+	}
+	priv->drop_queue.rxq = rxq;
+	rxq->ibv_cq = mlx5_glue->create_cq(ctx, 1, NULL, NULL, 0);
+	if (!rxq->ibv_cq) {
+		DEBUG("Port %u cannot allocate CQ for drop queue.",
+		      dev->data->port_id);
 		rte_errno = errno;
 		goto error;
 	}
-	ind_tbl = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*ind_tbl), 0,
-			      SOCKET_ID_ANY);
-	if (!ind_tbl) {
-		rte_errno = ENOMEM;
+	rxq->wq = mlx5_glue->create_wq(ctx, &(struct ibv_wq_init_attr){
+						    .wq_type = IBV_WQT_RQ,
+						    .max_wr = 1,
+						    .max_sge = 1,
+						    .pd = priv->sh->pd,
+						    .cq = rxq->ibv_cq,
+					      });
+	if (!rxq->wq) {
+		DEBUG("Port %u cannot allocate WQ for drop queue.",
+		      dev->data->port_id);
+		rte_errno = errno;
 		goto error;
 	}
-	ind_tbl->ind_table = tmpl.ind_table;
-	return ind_tbl;
+	priv->drop_queue.rxq = rxq;
+	return 0;
 error:
-	mlx5_rxq_obj_drop_release(dev);
-	return NULL;
-}
-
-/**
- * Release a drop indirection table.
- *
- * @param dev
- *   Pointer to Ethernet device.
- */
-static void
-mlx5_ind_table_obj_drop_release(struct rte_eth_dev *dev)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_ind_table_obj *ind_tbl = priv->drop_queue.hrxq->ind_table;
-
-	claim_zero(mlx5_glue->destroy_rwq_ind_table(ind_tbl->ind_table));
-	mlx5_rxq_obj_drop_release(dev);
-	mlx5_free(ind_tbl);
-	priv->drop_queue.hrxq->ind_table = NULL;
+	mlx5_rxq_ibv_obj_drop_release(dev);
+	return -rte_errno;
 }
 
 /**
- * Create a drop Rx Hash queue.
+ * Create a Verbs drop action for Rx Hash queue.
  *
  * @param dev
  *   Pointer to Ethernet device.
  *
  * @return
- *   The Verbs object initialized, NULL otherwise and rte_errno is set.
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
-static struct mlx5_hrxq *
-mlx5_ibv_hrxq_drop_new(struct rte_eth_dev *dev)
+static int
+mlx5_ibv_drop_action_create(struct rte_eth_dev *dev)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_ind_table_obj *ind_tbl = NULL;
-	struct ibv_qp *qp = NULL;
-	struct mlx5_hrxq *hrxq = NULL;
+	struct mlx5_hrxq *hrxq = priv->drop_queue.hrxq;
+	struct ibv_rwq_ind_table *ind_tbl = NULL;
+	struct mlx5_rxq_obj *rxq;
+	int ret;
 
-	if (priv->drop_queue.hrxq) {
-		rte_atomic32_inc(&priv->drop_queue.hrxq->refcnt);
-		return priv->drop_queue.hrxq;
-	}
-	hrxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*hrxq), 0, SOCKET_ID_ANY);
-	if (!hrxq) {
-		DRV_LOG(WARNING,
-			"Port %u cannot allocate memory for drop queue.",
-			dev->data->port_id);
-		rte_errno = ENOMEM;
+	MLX5_ASSERT(hrxq && hrxq->ind_table);
+	ret = mlx5_rxq_ibv_obj_drop_create(dev);
+	if (ret < 0)
 		goto error;
-	}
-	priv->drop_queue.hrxq = hrxq;
-	ind_tbl = mlx5_ind_table_obj_drop_new(dev);
-	if (!ind_tbl)
+	rxq = priv->drop_queue.rxq;
+	ind_tbl = mlx5_glue->create_rwq_ind_table
+				(priv->sh->ctx,
+				 &(struct ibv_rwq_ind_table_init_attr){
+					.log_ind_tbl_size = 0,
+					.ind_tbl = (struct ibv_wq **)&rxq->wq,
+					.comp_mask = 0,
+				 });
+	if (!ind_tbl) {
+		DEBUG("Port %u cannot allocate indirection table for drop"
+		      " queue.", dev->data->port_id);
+		rte_errno = errno;
 		goto error;
-	hrxq->ind_table = ind_tbl;
-	qp = mlx5_glue->create_qp_ex(priv->sh->ctx,
+	}
+	hrxq->qp = mlx5_glue->create_qp_ex(priv->sh->ctx,
 		 &(struct ibv_qp_init_attr_ex){
 			.qp_type = IBV_QPT_RAW_PACKET,
-			.comp_mask =
-				IBV_QP_INIT_ATTR_PD |
-				IBV_QP_INIT_ATTR_IND_TABLE |
-				IBV_QP_INIT_ATTR_RX_HASH,
+			.comp_mask = IBV_QP_INIT_ATTR_PD |
+				     IBV_QP_INIT_ATTR_IND_TABLE |
+				     IBV_QP_INIT_ATTR_RX_HASH,
 			.rx_hash_conf = (struct ibv_rx_hash_conf){
-				.rx_hash_function =
-					IBV_RX_HASH_FUNC_TOEPLITZ,
+				.rx_hash_function = IBV_RX_HASH_FUNC_TOEPLITZ,
 				.rx_hash_key_len = MLX5_RSS_HASH_KEY_LEN,
 				.rx_hash_key = rss_hash_default_key,
 				.rx_hash_fields_mask = 0,
 				},
-			.rwq_ind_tbl = ind_tbl->ind_table,
+			.rwq_ind_tbl = ind_tbl,
 			.pd = priv->sh->pd
 		 });
-	if (!qp) {
+	if (!hrxq->qp) {
 		DEBUG("Port %u cannot allocate QP for drop queue.",
 		      dev->data->port_id);
 		rte_errno = errno;
 		goto error;
 	}
-	hrxq->qp = qp;
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
 	hrxq->action = mlx5_glue->dv_create_flow_action_dest_ibv_qp(hrxq->qp);
 	if (!hrxq->action) {
@@ -822,22 +750,16 @@
 		goto error;
 	}
 #endif
-	rte_atomic32_set(&hrxq->refcnt, 1);
-	return hrxq;
+	hrxq->ind_table->ind_table = ind_tbl;
+	return 0;
 error:
-#ifdef HAVE_IBV_FLOW_DV_SUPPORT
-	if (hrxq && hrxq->action)
-		mlx5_glue->destroy_flow_action(hrxq->action);
-#endif
-	if (qp)
+	if (hrxq->qp)
 		claim_zero(mlx5_glue->destroy_qp(hrxq->qp));
 	if (ind_tbl)
-		mlx5_ind_table_obj_drop_release(dev);
-	if (hrxq) {
-		priv->drop_queue.hrxq = NULL;
-		mlx5_free(hrxq);
-	}
-	return NULL;
+		claim_zero(mlx5_glue->destroy_rwq_ind_table(ind_tbl));
+	if (priv->drop_queue.rxq)
+		mlx5_rxq_ibv_obj_drop_release(dev);
+	return -rte_errno;
 }
 
 /**
@@ -847,20 +769,18 @@
  *   Pointer to Ethernet device.
  */
 static void
-mlx5_ibv_hrxq_drop_release(struct rte_eth_dev *dev)
+mlx5_ibv_drop_action_destroy(struct rte_eth_dev *dev)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_hrxq *hrxq = priv->drop_queue.hrxq;
+	struct ibv_rwq_ind_table *ind_tbl = hrxq->ind_table->ind_table;
 
-	if (rte_atomic32_dec_and_test(&hrxq->refcnt)) {
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
-		mlx5_glue->destroy_flow_action(hrxq->action);
+	claim_zero(mlx5_glue->destroy_flow_action(hrxq->action));
 #endif
-		claim_zero(mlx5_glue->destroy_qp(hrxq->qp));
-		mlx5_ind_table_obj_drop_release(dev);
-		mlx5_free(hrxq);
-		priv->drop_queue.hrxq = NULL;
-	}
+	claim_zero(mlx5_glue->destroy_qp(hrxq->qp));
+	claim_zero(mlx5_glue->destroy_rwq_ind_table(ind_tbl));
+	mlx5_rxq_ibv_obj_drop_release(dev);
 }
 
 struct mlx5_obj_ops ibv_obj_ops = {
@@ -873,6 +793,6 @@ struct mlx5_obj_ops ibv_obj_ops = {
 	.ind_table_destroy = mlx5_ibv_ind_table_destroy,
 	.hrxq_new = mlx5_ibv_hrxq_new,
 	.hrxq_destroy = mlx5_ibv_qp_destroy,
-	.hrxq_drop_new = mlx5_ibv_hrxq_drop_new,
-	.hrxq_drop_release = mlx5_ibv_hrxq_drop_release,
+	.drop_action_create = mlx5_ibv_drop_action_create,
+	.drop_action_destroy = mlx5_ibv_drop_action_destroy,
 };
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 8cef097..865e72d 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -748,8 +748,8 @@ struct mlx5_obj_ops {
 	int (*hrxq_new)(struct rte_eth_dev *dev, struct mlx5_hrxq *hrxq,
 			int tunnel __rte_unused);
 	void (*hrxq_destroy)(struct mlx5_hrxq *hrxq);
-	struct mlx5_hrxq *(*hrxq_drop_new)(struct rte_eth_dev *dev);
-	void (*hrxq_drop_release)(struct rte_eth_dev *dev);
+	int (*drop_action_create)(struct rte_eth_dev *dev);
+	void (*drop_action_destroy)(struct rte_eth_dev *dev);
 };
 
 struct mlx5_priv {
diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c
index ddaab83..3e81fcc 100644
--- a/drivers/net/mlx5/mlx5_devx.c
+++ b/drivers/net/mlx5/mlx5_devx.c
@@ -792,21 +792,21 @@
 }
 
 /**
- * Create a drop Rx Hash queue.
+ * Create a DevX drop action for Rx Hash queue.
  *
  * @param dev
  *   Pointer to Ethernet device.
  *
  * @return
- *   The DevX object initialized, NULL otherwise and rte_errno is set.
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
-static struct mlx5_hrxq *
-mlx5_devx_hrxq_drop_new(struct rte_eth_dev *dev)
+static int
+mlx5_devx_drop_action_create(struct rte_eth_dev *dev)
 {
 	(void)dev;
 	DRV_LOG(ERR, "DevX drop action is not supported yet");
 	rte_errno = ENOTSUP;
-	return NULL;
+	return -rte_errno;
 }
 
 /**
@@ -816,7 +816,7 @@
  *   Pointer to Ethernet device.
  */
 static void
-mlx5_devx_hrxq_drop_release(struct rte_eth_dev *dev)
+mlx5_devx_drop_action_destroy(struct rte_eth_dev *dev)
 {
 	(void)dev;
 	DRV_LOG(ERR, "DevX drop action is not supported yet");
@@ -833,6 +833,6 @@ struct mlx5_obj_ops devx_obj_ops = {
 	.ind_table_destroy = mlx5_devx_ind_table_destroy,
 	.hrxq_new = mlx5_devx_hrxq_new,
 	.hrxq_destroy = mlx5_devx_tir_destroy,
-	.hrxq_drop_new = mlx5_devx_hrxq_drop_new,
-	.hrxq_drop_release = mlx5_devx_hrxq_drop_release,
+	.drop_action_create = mlx5_devx_drop_action_create,
+	.drop_action_destroy = mlx5_devx_drop_action_destroy,
 };
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index f953a2d..56529c8 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -8917,7 +8917,7 @@ struct field_modify_info modify_tcp[] = {
 				dv->actions[n++] = priv->sh->esw_drop_action;
 			} else {
 				struct mlx5_hrxq *drop_hrxq;
-				drop_hrxq = priv->obj_ops.hrxq_drop_new(dev);
+				drop_hrxq = mlx5_drop_action_create(dev);
 				if (!drop_hrxq) {
 					rte_flow_error_set
 						(error, errno,
@@ -8928,7 +8928,7 @@ struct field_modify_info modify_tcp[] = {
 				}
 				/*
 				 * Drop queues will be released by the specify
-				 * mlx5_hrxq_drop_release() function. Assign
+				 * mlx5_drop_action_destroy() function. Assign
 				 * the special index to hrxq to mark the queue
 				 * has been allocated.
 				 */
@@ -9013,7 +9013,7 @@ struct field_modify_info modify_tcp[] = {
 		/* hrxq is union, don't clear it if the flag is not set. */
 		if (dh->rix_hrxq) {
 			if (dh->fate_action == MLX5_FLOW_FATE_DROP) {
-				priv->obj_ops.hrxq_drop_release(dev);
+				mlx5_drop_action_destroy(dev);
 				dh->rix_hrxq = 0;
 			} else if (dh->fate_action == MLX5_FLOW_FATE_QUEUE) {
 				mlx5_hrxq_release(dev, dh->rix_hrxq);
@@ -9303,13 +9303,11 @@ struct field_modify_info modify_tcp[] = {
 flow_dv_fate_resource_release(struct rte_eth_dev *dev,
 			       struct mlx5_flow_handle *handle)
 {
-	struct mlx5_priv *priv = dev->data->dev_private;
-
 	if (!handle->rix_fate)
 		return;
 	switch (handle->fate_action) {
 	case MLX5_FLOW_FATE_DROP:
-		priv->obj_ops.hrxq_drop_release(dev);
+		mlx5_drop_action_destroy(dev);
 		break;
 	case MLX5_FLOW_FATE_QUEUE:
 		mlx5_hrxq_release(dev, handle->rix_hrxq);
diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c
index e5fc278..62c18b8 100644
--- a/drivers/net/mlx5/mlx5_flow_verbs.c
+++ b/drivers/net/mlx5/mlx5_flow_verbs.c
@@ -72,7 +72,7 @@
 		},
 	};
 	struct ibv_flow *flow;
-	struct mlx5_hrxq *drop = priv->obj_ops.hrxq_drop_new(dev);
+	struct mlx5_hrxq *drop = mlx5_drop_action_create(dev);
 	uint16_t vprio[] = { 8, 16 };
 	int i;
 	int priority = 0;
@@ -89,7 +89,7 @@
 		claim_zero(mlx5_glue->destroy_flow(flow));
 		priority = vprio[i];
 	}
-	priv->obj_ops.hrxq_drop_release(dev);
+	mlx5_drop_action_destroy(dev);
 	switch (priority) {
 	case 8:
 		priority = RTE_DIM(priority_map_3);
@@ -1889,7 +1889,7 @@
 		/* hrxq is union, don't touch it only the flag is set. */
 		if (handle->rix_hrxq) {
 			if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
-				priv->obj_ops.hrxq_drop_release(dev);
+				mlx5_drop_action_destroy(dev);
 				handle->rix_hrxq = 0;
 			} else if (handle->fate_action ==
 				   MLX5_FLOW_FATE_QUEUE) {
@@ -1965,7 +1965,7 @@
 		dev_flow = &((struct mlx5_flow *)priv->inter_flows)[idx];
 		handle = dev_flow->handle;
 		if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
-			hrxq = priv->obj_ops.hrxq_drop_new(dev);
+			hrxq = mlx5_drop_action_create(dev);
 			if (!hrxq) {
 				rte_flow_error_set
 					(error, errno,
@@ -2034,7 +2034,7 @@
 		/* hrxq is union, don't touch it only the flag is set. */
 		if (handle->rix_hrxq) {
 			if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
-				priv->obj_ops.hrxq_drop_release(dev);
+				mlx5_drop_action_destroy(dev);
 				handle->rix_hrxq = 0;
 			} else if (handle->fate_action ==
 				   MLX5_FLOW_FATE_QUEUE) {
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 99b32f6..0b3e813 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -2006,6 +2006,78 @@ struct mlx5_ind_table_obj *
 }
 
 /**
+ * Create a drop Rx Hash queue.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ *
+ * @return
+ *   The Verbs/DevX object initialized, NULL otherwise and rte_errno is set.
+ */
+struct mlx5_hrxq *
+mlx5_drop_action_create(struct rte_eth_dev *dev)
+{
+	struct mlx5_priv *priv = dev->data->dev_private;
+	struct mlx5_hrxq *hrxq = NULL;
+	int ret;
+
+	if (priv->drop_queue.hrxq) {
+		rte_atomic32_inc(&priv->drop_queue.hrxq->refcnt);
+		return priv->drop_queue.hrxq;
+	}
+	hrxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*hrxq), 0, SOCKET_ID_ANY);
+	if (!hrxq) {
+		DRV_LOG(WARNING,
+			"Port %u cannot allocate memory for drop queue.",
+			dev->data->port_id);
+		rte_errno = ENOMEM;
+		goto error;
+	}
+	priv->drop_queue.hrxq = hrxq;
+	hrxq->ind_table = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*hrxq->ind_table),
+				      0, SOCKET_ID_ANY);
+	if (!hrxq->ind_table) {
+		rte_errno = ENOMEM;
+		goto error;
+	}
+	ret = priv->obj_ops.drop_action_create(dev);
+	if (ret < 0)
+		goto error;
+	rte_atomic32_set(&hrxq->refcnt, 1);
+	return hrxq;
+error:
+	if (hrxq) {
+		if (hrxq->ind_table)
+			mlx5_free(hrxq->ind_table);
+		priv->drop_queue.hrxq = NULL;
+		mlx5_free(hrxq);
+	}
+	return NULL;
+}
+
+/**
+ * Release a drop hash Rx queue.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ */
+void
+mlx5_drop_action_destroy(struct rte_eth_dev *dev)
+{
+	struct mlx5_priv *priv = dev->data->dev_private;
+	struct mlx5_hrxq *hrxq = priv->drop_queue.hrxq;
+
+	if (rte_atomic32_dec_and_test(&hrxq->refcnt)) {
+		priv->obj_ops.drop_action_destroy(dev);
+		mlx5_free(priv->drop_queue.rxq);
+		mlx5_free(hrxq->ind_table);
+		mlx5_free(hrxq);
+		priv->drop_queue.rxq = NULL;
+		priv->drop_queue.hrxq = NULL;
+	}
+}
+
+/**
  * Verify the Rx Queue list is empty
  *
  * @param dev
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 164f36b..a8e6837 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -382,8 +382,8 @@ uint32_t mlx5_hrxq_get(struct rte_eth_dev *dev,
 int mlx5_hrxq_release(struct rte_eth_dev *dev, uint32_t hxrq_idx);
 int mlx5_hrxq_verify(struct rte_eth_dev *dev);
 enum mlx5_rxq_type mlx5_rxq_get_type(struct rte_eth_dev *dev, uint16_t idx);
-struct mlx5_hrxq *mlx5_hrxq_drop_new(struct rte_eth_dev *dev);
-void mlx5_hrxq_drop_release(struct rte_eth_dev *dev);
+struct mlx5_hrxq *mlx5_drop_action_create(struct rte_eth_dev *dev);
+void mlx5_drop_action_destroy(struct rte_eth_dev *dev);
 uint64_t mlx5_get_rx_port_offloads(void);
 uint64_t mlx5_get_rx_queue_offloads(struct rte_eth_dev *dev);
 void mlx5_rxq_timestamp_set(struct rte_eth_dev *dev);
-- 
1.8.3.1


  parent reply	other threads:[~2020-09-03 10:17 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-03 10:13 [dpdk-dev] [PATCH v1 00/18] mlx5 Rx DevX/Verbs separation Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 01/18] net/mlx5: fix Rx hash queue creation error flow Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 02/18] net/mlx5: fix Rx queue state update Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 03/18] net/mlx5: fix types differentiation in Rxq create Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 04/18] net/mlx5: mitigate Rx queue reference counters Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 05/18] net/mlx5: separate Rx queue object creations Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 06/18] net/mlx5: separate Rx interrupt handling Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 07/18] net/mlx5: share Rx control code Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 08/18] net/mlx5: rearrange the creation of RQ and CQ resources Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 09/18] net/mlx5: rearrange the creation of WQ and CQ object Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 10/18] net/mlx5: separate Rx queue object modification Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 11/18] net/mlx5: share " Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 12/18] net/mlx5: separate Rx indirection table object creation Michael Baum
2020-09-09 11:29   ` Ferruh Yigit
2020-09-09 14:37     ` Matan Azrad
2020-09-09 16:28       ` Ferruh Yigit
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 13/18] net/mlx5: separate Rx hash queue creation Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 14/18] net/mlx5: remove indirection table type field Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 15/18] net/mlx5: share Rx queue indirection table code Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 16/18] net/mlx5: share Rx hash queue code Michael Baum
2020-09-03 10:13 ` [dpdk-dev] [PATCH v1 17/18] net/mlx5: separate Rx queue drop Michael Baum
2020-09-03 10:13 ` Michael Baum [this message]
2020-09-03 14:34 ` [dpdk-dev] [PATCH v1 00/18] mlx5 Rx DevX/Verbs separation Tom Barbette
2020-09-03 20:59   ` Michael Baum
2020-09-04  7:30     ` David Marchand
2020-09-04  7:47     ` Thomas Monjalon
2020-09-06  7:32       ` Michael Baum
2020-09-08 11:46 ` Raslan Darawsheh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1599128029-2092-19-git-send-email-michaelba@nvidia.com \
    --to=michaelba@nvidia.com \
    --cc=dev@dpdk.org \
    --cc=matan@nvidia.com \
    --cc=rasland@nvidia.com \
    --cc=viacheslavo@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.