[22/25] net/mlx5: create global drop action
diff mbox series

Message ID 1601984948-313027-23-git-send-email-suanmingm@nvidia.com
State Superseded
Delegated to: Raslan Darawsheh
Headers show
Series
  • net/mlx5: support multiple-thread flow operations
Related show

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Suanming Mou Oct. 6, 2020, 11:49 a.m. UTC
This commit creates the global drop action for flows instread of
maintain it in flow insertion time. The uniqueu global drop action
makes it thread safe.

Signed-off-by: Suanming Mou <suanmingm@nvidia.com>
---
 drivers/net/mlx5/linux/mlx5_os.c   |  5 +++++
 drivers/net/mlx5/mlx5.c            |  2 ++
 drivers/net/mlx5/mlx5_flow_dv.c    | 31 +++++++------------------------
 drivers/net/mlx5/mlx5_flow_verbs.c | 35 ++++++++++++-----------------------
 4 files changed, 26 insertions(+), 47 deletions(-)

Patch
diff mbox series

diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index f0470a2..c3dda27 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -1331,6 +1331,9 @@ 
 	} else {
 		priv->obj_ops = ibv_obj_ops;
 	}
+	priv->drop_queue.hrxq = mlx5_drop_action_create(eth_dev);
+	if (!priv->drop_queue.hrxq)
+		goto error;
 	/* Supported Verbs flow priority number detection. */
 	err = mlx5_flow_discover_priorities(eth_dev);
 	if (err < 0) {
@@ -1401,6 +1404,8 @@ 
 			close(priv->nl_socket_rdma);
 		if (priv->vmwa_context)
 			mlx5_vlan_vmwa_exit(priv->vmwa_context);
+		if (eth_dev && priv->drop_queue.hrxq)
+			mlx5_drop_action_destroy(eth_dev);
 		if (priv->default_miss_action)
 			mlx5_glue->destroy_flow_action
 					(priv->default_miss_action);
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 1d57d16..d2b3cf1 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1203,6 +1203,8 @@  struct mlx5_dev_ctx_shared *
 		priv->txqs = NULL;
 	}
 	mlx5_proc_priv_uninit(dev);
