From patchwork Tue Apr 2 06:22:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Slava Ovsiienko X-Patchwork-Id: 52051 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 CD0FE3798; Tue, 2 Apr 2019 08:22:49 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id E0DE15A for ; Tue, 2 Apr 2019 08:22:44 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Apr 2019 09:22:41 +0300 Received: from pegasus12.mtr.labs.mlnx. (pegasus12.mtr.labs.mlnx [10.210.17.40]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x326MfmU024769; Tue, 2 Apr 2019 09:22:41 +0300 From: Viacheslav Ovsiienko To: dev@dpdk.org Cc: shahafs@mellanox.com Date: Tue, 2 Apr 2019 06:22:34 +0000 Message-Id: <1554186157-29455-2-git-send-email-viacheslavo@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> References: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> Subject: [dpdk-dev] [PATCH 1/4] net/mlx5: add DV/DR flow data alloc/free routines 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" We are going to share the DR/DV flow device data structures between master and representors in the E-Switch configurations over multiport IB device. The code of initializing and destroying these data is moved to dedicated routines, this is just a preparation step for actual data sharing. Signed-off-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.c | 90 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index b59fc58..9de122d 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -296,6 +296,73 @@ struct mlx5_dev_spawn_data { pthread_mutex_unlock(&mlx5_ibv_list_mutex); } +#ifdef HAVE_MLX5DV_DR +/** + * Initialize DV/DR related data within private structure. + * This is preparation step for the data sharing. + * + * @param[in] priv + * Pointer to the private device data structure. + * + * @return + * Zero on success, positive error code otherwise. + */ +static int +mlx5_alloc_shared_dv(struct mlx5_priv *priv) +{ + struct mlx5_ibv_shared *sh = priv->sh; + int err = 0; + void *ns; + + ns = mlx5dv_dr_create_ns(sh->ctx, MLX5DV_DR_NS_DOMAIN_INGRESS_BYPASS); + if (!ns) { + DRV_LOG(ERR, "ingress mlx5dv_dr_create_ns failed"); + err = errno; + goto error; + } + priv->rx_ns = ns; + ns = mlx5dv_dr_create_ns(sh->ctx, MLX5DV_DR_NS_DOMAIN_EGRESS_BYPASS); + if (!ns) { + DRV_LOG(ERR, "egress mlx5dv_dr_create_ns failed"); + err = errno; + goto error; + } + priv->tx_ns = ns; + return 0; + +error: + /* Rollback the created objects. */ + if (priv->rx_ns) { + mlx5dv_dr_destroy_ns(priv->rx_ns); + priv->rx_ns = NULL; + } + if (priv->tx_ns) { + mlx5dv_dr_destroy_ns(priv->tx_ns); + priv->tx_ns = NULL; + } + return err; +} + +/** + * Destroy DV/DR related structures within private structure. + * + * @param[in] priv + * Pointer to the private device data structure. + */ +static void +mlx5_free_shared_dv(struct mlx5_priv *priv) +{ + if (priv->rx_ns) { + mlx5dv_dr_destroy_ns(priv->rx_ns); + priv->rx_ns = NULL; + } + if (priv->tx_ns) { + mlx5dv_dr_destroy_ns(priv->tx_ns); + priv->tx_ns = NULL; + } +} +#endif + /** * Prepare shared data between primary and secondary process. */ @@ -446,6 +513,9 @@ struct mlx5_dev_spawn_data { mlx5_mprq_free_mp(dev); mlx5_mr_release(dev); assert(priv->sh); +#ifdef HAVE_MLX5DV_DR + mlx5_free_shared_dv(priv); +#endif if (priv->sh) mlx5_free_shared_ibctx(priv->sh); priv->sh = NULL; @@ -1363,20 +1433,11 @@ struct mlx5_dev_spawn_data { } } #ifdef HAVE_MLX5DV_DR - priv->rx_ns = mlx5dv_dr_create_ns - (sh->ctx, MLX5DV_DR_NS_DOMAIN_INGRESS_BYPASS); - if (priv->rx_ns == NULL) { - DRV_LOG(ERR, "mlx5dv_dr_create_ns failed"); - err = errno; - goto error; - } - priv->tx_ns = mlx5dv_dr_create_ns(sh->ctx, - MLX5DV_DR_NS_DOMAIN_EGRESS_BYPASS); - if (priv->tx_ns == NULL) { - DRV_LOG(ERR, "mlx5dv_dr_create_ns failed"); - err = errno; + if (config.dv_flow_en) { + err = mlx5_alloc_shared_dv(priv); + if (err) goto error; - } + } #endif TAILQ_INIT(&priv->flows); TAILQ_INIT(&priv->ctrl_flows); @@ -1429,6 +1490,9 @@ struct mlx5_dev_spawn_data { return eth_dev; error: if (priv) { +#ifdef HAVE_MLX5DV_DR + mlx5_free_shared_dv(priv); +#endif if (priv->nl_socket_route >= 0) close(priv->nl_socket_route); if (priv->nl_socket_rdma >= 0) From patchwork Tue Apr 2 06:22:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Slava Ovsiienko X-Patchwork-Id: 52054 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 C3AD34CA6; Tue, 2 Apr 2019 08:22:54 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id E980634F3 for ; Tue, 2 Apr 2019 08:22:44 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Apr 2019 09:22:41 +0300 Received: from pegasus12.mtr.labs.mlnx. (pegasus12.mtr.labs.mlnx [10.210.17.40]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x326MfmV024769; Tue, 2 Apr 2019 09:22:41 +0300 From: Viacheslav Ovsiienko To: dev@dpdk.org Cc: shahafs@mellanox.com Date: Tue, 2 Apr 2019 06:22:35 +0000 Message-Id: <1554186157-29455-3-git-send-email-viacheslavo@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> References: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> Subject: [dpdk-dev] [PATCH 2/4] net/mlx5: add reference counter for DV/DR structures 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 patch introduces the reference counter for DV/DR flow engine structure, which we are going to share between master and representors in E-Switch configurations over multiport Infiniband device. Signed-off-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.c | 26 ++++++++++++++++++++++++-- drivers/net/mlx5/mlx5.h | 4 ++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 9de122d..79e0c17 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -299,7 +299,8 @@ struct mlx5_dev_spawn_data { #ifdef HAVE_MLX5DV_DR /** * Initialize DV/DR related data within private structure. - * This is preparation step for the data sharing. + * Routine checks the reference counter and does actual + * resources creation/iniialization only if counter is zero. * * @param[in] priv * Pointer to the private device data structure. @@ -314,6 +315,14 @@ struct mlx5_dev_spawn_data { int err = 0; void *ns; + assert(sh); + if (sh->dv_refcnt) { + /* Shared DV/DR structures is already initialized. */ + sh->dv_refcnt++; + priv->dv_shared = 1; + return 0; + } + /* Reference counter is zero, we should initialize structures. */ ns = mlx5dv_dr_create_ns(sh->ctx, MLX5DV_DR_NS_DOMAIN_INGRESS_BYPASS); if (!ns) { DRV_LOG(ERR, "ingress mlx5dv_dr_create_ns failed"); @@ -328,6 +337,8 @@ struct mlx5_dev_spawn_data { goto error; } priv->tx_ns = ns; + sh->dv_refcnt++; + priv->dv_shared = 1; return 0; error: @@ -352,6 +363,16 @@ struct mlx5_dev_spawn_data { static void mlx5_free_shared_dv(struct mlx5_priv *priv) { + struct mlx5_ibv_shared *sh; + + if (!priv->dv_shared) + return; + priv->dv_shared = 0; + sh = priv->sh; + assert(sh); + assert(sh->dv_refcnt); + if (sh->dv_refcnt && --sh->dv_refcnt) + return; if (priv->rx_ns) { mlx5dv_dr_destroy_ns(priv->rx_ns); priv->rx_ns = NULL; @@ -1491,7 +1512,8 @@ struct mlx5_dev_spawn_data { error: if (priv) { #ifdef HAVE_MLX5DV_DR - mlx5_free_shared_dv(priv); + if (priv->sh) + mlx5_free_shared_dv(priv); #endif if (priv->nl_socket_route >= 0) close(priv->nl_socket_route); diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index a3d5f8e..56a2c61 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -213,6 +213,9 @@ struct mlx5_ibv_shared { char ibdev_name[IBV_SYSFS_NAME_MAX]; /* IB device name. */ char ibdev_path[IBV_SYSFS_PATH_MAX]; /* IB device path for secondary */ struct ibv_device_attr_ex device_attr; /* Device properties. */ + /* Shared DV/DR flow data section. */ + uint32_t dv_refcnt; /* DV/DR data reference counter. */ + /* Shared interrupt handler section. */ pthread_mutex_t intr_mutex; /* Interrupt config mutex. */ uint32_t intr_cnt; /* Interrupt handler reference counter. */ struct rte_intr_handle intr_handle; /* Interrupt handler for device. */ @@ -244,6 +247,7 @@ struct mlx5_priv { unsigned int isolated:1; /* Whether isolated mode is enabled. */ unsigned int representor:1; /* Device is a port representor. */ unsigned int master:1; /* Device is a E-Switch master. */ + unsigned int dv_shared:1; /* DV/DR data is shared. */ uint16_t domain_id; /* Switch domain identifier. */ uint16_t vport_id; /* Associated VF vport index (if any). */ int32_t representor_id; /* Port representor identifier. */ From patchwork Tue Apr 2 06:22:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Slava Ovsiienko X-Patchwork-Id: 52050 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 462032E81; Tue, 2 Apr 2019 08:22:47 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id E6412316B for ; Tue, 2 Apr 2019 08:22:44 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Apr 2019 09:22:41 +0300 Received: from pegasus12.mtr.labs.mlnx. (pegasus12.mtr.labs.mlnx [10.210.17.40]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x326MfmW024769; Tue, 2 Apr 2019 09:22:41 +0300 From: Viacheslav Ovsiienko To: dev@dpdk.org Cc: shahafs@mellanox.com Date: Tue, 2 Apr 2019 06:22:36 +0000 Message-Id: <1554186157-29455-4-git-send-email-viacheslavo@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> References: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> Subject: [dpdk-dev] [PATCH 3/4] net/mlx5: share DV/DR flow related structures 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" DV/DR related structures are moved to the shared context: - rx/tx namespaces, shared by master and representors - rx/tx flow tables - matchers - encap/decap action resources - flow tags (MARK actions) - modify action resources - jump tables Signed-off-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.c | 28 +++++++++++----------- drivers/net/mlx5/mlx5.h | 40 +++++++++++++++---------------- drivers/net/mlx5/mlx5_flow_dv.c | 52 +++++++++++++++++++++++------------------ 3 files changed, 63 insertions(+), 57 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 79e0c17..369b698 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -329,27 +329,27 @@ struct mlx5_dev_spawn_data { err = errno; goto error; } - priv->rx_ns = ns; + sh->rx_ns = ns; ns = mlx5dv_dr_create_ns(sh->ctx, MLX5DV_DR_NS_DOMAIN_EGRESS_BYPASS); if (!ns) { DRV_LOG(ERR, "egress mlx5dv_dr_create_ns failed"); err = errno; goto error; } - priv->tx_ns = ns; + sh->tx_ns = ns; sh->dv_refcnt++; priv->dv_shared = 1; return 0; error: /* Rollback the created objects. */ - if (priv->rx_ns) { - mlx5dv_dr_destroy_ns(priv->rx_ns); - priv->rx_ns = NULL; + if (sh->rx_ns) { + mlx5dv_dr_destroy_ns(sh->rx_ns); + sh->rx_ns = NULL; } - if (priv->tx_ns) { - mlx5dv_dr_destroy_ns(priv->tx_ns); - priv->tx_ns = NULL; + if (sh->tx_ns) { + mlx5dv_dr_destroy_ns(sh->tx_ns); + sh->tx_ns = NULL; } return err; } @@ -373,13 +373,13 @@ struct mlx5_dev_spawn_data { assert(sh->dv_refcnt); if (sh->dv_refcnt && --sh->dv_refcnt) return; - if (priv->rx_ns) { - mlx5dv_dr_destroy_ns(priv->rx_ns); - priv->rx_ns = NULL; + if (sh->rx_ns) { + mlx5dv_dr_destroy_ns(sh->rx_ns); + sh->rx_ns = NULL; } - if (priv->tx_ns) { - mlx5dv_dr_destroy_ns(priv->tx_ns); - priv->tx_ns = NULL; + if (sh->tx_ns) { + mlx5dv_dr_destroy_ns(sh->tx_ns); + sh->tx_ns = NULL; } } #endif diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 56a2c61..e67227f 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -199,6 +199,15 @@ struct mlx5_ibv_shared_port { */ }; +/* Table structure. */ +struct mlx5_flow_tbl_resource { + void *obj; /**< Pointer to DR table object. */ + rte_atomic32_t refcnt; /**< Reference counter. */ +}; + +#define MLX5_MAX_TABLES 1024 +#define MLX5_GROUP_FACTOR 1 + /* * Shared Infiniband device context for Master/Representors * which belong to same IB device with multiple IB ports. @@ -215,6 +224,17 @@ struct mlx5_ibv_shared { struct ibv_device_attr_ex device_attr; /* Device properties. */ /* Shared DV/DR flow data section. */ uint32_t dv_refcnt; /* DV/DR data reference counter. */ + void *rx_ns; /* RX Direct Rules name space handle. */ + struct mlx5_flow_tbl_resource rx_tbl[MLX5_MAX_TABLES]; + /* RX Direct Rules tables. */ + void *tx_ns; /* TX Direct Rules name space handle. */ + struct mlx5_flow_tbl_resource tx_tbl[MLX5_MAX_TABLES]; + /* TX Direct Rules tables/ */ + 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; + LIST_HEAD(jump, mlx5_flow_dv_jump_tbl_resource) jump_tbl; /* Shared interrupt handler section. */ pthread_mutex_t intr_mutex; /* Interrupt config mutex. */ uint32_t intr_cnt; /* Interrupt handler reference counter. */ @@ -222,15 +242,6 @@ struct mlx5_ibv_shared { struct mlx5_ibv_shared_port port[]; /* per device port data array. */ }; -/* Table structure. */ -struct mlx5_flow_tbl_resource { - void *obj; /**< Pointer to DR table object. */ - rte_atomic32_t refcnt; /**< Reference counter. */ -}; - -#define MLX5_MAX_TABLES 1024 -#define MLX5_GROUP_FACTOR 1 - struct mlx5_priv { LIST_ENTRY(mlx5_priv) mem_event_cb; /**< Called by memory event callback. */ @@ -279,11 +290,6 @@ struct mlx5_priv { LIST_HEAD(txqibv, mlx5_txq_ibv) txqsibv; /* Verbs Tx queues. */ /* Verbs Indirection tables. */ LIST_HEAD(ind_tables, mlx5_ind_table_ibv) ind_tbls; - 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; - LIST_HEAD(jump, mlx5_flow_dv_jump_tbl_resource) jump_tbl; /* Pointer to next element. */ rte_atomic32_t refcnt; /**< Reference counter. */ struct ibv_flow_action *verbs_action; @@ -308,12 +314,6 @@ struct mlx5_priv { /* UAR same-page access control required in 32bit implementations. */ #endif struct mlx5_flow_tcf_context *tcf_context; /* TC flower context. */ - void *rx_ns; /* RX Direct Rules name space handle. */ - struct mlx5_flow_tbl_resource rx_tbl[MLX5_MAX_TABLES]; - /* RX Direct Rules tables. */ - void *tx_ns; /* TX Direct Rules name space handle. */ - struct mlx5_flow_tbl_resource tx_tbl[MLX5_MAX_TABLES]; - /* TX Direct Rules tables/ */ }; #define PORT_ID(priv) ((priv)->dev_data->port_id) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index f1dd00a..4912fc8 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -804,18 +804,19 @@ struct field_modify_info modify_tcp[] = { struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_dv_encap_decap_resource *cache_resource; struct rte_flow *flow = dev_flow->flow; struct mlx5dv_dr_ns *ns; resource->flags = flow->group ? 0 : 1; if (flow->ingress) - ns = priv->rx_ns; + ns = sh->rx_ns; else - ns = priv->tx_ns; + ns = sh->tx_ns; /* Lookup a matching resource from cache. */ - LIST_FOREACH(cache_resource, &priv->encaps_decaps, next) { + LIST_FOREACH(cache_resource, &sh->encaps_decaps, next) { if (resource->reformat_type == cache_resource->reformat_type && resource->ft_type == cache_resource->ft_type && resource->flags == cache_resource->flags && @@ -840,7 +841,7 @@ struct field_modify_info modify_tcp[] = { *cache_resource = *resource; cache_resource->verbs_action = mlx5_glue->dv_create_flow_action_packet_reformat - (priv->sh->ctx, cache_resource->reformat_type, + (sh->ctx, cache_resource->reformat_type, cache_resource->ft_type, ns, cache_resource->flags, cache_resource->size, (cache_resource->size ? cache_resource->buf : NULL)); @@ -852,7 +853,7 @@ struct field_modify_info modify_tcp[] = { } rte_atomic32_init(&cache_resource->refcnt); rte_atomic32_inc(&cache_resource->refcnt); - LIST_INSERT_HEAD(&priv->encaps_decaps, cache_resource, next); + LIST_INSERT_HEAD(&sh->encaps_decaps, cache_resource, next); dev_flow->dv.encap_decap = cache_resource; DRV_LOG(DEBUG, "new encap/decap resource %p: refcnt %d++", (void *)cache_resource, @@ -883,10 +884,11 @@ struct field_modify_info modify_tcp[] = { struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_dv_jump_tbl_resource *cache_resource; /* Lookup a matching resource from cache. */ - LIST_FOREACH(cache_resource, &priv->jump_tbl, next) { + LIST_FOREACH(cache_resource, &sh->jump_tbl, next) { if (resource->tbl == cache_resource->tbl) { DRV_LOG(DEBUG, "jump table resource resource %p: refcnt %d++", (void *)cache_resource, @@ -914,7 +916,7 @@ struct field_modify_info modify_tcp[] = { } rte_atomic32_init(&cache_resource->refcnt); rte_atomic32_inc(&cache_resource->refcnt); - LIST_INSERT_HEAD(&priv->jump_tbl, cache_resource, next); + LIST_INSERT_HEAD(&sh->jump_tbl, cache_resource, next); dev_flow->dv.jump = cache_resource; DRV_LOG(DEBUG, "new jump table resource %p: refcnt %d++", (void *)cache_resource, @@ -1538,14 +1540,15 @@ struct field_modify_info modify_tcp[] = { struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_dv_modify_hdr_resource *cache_resource; struct mlx5dv_dr_ns *ns = resource->ft_type == MLX5DV_FLOW_TABLE_TYPE_NIC_TX ? - priv->tx_ns : priv->rx_ns; + sh->tx_ns : sh->rx_ns; /* Lookup a matching resource from cache. */ - LIST_FOREACH(cache_resource, &priv->modify_cmds, next) { + LIST_FOREACH(cache_resource, &sh->modify_cmds, next) { if (resource->ft_type == cache_resource->ft_type && resource->actions_num == cache_resource->actions_num && !memcmp((const void *)resource->actions, @@ -1569,7 +1572,7 @@ struct field_modify_info modify_tcp[] = { *cache_resource = *resource; cache_resource->verbs_action = mlx5_glue->dv_create_flow_action_modify_header - (priv->sh->ctx, cache_resource->ft_type, + (sh->ctx, cache_resource->ft_type, ns, 0, cache_resource->actions_num * sizeof(cache_resource->actions[0]), @@ -1582,7 +1585,7 @@ struct field_modify_info modify_tcp[] = { } rte_atomic32_init(&cache_resource->refcnt); rte_atomic32_inc(&cache_resource->refcnt); - LIST_INSERT_HEAD(&priv->modify_cmds, cache_resource, next); + LIST_INSERT_HEAD(&sh->modify_cmds, cache_resource, next); dev_flow->dv.modify_hdr = cache_resource; DRV_LOG(DEBUG, "new modify-header resource %p: refcnt %d++", (void *)cache_resource, @@ -2879,18 +2882,19 @@ struct field_modify_info modify_tcp[] = { struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_tbl_resource *tbl; if (egress) { - tbl = &priv->tx_tbl[table_id]; + tbl = &sh->tx_tbl[table_id]; if (!tbl->obj) tbl->obj = mlx5_glue->dr_create_flow_tbl - (priv->tx_ns, table_id); + (sh->tx_ns, table_id); } else { - tbl = &priv->rx_tbl[table_id]; + tbl = &sh->rx_tbl[table_id]; if (!tbl->obj) tbl->obj = mlx5_glue->dr_create_flow_tbl - (priv->rx_ns, table_id); + (sh->rx_ns, table_id); } if (!tbl->obj) { rte_flow_error_set(error, ENOMEM, @@ -2946,6 +2950,7 @@ struct field_modify_info modify_tcp[] = { struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_dv_matcher *cache_matcher; struct mlx5dv_flow_matcher_attr dv_attr = { .type = IBV_FLOW_ATTR_NORMAL, @@ -2957,7 +2962,7 @@ struct field_modify_info modify_tcp[] = { #endif /* Lookup from cache. */ - LIST_FOREACH(cache_matcher, &priv->matchers, next) { + LIST_FOREACH(cache_matcher, &sh->matchers, next) { if (matcher->crc == cache_matcher->crc && matcher->priority == cache_matcher->priority && matcher->egress == cache_matcher->egress && @@ -3001,8 +3006,7 @@ struct field_modify_info modify_tcp[] = { if (matcher->egress) dv_attr.flags |= IBV_FLOW_ATTR_FLAGS_EGRESS; cache_matcher->matcher_object = - mlx5_glue->dv_create_flow_matcher(priv->sh->ctx, &dv_attr, - tbl->obj); + mlx5_glue->dv_create_flow_matcher(sh->ctx, &dv_attr, tbl->obj); if (!cache_matcher->matcher_object) { rte_free(cache_matcher); #ifdef HAVE_MLX5DV_DR @@ -3013,7 +3017,7 @@ struct field_modify_info modify_tcp[] = { NULL, "cannot create matcher"); } rte_atomic32_inc(&cache_matcher->refcnt); - LIST_INSERT_HEAD(&priv->matchers, cache_matcher, next); + LIST_INSERT_HEAD(&sh->matchers, cache_matcher, next); dev_flow->dv.matcher = cache_matcher; DRV_LOG(DEBUG, "priority %hd new %s matcher %p: refcnt %d", cache_matcher->priority, @@ -3069,10 +3073,11 @@ struct field_modify_info modify_tcp[] = { struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_dv_tag_resource *cache_resource; /* Lookup a matching resource from cache. */ - LIST_FOREACH(cache_resource, &priv->tags, next) { + LIST_FOREACH(cache_resource, &sh->tags, next) { if (resource->tag == cache_resource->tag) { DRV_LOG(DEBUG, "tag resource %p: refcnt %d++", (void *)cache_resource, @@ -3099,7 +3104,7 @@ struct field_modify_info modify_tcp[] = { } rte_atomic32_init(&cache_resource->refcnt); rte_atomic32_inc(&cache_resource->refcnt); - LIST_INSERT_HEAD(&priv->tags, cache_resource, next); + LIST_INSERT_HEAD(&sh->tags, cache_resource, next); dev_flow->flow->tag_resource = cache_resource; DRV_LOG(DEBUG, "new tag resource %p: refcnt %d++", (void *)cache_resource, @@ -3676,6 +3681,7 @@ struct field_modify_info modify_tcp[] = { { struct mlx5_flow_dv_matcher *matcher = flow->dv.matcher; struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; struct mlx5_flow_tbl_resource *tbl; assert(matcher->matcher_object); @@ -3687,9 +3693,9 @@ struct field_modify_info modify_tcp[] = { (matcher->matcher_object)); LIST_REMOVE(matcher, next); if (matcher->egress) - tbl = &priv->tx_tbl[matcher->group]; + tbl = &sh->tx_tbl[matcher->group]; else - tbl = &priv->rx_tbl[matcher->group]; + tbl = &sh->rx_tbl[matcher->group]; flow_dv_tbl_resource_release(tbl); rte_free(matcher); DRV_LOG(DEBUG, "port %u matcher %p: removed", From patchwork Tue Apr 2 06:22:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Slava Ovsiienko X-Patchwork-Id: 52052 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 865114C91; Tue, 2 Apr 2019 08:22:51 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id E7EF3343C for ; Tue, 2 Apr 2019 08:22:44 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from viacheslavo@mellanox.com) with ESMTPS (AES256-SHA encrypted); 2 Apr 2019 09:22:41 +0300 Received: from pegasus12.mtr.labs.mlnx. (pegasus12.mtr.labs.mlnx [10.210.17.40]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x326MfmX024769; Tue, 2 Apr 2019 09:22:41 +0300 From: Viacheslav Ovsiienko To: dev@dpdk.org Cc: shahafs@mellanox.com Date: Tue, 2 Apr 2019 06:22:37 +0000 Message-Id: <1554186157-29455-5-git-send-email-viacheslavo@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> References: <1554186157-29455-1-git-send-email-viacheslavo@mellanox.com> Subject: [dpdk-dev] [PATCH 4/4] net/mlx5: add mutex for shared DV/DR structures 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 patch introduces the mutex for shared DV/DR structures. Application may have multiple threads (but single dedicated thread per port). Due to sharing the IB context in the multiport IB device configurations we should synchronize access to the shared DV/DR flow structures. Signed-off-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.c | 6 +++ drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_flow_dv.c | 103 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 369b698..96ad4c6 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -312,6 +312,7 @@ struct mlx5_dev_spawn_data { mlx5_alloc_shared_dv(struct mlx5_priv *priv) { struct mlx5_ibv_shared *sh = priv->sh; + pthread_mutexattr_t mattr; int err = 0; void *ns; @@ -336,6 +337,10 @@ struct mlx5_dev_spawn_data { err = errno; goto error; } + pthread_mutexattr_init(&mattr); + pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&sh->dv_mutex, &mattr); + pthread_mutexattr_destroy(&mattr); sh->tx_ns = ns; sh->dv_refcnt++; priv->dv_shared = 1; @@ -381,6 +386,7 @@ struct mlx5_dev_spawn_data { mlx5dv_dr_destroy_ns(sh->tx_ns); sh->tx_ns = NULL; } + pthread_mutex_destroy(&sh->dv_mutex); } #endif diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index e67227f..4f6c1b7 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -223,6 +223,7 @@ struct mlx5_ibv_shared { char ibdev_path[IBV_SYSFS_PATH_MAX]; /* IB device path for secondary */ struct ibv_device_attr_ex device_attr; /* Device properties. */ /* Shared DV/DR flow data section. */ + pthread_mutex_t dv_mutex; /* DV context mutex. */ uint32_t dv_refcnt; /* DV/DR data reference counter. */ void *rx_ns; /* RX Direct Rules name space handle. */ struct mlx5_flow_tbl_resource rx_tbl[MLX5_MAX_TABLES]; diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 4912fc8..737011a 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -125,6 +125,45 @@ struct field_modify_info modify_tcp[] = { }; /** + * Acquire the synchronizing object to protect multithreaded access + * to shared dv context. Lock occurs only if context is actually + * shared, i.e. we have multiport IB device and representors are + * created. + * + * @param[in] dev + * Pointer to the rte_eth_dev structure. + */ +static void +flow_d_shared_lock(struct rte_eth_dev *dev) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; + + if (sh->dv_refcnt > 1) { + int ret; + + ret = pthread_mutex_lock(&sh->dv_mutex); + assert(!ret); + (void)ret; + } +} + +static void +flow_d_shared_unlock(struct rte_eth_dev *dev) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_ibv_shared *sh = priv->sh; + + if (sh->dv_refcnt > 1) { + int ret; + + ret = pthread_mutex_unlock(&sh->dv_mutex); + assert(!ret); + (void)ret; + } +} + +/** * Convert modify-header action to DV specification. * * @param[in] item @@ -3958,14 +3997,70 @@ struct field_modify_info modify_tcp[] = { return ret; } +/* + * Mutex-protected thunk to flow_dv_translate(). + */ +static int +flow_d_translate(struct rte_eth_dev *dev, + struct mlx5_flow *dev_flow, + const struct rte_flow_attr *attr, + const struct rte_flow_item items[], + const struct rte_flow_action actions[], + struct rte_flow_error *error) +{ + int ret; + + flow_d_shared_lock(dev); + ret = flow_dv_translate(dev, dev_flow, attr, items, actions, error); + flow_d_shared_unlock(dev); + return ret; +} + +/* + * Mutex-protected thunk to flow_dv_apply(). + */ +static int +flow_d_apply(struct rte_eth_dev *dev, + struct rte_flow *flow, + struct rte_flow_error *error) +{ + int ret; + + flow_d_shared_lock(dev); + ret = flow_dv_apply(dev, flow, error); + flow_d_shared_unlock(dev); + return ret; +} + +/* + * Mutex-protected thunk to flow_dv_remove(). + */ +static void +flow_d_remove(struct rte_eth_dev *dev, struct rte_flow *flow) +{ + flow_d_shared_lock(dev); + flow_dv_remove(dev, flow); + flow_d_shared_unlock(dev); +} + +/* + * Mutex-protected thunk to flow_dv_destroy(). + */ +static void +flow_d_destroy(struct rte_eth_dev *dev, struct rte_flow *flow) +{ + flow_d_shared_lock(dev); + flow_dv_destroy(dev, flow); + flow_d_shared_unlock(dev); +} const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops = { .validate = flow_dv_validate, .prepare = flow_dv_prepare, - .translate = flow_dv_translate, - .apply = flow_dv_apply, - .remove = flow_dv_remove, - .destroy = flow_dv_destroy, + .translate = flow_d_translate, + .apply = flow_d_apply, + .remove = flow_d_remove, + .destroy = flow_d_destroy, .query = flow_dv_query, };