From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0056.outbound.protection.outlook.com [104.47.2.56]) by dpdk.org (Postfix) with ESMTP id F2E3F10A3 for ; Thu, 1 Nov 2018 10:15:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qp9+lEHWMVXoUkB9uf353ktu0GJ9vloGRZ6Bbt0wClw=; b=DvULMd1oJ4wu6+1babQ8n28X+GX9/dTZ9eYhDoTo13gTrBvdDjTZV66D90QZI+aguTmOnRYz266IF3KY984Z2NeUuLr1Va1Q0d4QBOM5B/ZrfWHB5P6nf18TYaO4lF89rKlDQtK0rE6I3faHmjoPP7mXnRhk2hRBefL+ir170fQ= Received: from VI1PR05MB4224.eurprd05.prod.outlook.com (52.133.12.13) by VI1PR05MB4573.eurprd05.prod.outlook.com (20.176.3.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1273.26; Thu, 1 Nov 2018 09:15:42 +0000 Received: from VI1PR05MB4224.eurprd05.prod.outlook.com ([fe80::345d:803:9e2:679c]) by VI1PR05MB4224.eurprd05.prod.outlook.com ([fe80::345d:803:9e2:679c%4]) with mapi id 15.20.1294.024; Thu, 1 Nov 2018 09:15:42 +0000 From: Dekel Peled To: Shahaf Shuler , Yongseok Koh CC: "dev@dpdk.org" , Ori Kam Thread-Topic: [dpdk-dev] [PATCH v7 7/7] net/mlx5: add caching of encap decap actions Thread-Index: AQHUcO/ybOPD2+vhM0CqMOL4+nESsKU5dbSAgAEu49A= Date: Thu, 1 Nov 2018 09:15:42 +0000 Message-ID: References: <1540498108-18358-1-git-send-email-dekelp@mellanox.com> <1540969847-48919-8-git-send-email-dekelp@mellanox.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=dekelp@mellanox.com; x-originating-ip: [193.47.165.251] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR05MB4573; 6:H9vL2NMAFXi/RLKJXZZh3Q2IuNjefl5JytPUL2iN4AFJ3tlJ9BO7+KaVJUyKtT2tVb0HNdPwuVKqSrzNLRsSd7uqtk2P2lUfbM1TvXEQhXxKjXSOncrM11left0a88K++4joF150k6AB88uvYTsn+XLrBiGmS7U0P9Uirj8hY4n6ec19vZpRo0UDKpv4ndb+EiaXtJAeKr4yxabSUX5lNnKFAMtskFNL/svI8/K9Gu/qrK/laHdHagQ/FkqK1+6gsFeRPL7WvVcafz6v1UATv0/vFfvck4v5ij8sBs9gmEPCX0nKDoyQoG7E+Fel92EEfLa2fIdx5Wpldd7INq+COPa+UkQ7Ig2d9bpgtcAk9eRU7Y7Ncqahbh7cG/20820VsEvPI/VaqAIoqYX0rHqNH44qFFydcu+13Nl+Eq7bzVVtv9DWV5vnC7dY9iWhsxMaWXFCFJgXo9QTH/2he+SK7A==; 5:5ZuzGVIeZgxwfgVuiKDZAe64GkmWz6lfhtFMFDxnaQJAJHUpuHKi7VQ8SiRJigbdyUZUOJteHycL0eq2EIwDi3Lj5Bxhv44oo4sTIoR5L9XJA4CwzCJCyCA1FaUNd+z1WKZx4hfEKe0bWz+2I5L0c1xQjTVH86rwW71yKuT2jQA=; 7:xW+bSoPcp1eZLj95mNjOM8nY5tl8pNRp/jhigjCIN8hnEf6V50R+XmpSJRfimNCMuluSlhS4XczeEQEXILU23nrTL4J6rGm0TcPtbZ3BUac6zMOubcdD76YHvVceLuDWcaToMWuktfa7IoMN7AMFXw== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 19e2b8c4-9f88-48bc-8e74-08d63fda991c x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR05MB4573; x-ms-traffictypediagnostic: VI1PR05MB4573: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231382)(944501410)(52105095)(3002001)(10201501046)(93006095)(93001095)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(201708071742011)(7699051)(76991095); SRVR:VI1PR05MB4573; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB4573; x-forefront-prvs: 0843C17679 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(396003)(39860400002)(136003)(366004)(376002)(346002)(189003)(199004)(13464003)(2900100001)(8936002)(33656002)(106356001)(2906002)(81156014)(81166006)(6116002)(3846002)(5660300001)(7736002)(256004)(55016002)(316002)(105586002)(6636002)(305945005)(74316002)(25786009)(5250100002)(110136005)(97736004)(54906003)(9686003)(14444005)(53936002)(66066001)(14454004)(53946003)(229853002)(446003)(476003)(11346002)(4326008)(486006)(68736007)(4744004)(99286004)(86362001)(6246003)(71200400001)(71190400001)(6506007)(186003)(107886003)(6436002)(26005)(478600001)(102836004)(53546011)(7696005)(76176011); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB4573; H:VI1PR05MB4224.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: PJeGUl964r0PNcIFIb9Dtaz9jt7yFVUCbMAzxkUMZHbNVUi4/Sf/6O6+texi2CuwDVOWfPxMlsHUuhJ/82zaOpSNM+jNKDQ1wFXbyjgkf1UJ0x0+KXCjwYzEchjjIQpucCv43nlL2I/rhk52p2AgdEWTalVkeBa1DFmoCbYKu9iJkyYwLWDzU91neQd7Lu7ZvXBa8gstcpUrXc84Cq4qSkthFJz8JnR1kpAxtWpSXYiS3O4jRGdDvpbPODqO2pFd9l4ugqNfSxX0ikCudWZIMFitlm4oex08Cm0UJ9jPWyR72opNX+DU3nITYIgrYtznrtX3SrU63qRzbEXFF1EOjw78jXGFcK1tRyaSBhuzurY= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 19e2b8c4-9f88-48bc-8e74-08d63fda991c X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Nov 2018 09:15:42.3119 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB4573 Subject: Re: [dpdk-dev] [PATCH v7 7/7] net/mlx5: add caching of encap decap actions 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: , X-List-Received-Date: Thu, 01 Nov 2018 09:15:44 -0000 Thanks, PSB. > -----Original Message----- > From: Shahaf Shuler > Sent: Wednesday, October 31, 2018 5:10 PM > To: Dekel Peled ; Yongseok Koh > > Cc: dev@dpdk.org; Ori Kam > Subject: RE: [dpdk-dev] [PATCH v7 7/7] net/mlx5: add caching of encap > decap actions >=20 > Wednesday, October 31, 2018 9:11 AM, Dekel Peled: > > Subject: [dpdk-dev] [PATCH v7 7/7] net/mlx5: add caching of encap > > decap actions > > > > Make flow encap and decap Verbs actions cacheable resources. > > Reuse 17.11 PR 876. >=20 > No one knows what is PR 876 in the mailing list, also this code is not in= 17.11 > community. > Need to make a proper commit log here explains how you do the caching and > why it is needed. Will change. >=20 > > > > Signed-off-by: Dekel Peled > > --- > > drivers/net/mlx5/mlx5.h | 1 + > > drivers/net/mlx5/mlx5_flow.h | 18 ++- > > drivers/net/mlx5/mlx5_flow_dv.c | 265 > ++++++++++++++++++++++++++--- > > ----------- > > 3 files changed, 193 insertions(+), 91 deletions(-) > > > > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index > > 74d87c0..0422803 100644 > > --- a/drivers/net/mlx5/mlx5.h > > +++ b/drivers/net/mlx5/mlx5.h > > @@ -219,6 +219,7 @@ struct priv { > > /* 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; > > uint32_t link_speed_capa; /* Link speed capabilities. */ > > struct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */ > > int primary_socket; /* Unix socket for primary process. */ diff > > --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h > > index > > 908123f..25cd9c5 100644 > > --- a/drivers/net/mlx5/mlx5_flow.h > > +++ b/drivers/net/mlx5/mlx5_flow.h > > @@ -170,6 +170,7 @@ struct mlx5_flow_dv_match_params { }; > > > > #define MLX5_DV_MAX_NUMBER_OF_ACTIONS 8 > > +#define MLX5_ENCAP_MAX_LEN 132 > > > > /* Matcher structure. */ > > struct mlx5_flow_dv_matcher { > > @@ -183,6 +184,19 @@ struct mlx5_flow_dv_matcher { > > struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */ }; > > > > +/* Encap/decap resource structure. */ struct > > +mlx5_flow_dv_encap_decap_resource { > > + LIST_ENTRY(mlx5_flow_dv_encap_decap_resource) next; > > + /* Pointer to next element. */ > > + rte_atomic32_t refcnt; /**< Reference counter. */ > > + struct ibv_flow_action *verbs_action; > > + /**< Verbs encap/decap action object. */ > > + uint8_t buf[MLX5_ENCAP_MAX_LEN]; > > + size_t size; > > + uint8_t reformat_type; > > + uint8_t ft_type; > > +}; > > + > > /* DV flows structure. */ > > struct mlx5_flow_dv { > > uint64_t hash_fields; /**< Fields that participate in the hash. */ > > @@ > > -191,12 +205,12 @@ struct mlx5_flow_dv { > > struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */ > > struct mlx5_flow_dv_match_params value; > > /**< Holds the value that the packet is compared to. */ > > + struct mlx5_flow_dv_encap_decap_resource *encap_decap; > > + /**< Pointer to encap/decap resource in cache. */ > > struct ibv_flow *flow; /**< Installed flow. */ #ifdef > > HAVE_IBV_FLOW_DV_SUPPORT > > struct mlx5dv_flow_action_attr > > actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; > > /**< Action list. */ > > - struct ibv_flow_action *encap_decap_verbs_action; > > - /**< Verbs encap/decap object. */ > > #endif > > int actions_n; /**< number of actions. */ }; diff --git > > a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c > > index d1c811f..818b30c 100644 > > --- a/drivers/net/mlx5/mlx5_flow_dv.c > > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > > @@ -34,8 +34,6 @@ > > > > #ifdef HAVE_IBV_FLOW_DV_SUPPORT > > > > -#define MLX5_ENCAP_MAX_LEN 132 > > - > > /** > > * Validate META item. > > * > > @@ -271,6 +269,77 @@ > > return 0; > > } > > > > + > > +/** > > + * Find existing encap/decap resource or create and register a new one= . > > + * > > + * @param dev[in, out] > > + * Pointer to rte_eth_dev structure. > > + * @param[in, out] resource > > + * Pointer to encap/decap resource. > > + * @parm[in, out] dev_flow > > + * Pointer to the dev_flow. > > + * @param[out] error > > + * pointer to error structure. > > + * > > + * @return > > + * 0 on success otherwise -errno and errno is set. > > + */ > > +static int > > +flow_dv_encap_decap_resource_register > > + (struct rte_eth_dev *dev, > > + struct mlx5_flow_dv_encap_decap_resource > > *resource, > > + struct mlx5_flow *dev_flow, > > + struct rte_flow_error *error) > > +{ > > + struct priv *priv =3D dev->data->dev_private; > > + struct mlx5_flow_dv_encap_decap_resource *cache_resource; > > + > > + /* Lookup a matching resource from cache. */ > > + LIST_FOREACH(cache_resource, &priv->encaps_decaps, next) { > > + if (resource->reformat_type =3D=3D cache_resource- > > >reformat_type && > > + resource->ft_type =3D=3D cache_resource->ft_type && > > + resource->size =3D=3D cache_resource->size && > > + !memcmp((const void *)resource->buf, > > + (const void *)cache_resource->buf, > > + resource->size)) { > > + DRV_LOG(DEBUG, "encap/decap resource %p: refcnt > > %d++", > > + (void *)cache_resource, > > + rte_atomic32_read(&cache_resource- > > >refcnt)); > > + rte_atomic32_inc(&cache_resource->refcnt); > > + dev_flow->dv.encap_decap =3D cache_resource; > > + return 0; > > + } > > + } > > + /* Register new encap/decap resource. */ > > + cache_resource =3D rte_calloc(__func__, 1, sizeof(*cache_resource), > > 0); > > + if (!cache_resource) > > + return rte_flow_error_set(error, ENOMEM, > > + > > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, > > + "cannot allocate resource > > memory"); > > + *cache_resource =3D *resource; > > + cache_resource->verbs_action =3D > > + mlx5_glue->dv_create_flow_action_packet_reformat > > + (priv->ctx, cache_resource->size, > > + (cache_resource->size ? cache_resource->buf : > > NULL), > > + cache_resource->reformat_type, > > + cache_resource->ft_type); > > + if (!cache_resource->verbs_action) { > > + rte_free(cache_resource); > > + return rte_flow_error_set(error, ENOMEM, > > + > > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > > + NULL, "cannot create action"); > > + } > > + rte_atomic32_init(&cache_resource->refcnt); > > + rte_atomic32_inc(&cache_resource->refcnt); > > + LIST_INSERT_HEAD(&priv->encaps_decaps, cache_resource, next); > > + dev_flow->dv.encap_decap =3D cache_resource; > > + DRV_LOG(DEBUG, "new encap/decap resource %p: refcnt %d++", > > + (void *)cache_resource, > > + rte_atomic32_read(&cache_resource->refcnt)); > > + return 0; > > +} > > + > > /** > > * Get the size of specific rte_flow_item_type > > * > > @@ -505,31 +574,33 @@ > > * Pointer to rte_eth_dev structure. > > * @param[in] action > > * Pointer to action structure. > > + * @param[in, out] dev_flow > > + * Pointer to the mlx5_flow. > > * @param[out] error > > * Pointer to the error structure. > > * > > * @return > > - * Pointer to action on success, NULL otherwise and rte_errno is set= . > > + * 0 on success, a negative errno value otherwise and rte_errno is s= et. > > */ > > -static struct ibv_flow_action * > > +static int > > flow_dv_create_action_l2_encap(struct rte_eth_dev *dev, > > const struct rte_flow_action *action, > > + struct mlx5_flow *dev_flow, > > struct rte_flow_error *error) { > > - struct ibv_flow_action *verbs_action =3D NULL; > > const struct rte_flow_item *encap_data; > > const struct rte_flow_action_raw_encap *raw_encap_data; > > - struct priv *priv =3D dev->data->dev_private; > > - uint8_t buf[MLX5_ENCAP_MAX_LEN]; > > - uint8_t *buf_ptr =3D buf; > > - size_t size =3D 0; > > - int convert_result =3D 0; > > + struct mlx5_flow_dv_encap_decap_resource res =3D { > > + .reformat_type =3D > > + > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TU > > NNEL, > > + .ft_type =3D MLX5DV_FLOW_TABLE_TYPE_NIC_TX, > > + }; > > > > if (action->type =3D=3D RTE_FLOW_ACTION_TYPE_RAW_ENCAP) { > > raw_encap_data =3D > > (const struct rte_flow_action_raw_encap *)action- > > >conf; > > - buf_ptr =3D raw_encap_data->data; > > - size =3D raw_encap_data->size; > > + res.size =3D raw_encap_data->size; > > + memcpy(res.buf, raw_encap_data->data, res.size); > > } else { > > if (action->type =3D=3D > > RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP) > > encap_data =3D > > @@ -539,19 +610,15 @@ > > encap_data =3D > > ((const struct rte_flow_action_nvgre_encap > > *) > > action->conf)->definition; > > - convert_result =3D flow_dv_convert_encap_data(encap_data, > > buf, > > - &size, error); > > - if (convert_result) > > - return NULL; > > + if (flow_dv_convert_encap_data(encap_data, res.buf, > > + &res.size, error)) > > + return -rte_errno; > > } > > - verbs_action =3D mlx5_glue- > > >dv_create_flow_action_packet_reformat > > - (priv->ctx, size, buf_ptr, > > - > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TUNNEL, > > - MLX5DV_FLOW_TABLE_TYPE_NIC_TX); > > - if (!verbs_action) > > - rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > - NULL, "cannot create L2 encap action"); > > - return verbs_action; > > + if (flow_dv_encap_decap_resource_register(dev, &res, dev_flow, > > error)) > > + return rte_flow_error_set(error, EINVAL, > > + RTE_FLOW_ERROR_TYPE_ACTION, > > + NULL, "can't create L2 encap > > action"); > > + return 0; > > } > > > > /** > > @@ -559,27 +626,31 @@ > > * > > * @param[in] dev > > * Pointer to rte_eth_dev structure. > > + * @param[in, out] dev_flow > > + * Pointer to the mlx5_flow. > > * @param[out] error > > * Pointer to the error structure. > > * > > * @return > > - * Pointer to action on success, NULL otherwise and rte_errno is set= . > > + * 0 on success, a negative errno value otherwise and rte_errno is s= et. > > */ > > -static struct ibv_flow_action * > > +static int > > flow_dv_create_action_l2_decap(struct rte_eth_dev *dev, > > + struct mlx5_flow *dev_flow, > > struct rte_flow_error *error) { > > - struct ibv_flow_action *verbs_action =3D NULL; > > - struct priv *priv =3D dev->data->dev_private; > > + struct mlx5_flow_dv_encap_decap_resource res =3D { > > + .size =3D 0, > > + .reformat_type =3D > > + > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_T > > O_L2, > > + .ft_type =3D MLX5DV_FLOW_TABLE_TYPE_NIC_RX, > > + }; > > > > - verbs_action =3D mlx5_glue- > > >dv_create_flow_action_packet_reformat > > - (priv->ctx, 0, NULL, > > - > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2, > > - MLX5DV_FLOW_TABLE_TYPE_NIC_RX); > > - if (!verbs_action) > > - rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > - NULL, "cannot create L2 decap action"); > > - return verbs_action; > > + if (flow_dv_encap_decap_resource_register(dev, &res, dev_flow, > > error)) > > + return rte_flow_error_set(error, EINVAL, > > + RTE_FLOW_ERROR_TYPE_ACTION, > > + NULL, "can't create L2 decap > > action"); > > + return 0; > > } > > > > /** > > @@ -589,41 +660,39 @@ > > * Pointer to rte_eth_dev structure. > > * @param[in] action > > * Pointer to action structure. > > + * @param[in, out] dev_flow > > + * Pointer to the mlx5_flow. > > * @param[in] attr > > * Pointer to the flow attributes. > > * @param[out] error > > * Pointer to the error structure. > > * > > * @return > > - * Pointer to action on success, NULL otherwise and rte_errno is set= . > > + * 0 on success, a negative errno value otherwise and rte_errno is s= et. > > */ > > -static struct ibv_flow_action * > > +static int > > flow_dv_create_action_raw_encap(struct rte_eth_dev *dev, > > const struct rte_flow_action *action, > > + struct mlx5_flow *dev_flow, > > const struct rte_flow_attr *attr, > > struct rte_flow_error *error) > > { > > - struct ibv_flow_action *verbs_action =3D NULL; > > const struct rte_flow_action_raw_encap *encap_data; > > - struct priv *priv =3D dev->data->dev_private; > > - enum mlx5dv_flow_action_packet_reformat_type reformat_type; > > - enum mlx5dv_flow_table_type ft_type; > > + struct mlx5_flow_dv_encap_decap_resource res; > > > > encap_data =3D (const struct rte_flow_action_raw_encap *)action- > > >conf; > > - reformat_type =3D attr->egress ? > > + res.size =3D encap_data->size; > > + memcpy(res.buf, encap_data->data, res.size); > > + res.reformat_type =3D attr->egress ? > > > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TU > > NNEL : > > > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_T > > O_L2; > > - ft_type =3D attr->egress ? > > - MLX5DV_FLOW_TABLE_TYPE_NIC_TX : > > - MLX5DV_FLOW_TABLE_TYPE_NIC_RX; > > - verbs_action =3D mlx5_glue- > > >dv_create_flow_action_packet_reformat > > - (priv->ctx, encap_data->size, > > - (encap_data->size ? encap_data->data : > > NULL), > > - reformat_type, ft_type); > > - if (!verbs_action) > > - rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > - NULL, "cannot create encap action"); > > - return verbs_action; > > + res.ft_type =3D attr->egress ? MLX5DV_FLOW_TABLE_TYPE_NIC_TX : > > + MLX5DV_FLOW_TABLE_TYPE_NIC_RX; > > + if (flow_dv_encap_decap_resource_register(dev, &res, dev_flow, > > error)) > > + return rte_flow_error_set(error, EINVAL, > > + RTE_FLOW_ERROR_TYPE_ACTION, > > + NULL, "can't create encap action"); > > + return 0; > > } > > > > /** > > @@ -1689,15 +1758,13 @@ > > break; > > case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP: > > case RTE_FLOW_ACTION_TYPE_NVGRE_ENCAP: > > + if (flow_dv_create_action_l2_encap(dev, action, > > + dev_flow, error)) > > + return -rte_errno; > > dev_flow->dv.actions[actions_n].type =3D > > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > > dev_flow->dv.actions[actions_n].action =3D > > - flow_dv_create_action_l2_encap(dev, > > action, > > - error); > > - if (!(dev_flow->dv.actions[actions_n].action)) > > - return -rte_errno; > > - dev_flow->dv.encap_decap_verbs_action =3D > > - dev_flow->dv.actions[actions_n].action; > > + dev_flow->dv.encap_decap->verbs_action; > > flow->actions |=3D action->type =3D=3D > > RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP ? > > MLX5_FLOW_ACTION_VXLAN_ENCAP : > > @@ -1706,14 +1773,12 @@ > > break; > > case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: > > case RTE_FLOW_ACTION_TYPE_NVGRE_DECAP: > > + if (flow_dv_create_action_l2_decap(dev, dev_flow, error)) > > + return -rte_errno; > > dev_flow->dv.actions[actions_n].type =3D > > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > > dev_flow->dv.actions[actions_n].action =3D > > - flow_dv_create_action_l2_decap(dev, > > error); > > - if (!(dev_flow->dv.actions[actions_n].action)) > > - return -rte_errno; > > - dev_flow->dv.encap_decap_verbs_action =3D > > - dev_flow->dv.actions[actions_n].action; > > + dev_flow->dv.encap_decap->verbs_action; > > flow->actions |=3D action->type =3D=3D > > RTE_FLOW_ACTION_TYPE_VXLAN_DECAP ? > > MLX5_FLOW_ACTION_VXLAN_DECAP : > > @@ -1723,27 +1788,23 @@ > > case RTE_FLOW_ACTION_TYPE_RAW_ENCAP: > > /* Handle encap action with preceding decap */ > > if (flow->actions & MLX5_FLOW_ACTION_RAW_DECAP) { > > + if (flow_dv_create_action_raw_encap(dev, action, > > + dev_flow, > > + attr, error)) > > + return -rte_errno; > > dev_flow->dv.actions[actions_n].type =3D > > > > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > > dev_flow->dv.actions[actions_n].action =3D > > - flow_dv_create_action_raw_encap > > - (dev, action, > > - attr, error); > > - if (!(dev_flow->dv.actions[actions_n].action)) > > - return -rte_errno; > > - dev_flow->dv.encap_decap_verbs_action =3D > > - dev_flow->dv.actions[actions_n].action; > > + dev_flow->dv.encap_decap- > > >verbs_action; > > } else { > > /* Handle encap action without preceding decap */ > > + if (flow_dv_create_action_l2_encap(dev, action, > > + dev_flow, error)) > > + return -rte_errno; > > dev_flow->dv.actions[actions_n].type =3D > > > > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > > dev_flow->dv.actions[actions_n].action =3D > > - flow_dv_create_action_l2_encap > > - (dev, action, error); > > - if (!(dev_flow->dv.actions[actions_n].action)) > > - return -rte_errno; > > - dev_flow->dv.encap_decap_verbs_action =3D > > - dev_flow->dv.actions[actions_n].action; > > + dev_flow->dv.encap_decap- > > >verbs_action; > > } > > flow->actions |=3D MLX5_FLOW_ACTION_RAW_ENCAP; > > actions_n++; > > @@ -1756,15 +1817,13 @@ > > } > > /* Handle decap action only if it isn't followed by encap */ > > if (action_ptr->type !=3D > > RTE_FLOW_ACTION_TYPE_RAW_ENCAP) { > > + if (flow_dv_create_action_l2_decap(dev, dev_flow, > > + error)) > > + return -rte_errno; > > dev_flow->dv.actions[actions_n].type =3D > > > > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > > dev_flow->dv.actions[actions_n].action =3D > > - > > flow_dv_create_action_l2_decap(dev, > > - error); > > - if (!(dev_flow->dv.actions[actions_n].action)) > > - return -rte_errno; > > - dev_flow->dv.encap_decap_verbs_action =3D > > - dev_flow->dv.actions[actions_n].action; > > + dev_flow->dv.encap_decap- > > >verbs_action; > > actions_n++; > > } > > /* If decap is followed by encap, handle it at encap case. */ > @@ > > -2074,6 +2133,37 @@ } > > > > /** > > + * Release an encap/decap resource. > > + * > > + * @param flow > > + * Pointer to mlx5_flow. > > + * > > + * @return > > + * 1 while a reference on it exists, 0 when freed. > > + */ > > +static int > > +flow_dv_encap_decap_resource_release(struct mlx5_flow *flow) { > > + struct mlx5_flow_dv_encap_decap_resource *cache_resource =3D > > + flow->dv.encap_decap; > > + > > + assert(cache_resource->verbs_action); > > + DRV_LOG(DEBUG, "encap/decap resource %p: refcnt %d--", > > + (void *)cache_resource, > > + rte_atomic32_read(&cache_resource->refcnt)); > > + if (rte_atomic32_dec_and_test(&cache_resource->refcnt)) { > > + claim_zero(mlx5_glue->destroy_flow_action > > + (cache_resource->verbs_action)); > > + LIST_REMOVE(cache_resource, next); > > + rte_free(cache_resource); > > + DRV_LOG(DEBUG, "encap/decap resource %p: removed", > > + cache_resource); > > + return 0; > > + } > > + return 1; > > +} > > + > > +/** > > * Remove the flow from the NIC but keeps it in memory. > > * > > * @param[in] dev > > @@ -2128,11 +2218,8 @@ > > LIST_REMOVE(dev_flow, next); > > if (dev_flow->dv.matcher) > > flow_dv_matcher_release(dev, dev_flow); > > - if (dev_flow->dv.encap_decap_verbs_action) { > > - claim_zero(mlx5_glue->destroy_flow_action > > - (dev_flow->dv.encap_decap_verbs_action)); > > - dev_flow->dv.encap_decap_verbs_action =3D NULL; > > - } > > + if (dev_flow->dv.encap_decap) > > + > > flow_dv_encap_decap_resource_release(dev_flow); > > rte_free(dev_flow); > > } > > } > > -- > > 1.8.3.1