From patchwork Thu Apr 18 11:28:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ori Kam X-Patchwork-Id: 52916 X-Patchwork-Delegate: shahafs@mellanox.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 89A831B9A3; Thu, 18 Apr 2019 13:29:26 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id BB9C61B970 for ; Thu, 18 Apr 2019 13:29:05 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from orika@mellanox.com) with ESMTPS (AES256-SHA encrypted); 18 Apr 2019 14:28:59 +0300 Received: from pegasus03.mtr.labs.mlnx (pegasus03.mtr.labs.mlnx [10.210.16.124]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x3IBSwk3024378; Thu, 18 Apr 2019 14:28:59 +0300 From: Ori Kam To: yskoh@mellanox.com, shahafs@mellanox.com, matan@mellanox.com, viacheslavo@mellanox.com, motih@mellanox.com Cc: dev@dpdk.org, orika@mellanox.com Date: Thu, 18 Apr 2019 11:28:50 +0000 Message-Id: <1555586930-109097-10-git-send-email-orika@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1555586930-109097-1-git-send-email-orika@mellanox.com> References: <1555276357-4892-1-git-send-email-orika@mellanox.com> <1555586930-109097-1-git-send-email-orika@mellanox.com> Subject: [dpdk-dev] [PATCH v2 9/9] net/mlx5: add drop action to Direct Verbs E-Switch X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This commit adds support for drop action when creating E-Switch flow using DV. Signed-off-by: Ori Kam --- v2: * Address ML comments. --- drivers/net/mlx5/mlx5.c | 9 +++++++++ drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_flow_dv.c | 23 ++++++++++++++++------- drivers/net/mlx5/mlx5_glue.c | 12 ++++++++++++ drivers/net/mlx5/mlx5_glue.h | 1 + 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index ff24e1d..65c69af 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -357,6 +357,7 @@ struct mlx5_dev_spawn_data { goto error; } sh->fdb_ns = ns; + sh->esw_drop_action = mlx5_glue->dr_create_flow_action_drop(); } #endif sh->dv_refcnt++; @@ -377,6 +378,10 @@ struct mlx5_dev_spawn_data { mlx5_glue->dr_destroy_ns(sh->fdb_ns); sh->fdb_ns = NULL; } + if (sh->esw_drop_action) { + mlx5_glue->destroy_flow_action(sh->esw_drop_action); + sh->esw_drop_action = NULL; + } return err; #else (void)priv; @@ -417,6 +422,10 @@ struct mlx5_dev_spawn_data { mlx5_glue->dr_destroy_ns(sh->fdb_ns); sh->fdb_ns = NULL; } + if (sh->esw_drop_action) { + mlx5_glue->destroy_flow_action(sh->esw_drop_action); + sh->esw_drop_action = NULL; + } #endif pthread_mutex_destroy(&sh->dv_mutex); #else diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 4b6dbc2..a736d57 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -275,6 +275,7 @@ struct mlx5_ibv_shared { /* RX Direct Rules tables. */ void *tx_ns; /* TX Direct Rules name space handle. */ struct mlx5_flow_tbl_resource tx_tbl[MLX5_MAX_TABLES]; + void *esw_drop_action; /* Pointer to DR E-Switch drop action. */ /* TX Direct Rules tables/ */ LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers; LIST_HEAD(encap_decap, mlx5_flow_dv_encap_decap_resource) encaps_decaps; diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 5997182..5ec8caf 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -4049,6 +4049,7 @@ struct field_modify_info modify_tcp[] = { { struct mlx5_flow_dv *dv; struct mlx5_flow *dev_flow; + struct mlx5_priv *priv = dev->data->dev_private; int n; int err; @@ -4056,13 +4057,21 @@ struct field_modify_info modify_tcp[] = { dv = &dev_flow->dv; n = dv->actions_n; if (flow->actions & MLX5_FLOW_ACTION_DROP) { - dv->hrxq = mlx5_hrxq_drop_new(dev); - if (!dv->hrxq) { - rte_flow_error_set - (error, errno, - RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, - "cannot get drop hash queue"); - goto error; + if (flow->transfer) + dv->actions[n++] = priv->sh->esw_drop_action; + else { + dv->hrxq = mlx5_hrxq_drop_new(dev); + if (!dv->hrxq) { + rte_flow_error_set + (error, errno, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "cannot get drop hash queue"); + goto error; + } + dv->actions[n++] = + mlx5_glue->dv_create_flow_action_dest_ibv_qp + (dv->hrxq->qp); } dv->actions[n++] = dv->hrxq->action; } else if (flow->actions & diff --git a/drivers/net/mlx5/mlx5_glue.c b/drivers/net/mlx5/mlx5_glue.c index 117190f..b32cd09c 100644 --- a/drivers/net/mlx5/mlx5_glue.c +++ b/drivers/net/mlx5/mlx5_glue.c @@ -394,6 +394,16 @@ } static void * +mlx5_glue_dr_create_flow_action_drop(void) +{ +#ifdef HAVE_MLX5DV_DR_ESWITCH + return mlx5dv_dr_create_action_drop(); +#else + return NULL; +#endif +} + +static void * mlx5_glue_dr_create_flow_tbl(void *ns, uint32_t level) { #ifdef HAVE_MLX5DV_DR @@ -861,6 +871,8 @@ mlx5_glue_dr_create_flow_action_dest_flow_tbl, .dr_create_flow_action_dest_vport = mlx5_glue_dr_create_flow_action_dest_vport, + .dr_create_flow_action_drop = + mlx5_glue_dr_create_flow_action_drop, .dr_create_flow_tbl = mlx5_glue_dr_create_flow_tbl, .dr_destroy_flow_tbl = mlx5_glue_dr_destroy_flow_tbl, .dr_create_ns = mlx5_glue_dr_create_ns, diff --git a/drivers/net/mlx5/mlx5_glue.h b/drivers/net/mlx5/mlx5_glue.h index 26f5cb3..1d06583 100644 --- a/drivers/net/mlx5/mlx5_glue.h +++ b/drivers/net/mlx5/mlx5_glue.h @@ -147,6 +147,7 @@ struct mlx5_glue { struct ibv_cq *(*cq_ex_to_cq)(struct ibv_cq_ex *cq); void *(*dr_create_flow_action_dest_flow_tbl)(void *tbl); void *(*dr_create_flow_action_dest_vport)(void *ns, uint32_t vport); + void *(*dr_create_flow_action_drop)(); void *(*dr_create_flow_tbl)(void *ns, uint32_t level); int (*dr_destroy_flow_tbl)(void *tbl); void *(*dr_create_ns)(struct ibv_context *ctx,