+	if (priv->drop_queue.hrxq)
+		mlx5_drop_action_destroy(dev);
 	if (priv->default_miss_action)
 		mlx5_glue->destroy_flow_action(priv->default_miss_action);
 	if (priv->mreg_cp_tbl)
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 80df066..ff91c8b 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -8951,9 +8951,7 @@  struct mlx5_hlist_entry *
 			if (dv->transfer) {
 				dv->actions[n++] = priv->sh->esw_drop_action;
 			} else {
-				struct mlx5_hrxq *drop_hrxq;
-				drop_hrxq = mlx5_drop_action_create(dev);
-				if (!drop_hrxq) {
+				if (!priv->drop_queue.hrxq) {
 					rte_flow_error_set
 						(error, errno,
 						 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
@@ -8961,14 +8959,8 @@  struct mlx5_hlist_entry *
 						 "cannot get drop hash queue");
 					goto error;
 				}
-				/*
-				 * Drop queues will be released by the specify
-				 * mlx5_drop_action_destroy() function. Assign
-				 * the special index to hrxq to mark the queue
-				 * has been allocated.
-				 */
-				dh->rix_hrxq = UINT32_MAX;
-				dv->actions[n++] = drop_hrxq->action;
+				dv->actions[n++] =
+						priv->drop_queue.hrxq->action;
 			}
 		} else if (dh->fate_action == MLX5_FLOW_FATE_QUEUE) {
 			struct mlx5_hrxq *hrxq;
@@ -9030,14 +9022,9 @@  struct mlx5_hlist_entry *
 	SILIST_FOREACH(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW], flow->dev_handles,
 		       handle_idx, dh, next) {
 		/* 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) {
-				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);
-				dh->rix_hrxq = 0;
-			}
+		if (dh->fate_action == MLX5_FLOW_FATE_QUEUE && dh->rix_hrxq) {
+			mlx5_hrxq_release(dev, dh->rix_hrxq);
+			dh->rix_hrxq = 0;
 		}
 		if (dh->vf_vlan.tag && dh->vf_vlan.created)
 			mlx5_vlan_vmwa_release(dev, &dh->vf_vlan);
@@ -9280,9 +9267,6 @@  struct mlx5_hlist_entry *
 	if (!handle->rix_fate)
 		return;
 	switch (handle->fate_action) {
-	case MLX5_FLOW_FATE_DROP:
-		mlx5_drop_action_destroy(dev);
-		break;
 	case MLX5_FLOW_FATE_QUEUE:
 		mlx5_hrxq_release(dev, handle->rix_hrxq);
 		break;
@@ -9327,8 +9311,7 @@  struct mlx5_hlist_entry *
 			claim_zero(mlx5_flow_os_destroy_flow(dh->drv_flow));
 			dh->drv_flow = NULL;
 		}
-		if (dh->fate_action == MLX5_FLOW_FATE_DROP ||
-		    dh->fate_action == MLX5_FLOW_FATE_QUEUE)
+		if (dh->fate_action == MLX5_FLOW_FATE_QUEUE)
 			flow_dv_fate_resource_release(dev, dh);
 		if (dh->vf_vlan.tag && dh->vf_vlan.created)
 			mlx5_vlan_vmwa_release(dev, &dh->vf_vlan);
diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c
index 905da8a..e8a704b 100644
--- a/drivers/net/mlx5/mlx5_flow_verbs.c
+++ b/drivers/net/mlx5/mlx5_flow_verbs.c
@@ -72,12 +72,12 @@ 
 		},
 	};
 	struct ibv_flow *flow;
-	struct mlx5_hrxq *drop = mlx5_drop_action_create(dev);
+	struct mlx5_hrxq *drop = priv->drop_queue.hrxq;
 	uint16_t vprio[] = { 8, 16 };
 	int i;
 	int priority = 0;
 
-	if (!drop) {
+	if (!drop->qp) {
 		rte_errno = ENOTSUP;
 		return -rte_errno;
 	}
@@ -89,7 +89,6 @@ 
 		claim_zero(mlx5_glue->destroy_flow(flow));
 		priority = vprio[i];
 	}
-	mlx5_drop_action_destroy(dev);
 	switch (priority) {
 	case 8:
 		priority = RTE_DIM(priority_map_3);
@@ -1890,15 +1889,10 @@ 
 			handle->drv_flow = NULL;
 		}
 		/* hrxq is union, don't touch it only the flag is set. */
-		if (handle->rix_hrxq) {
-			if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
-				mlx5_drop_action_destroy(dev);
-				handle->rix_hrxq = 0;
-			} else if (handle->fate_action ==
-				   MLX5_FLOW_FATE_QUEUE) {
-				mlx5_hrxq_release(dev, handle->rix_hrxq);
-				handle->rix_hrxq = 0;
-			}
+		if (handle->rix_hrxq &&
+		    handle->fate_action == MLX5_FLOW_FATE_QUEUE) {
+			mlx5_hrxq_release(dev, handle->rix_hrxq);
+			handle->rix_hrxq = 0;
 		}
 		if (handle->vf_vlan.tag && handle->vf_vlan.created)
 			mlx5_vlan_vmwa_release(dev, &handle->vf_vlan);
@@ -1970,8 +1964,8 @@ 
 		dev_flow = &wks->flows[idx];
 		handle = dev_flow->handle;
 		if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
-			hrxq = mlx5_drop_action_create(dev);
-			if (!hrxq) {
+			hrxq = priv->drop_queue.hrxq;
+			if (hrxq->qp) {
 				rte_flow_error_set
 					(error, errno,
 					 RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
@@ -2027,15 +2021,10 @@ 
 	SILIST_FOREACH(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW], flow->dev_handles,
 		       dev_handles, handle, next) {
 		/* hrxq is union, don't touch it only the flag is set. */
-		if (handle->rix_hrxq) {
-			if (handle->fate_action == MLX5_FLOW_FATE_DROP) {
-				mlx5_drop_action_destroy(dev);
-				handle->rix_hrxq = 0;
-			} else if (handle->fate_action ==
-				   MLX5_FLOW_FATE_QUEUE) {
-				mlx5_hrxq_release(dev, handle->rix_hrxq);
-				handle->rix_hrxq = 0;
-			}
+		if (handle->rix_hrxq &&
+		    handle->fate_action == MLX5_FLOW_FATE_QUEUE) {
+			mlx5_hrxq_release(dev, handle->rix_hrxq);
+			handle->rix_hrxq = 0;
 		}
 		if (handle->vf_vlan.tag && handle->vf_vlan.created)
 			mlx5_vlan_vmwa_release(dev, &handle->vf_vlan);