[dpdk-dev] [PATCH 22/25] net/mlx5: create global drop action
Suanming Mou
suanmingm at nvidia.com
Tue Oct 6 13:49:05 CEST 2020
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 at 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(-)
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);
--
1.8.3.1
More information about the dev
mailing list