From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0067.outbound.protection.outlook.com [104.47.2.67]) by dpdk.org (Postfix) with ESMTP id BCC543238 for ; Mon, 5 Nov 2018 06:39:21 +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=FrhYn3nu1sLKJD0KpqcYMHy55AdmnlWYWHAN4BnsFQc=; b=xAtl5ATbb+AJDO2K+9Vvlgmz/9vFok/fkndtcBOibmiD33Rrh5aTsMzferekOTannQkIZSEFfntHj+RWJR9taZhnzhUpHlb5JGF37YcTfWZ2gH0qj31rj/gMKLU5QlZ5ii5RDxz91p89ZabZ6FAn/JaiXlgB1sIlrIV8AtpYi/E= Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com (52.134.72.27) by DB3PR0502MB4041.eurprd05.prod.outlook.com (52.134.66.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.29; Mon, 5 Nov 2018 05:39:20 +0000 Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::58e7:97d8:f9c1:4323]) by DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::58e7:97d8:f9c1:4323%3]) with mapi id 15.20.1294.028; Mon, 5 Nov 2018 05:39:20 +0000 From: Yongseok Koh To: Ori Kam CC: Shahaf Shuler , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH 3/3] net/mlx5: remove flags setting from flow preparation Thread-Index: AQHUdMnm7I3dBwit10SadOBA8Ot0kA== Date: Mon, 5 Nov 2018 05:39:20 +0000 Message-ID: <20181105053912.GF15737@mtidpdk.mti.labs.mlnx> References: <20181102210801.28370-1-yskoh@mellanox.com> <20181102210801.28370-3-yskoh@mellanox.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: BYAPR01CA0028.prod.exchangelabs.com (2603:10b6:a02:80::41) To DB3PR0502MB3980.eurprd05.prod.outlook.com (2603:10a6:8:10::27) authentication-results: spf=none (sender IP is ) smtp.mailfrom=yskoh@mellanox.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [209.116.155.178] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DB3PR0502MB4041; 6:3cG0e6k09Ypk6RHH33fccssoTxqOxcsV3++bOrw99C54rFZ6s4i4sjoOQ28DmojQQpjGvd576FuOHELW4LVoQeaetx6o+ano21aFm4Md6yVoMtV0IGwebXxZ/yRzj80Q66xwnxCAmdAPE85uO77MqYQcGzgnDvaghF+Us+qowEZhyUB6vFTat7A0RvFRtWsgieYPy/t5n9LBFgHRRnQrWtOaNV4N3y1UPy3s9g4fU/sxyCtMFL7urU354ROLZe9x/Ukt0Mn0lWadCU2wfoXjb7n2meAO5aCSc4J/0vWcL+q4hSm2/qX1eKlGvuv2kVoZszAG7Uc6X6TJWtcc/xWTL2TPu42v4fQEVP7ch79ceAkPzB9f+Kn9kBgIj2ERzimNXwTmLTYd8TfyDY//NSvrnh5fB2393EeTpEODHgC6Zekh7UN1LYbyP33NEyMEjJUcqI3ZvOdWV7RelQ+SjWsvdA==; 5:L5jcXtrB5i4nQN+IyFFetcaxzR/2kWH853rfPwXgN3STw7IXGCBw+AMF3+wa9TUwjSO3gKDBIzCPRkuI6/12ksbrSlssXa4fPko08nUcrKfDIXdzQvQquy7x5QZ6hK9UYwxR5Ral8sFVWf709fSaHFHN+c1LmbcNjbDH23CqShE=; 7:xC7Lf7aYYu1NCbkvNP+pI7TgQziBv/eaS5lXJX6+G7W1HK/by9NSvybhFOvE/MdEOBkJFLk0pIkcWa0PF4JGTEs75nOA7njIKBgMOo62pDW1Ypqs61XsSvEK/CIH1+NpY11o/K8bXCOcaM3yRgmHcA== x-ms-office365-filtering-correlation-id: 539838d9-2638-4a44-08b5-08d642e1089d x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(5600074)(711020)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:DB3PR0502MB4041; x-ms-traffictypediagnostic: DB3PR0502MB4041: 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)(5005006)(8121501046)(93006095)(93001095)(3231382)(944501410)(52105095)(3002001)(10201501046)(6055026)(148016)(149066)(150057)(6041310)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123562045)(20161123558120)(201708071742011)(7699051)(76991095); SRVR:DB3PR0502MB4041; BCL:0; PCL:0; RULEID:; SRVR:DB3PR0502MB4041; x-forefront-prvs: 08476BC6EF x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(376002)(346002)(366004)(39860400002)(136003)(396003)(51234002)(13464003)(199004)(189003)(11346002)(486006)(4744004)(25786009)(2906002)(102836004)(229853002)(33896004)(6436002)(6486002)(478600001)(71190400001)(71200400001)(6636002)(476003)(26005)(6506007)(7736002)(53546011)(386003)(305945005)(6246003)(106356001)(6512007)(81166006)(316002)(8676002)(9686003)(33656002)(105586002)(81156014)(66066001)(68736007)(86362001)(8936002)(97736004)(186003)(76176011)(1076002)(6116002)(446003)(3846002)(5660300001)(52116002)(6862004)(4326008)(14454004)(2900100001)(256004)(53936002)(14444005)(99286004)(53946003)(54906003)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR0502MB4041; H:DB3PR0502MB3980.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: HrxfOChtesyd55TLmRpGqsFW6L3AjBBZ+NJktD7IeYvRs4oKZd0HRATS3SR75exFGkoYrJfV/dFp8Al/8rO2ijNDpK7VYkxOKdjQyhO6rA4xAEDuISB+8gOVUhf+W5rTb7QNbv0s7MI/3gcuNShsNWV6Nvy7om3OUIfwU0LWIwtz1FwtyDOZzk/+J2n9OQQ6LQv7YbhbkFa3o/4Zj0tgCwVu6MLd7EFZ9hPIeNUmAPqOxvvBzJmgFJdiXMSrEQfCz1sHrwFQCgFIzq8may7p4O2Wg0Jl/F0MGo9FBSoFFY/N71Mk5J3FvROlsSs+PMZyJnHo9+MjqEd3aBX0EJCUZLK97RcrsZElD/xsc+BlxRE= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-ID: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 539838d9-2638-4a44-08b5-08d642e1089d X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Nov 2018 05:39:20.3462 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0502MB4041 Subject: Re: [dpdk-dev] [PATCH 3/3] net/mlx5: remove flags setting from flow preparation 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: Mon, 05 Nov 2018 05:39:21 -0000 On Sun, Nov 04, 2018 at 01:29:13AM -0700, Ori Kam wrote: >=20 >=20 > > -----Original Message----- > > From: dev On Behalf Of Yongseok Koh > > Sent: Friday, November 2, 2018 11:08 PM > > To: Shahaf Shuler > > Cc: dev@dpdk.org; Yongseok Koh > > Subject: [dpdk-dev] [PATCH 3/3] net/mlx5: remove flags setting from flo= w > > preparation > >=20 > > Even though flow_drv_prepare() takes item_flags and action_flags to be > > filled in, those are not used and will be overwritten by parsing of > > flow_drv_translate(). There's no reason to keep the flags and fill it. > > Appropriate notes are added to the documentation of flow_drv_prepare() = and > > flow_drv_translate(). > >=20 > > Signed-off-by: Yongseok Koh > > --- > > drivers/net/mlx5/mlx5_flow.c | 38 ++++++++++++-------------- > > drivers/net/mlx5/mlx5_flow.h | 3 +-- > > drivers/net/mlx5/mlx5_flow_dv.c | 6 ----- > > drivers/net/mlx5/mlx5_flow_tcf.c | 55 +++++-------------------------= -------- > > drivers/net/mlx5/mlx5_flow_verbs.c | 52 +++---------------------------= ----- > > 5 files changed, 29 insertions(+), 125 deletions(-) > >=20 > > diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.= c > > index 107a4f02f8..fae3bc92dd 100644 > > --- a/drivers/net/mlx5/mlx5_flow.c > > +++ b/drivers/net/mlx5/mlx5_flow.c > > @@ -1657,8 +1657,6 @@ static struct mlx5_flow * > > flow_null_prepare(const struct rte_flow_attr *attr __rte_unused, > > const struct rte_flow_item items[] __rte_unused, > > const struct rte_flow_action actions[] __rte_unused, > > - uint64_t *item_flags __rte_unused, > > - uint64_t *action_flags __rte_unused, > > struct rte_flow_error *error __rte_unused) > > { > > rte_errno =3D ENOTSUP; > > @@ -1786,16 +1784,19 @@ flow_drv_validate(struct rte_eth_dev *dev, > > * calculates the size of memory required for device flow, allocates t= he > > memory, > > * initializes the device flow and returns the pointer. > > * > > + * @note > > + * This function initializes device flow structure such as dv, tcf o= r verbs in > > + * struct mlx5_flow. However, it is callee's responsibility to initi= alize the > > + * rest. For example, adding returning device flow to flow->dev_flow= list and > > + * setting backward reference to the flow should be done out of this= function. > > + * layers field is not filled either. > > + * > > * @param[in] attr > > * Pointer to the flow attributes. > > * @param[in] items > > * Pointer to the list of items. > > * @param[in] actions > > * Pointer to the list of actions. > > - * @param[out] item_flags > > - * Pointer to bit mask of all items detected. > > - * @param[out] action_flags > > - * Pointer to bit mask of all actions detected. > > * @param[out] error > > * Pointer to the error structure. > > * > > @@ -1803,12 +1804,10 @@ flow_drv_validate(struct rte_eth_dev *dev, > > * Pointer to device flow on success, otherwise NULL and rte_ernno i= s set. > > */ > > static inline struct mlx5_flow * > > -flow_drv_prepare(struct rte_flow *flow, > > +flow_drv_prepare(const struct rte_flow *flow, > > const struct rte_flow_attr *attr, > > const struct rte_flow_item items[], > > const struct rte_flow_action actions[], > > - uint64_t *item_flags, > > - uint64_t *action_flags, > > struct rte_flow_error *error) > > { > > const struct mlx5_flow_driver_ops *fops; > > @@ -1816,8 +1815,7 @@ flow_drv_prepare(struct rte_flow *flow, > >=20 > > assert(type > MLX5_FLOW_TYPE_MIN && type < > > MLX5_FLOW_TYPE_MAX); > > fops =3D flow_get_drv_ops(type); > > - return fops->prepare(attr, items, actions, item_flags, action_flags, > > - error); > > + return fops->prepare(attr, items, actions, error); > > } > >=20 > > /** > > @@ -1826,6 +1824,12 @@ flow_drv_prepare(struct rte_flow *flow, > > * translates a generic flow into a driver flow. flow_drv_prepare() mu= st > > * precede. > > * > > + * @note > > + * dev_flow->layers could be filled as a result of parsing during tr= anslation > > + * if needed by flow_drv_apply(). dev_flow->flow->actions can also b= e filled > > + * if necessary. As a flow can have multiple dev_flows by RSS flow e= xpansion, > > + * flow->actions could be overwritten even though all the expanded > > dev_flows > > + * have the same actions. > > * > > * @param[in] dev > > * Pointer to the rte dev structure. > > @@ -1889,7 +1893,7 @@ flow_drv_apply(struct rte_eth_dev *dev, struct > > rte_flow *flow, > > * Flow driver remove API. This abstracts calling driver specific func= tions. > > * Parent flow (rte_flow) should have driver type (drv_type). It remov= es a flow > > * on device. All the resources of the flow should be freed by calling > > - * flow_dv_destroy(). > > + * flow_drv_destroy(). > > * > > * @param[in] dev > > * Pointer to Ethernet device. > > @@ -2020,8 +2024,6 @@ flow_list_create(struct rte_eth_dev *dev, struct > > mlx5_flows *list, > > { > > struct rte_flow *flow =3D NULL; > > struct mlx5_flow *dev_flow; > > - uint64_t action_flags =3D 0; > > - uint64_t item_flags =3D 0; > > const struct rte_flow_action_rss *rss; > > union { > > struct rte_flow_expand_rss buf; > > @@ -2064,16 +2066,10 @@ flow_list_create(struct rte_eth_dev *dev, struc= t > > mlx5_flows *list, > > } > > for (i =3D 0; i < buf->entries; ++i) { > > dev_flow =3D flow_drv_prepare(flow, attr, buf->entry[i].pattern, > > - actions, &item_flags, &action_flags, > > - error); > > + actions, error); > > if (!dev_flow) > > goto error; > > dev_flow->flow =3D flow; > > - dev_flow->layers =3D item_flags; > > - /* Store actions once as expanded flows have same actions. */ > > - if (i =3D=3D 0) > > - flow->actions =3D action_flags; > > - assert(flow->actions =3D=3D action_flags); > > LIST_INSERT_HEAD(&flow->dev_flows, dev_flow, next); > > ret =3D flow_drv_translate(dev, dev_flow, attr, > > buf->entry[i].pattern, > > diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.= h > > index fadde552c2..f976bff427 100644 > > --- a/drivers/net/mlx5/mlx5_flow.h > > +++ b/drivers/net/mlx5/mlx5_flow.h > > @@ -293,8 +293,7 @@ typedef int (*mlx5_flow_validate_t)(struct rte_eth_= dev > > *dev, > > struct rte_flow_error *error); > > typedef struct mlx5_flow *(*mlx5_flow_prepare_t) > > (const struct rte_flow_attr *attr, const struct rte_flow_item items[]= , > > - const struct rte_flow_action actions[], uint64_t *item_flags, > > - uint64_t *action_flags, struct rte_flow_error *error); > > + const struct rte_flow_action actions[], struct rte_flow_error *error= ); > > typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev, > > struct mlx5_flow *dev_flow, > > const struct rte_flow_attr *attr, > > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > > b/drivers/net/mlx5/mlx5_flow_dv.c > > index 44e2a920eb..0fb791eafa 100644 > > --- a/drivers/net/mlx5/mlx5_flow_dv.c > > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > > @@ -1014,10 +1014,6 @@ flow_dv_validate(struct rte_eth_dev *dev, const > > struct rte_flow_attr *attr, > > * Pointer to the list of items. > > * @param[in] actions > > * Pointer to the list of actions. > > - * @param[out] item_flags > > - * Pointer to bit mask of all items detected. > > - * @param[out] action_flags > > - * Pointer to bit mask of all actions detected. > > * @param[out] error > > * Pointer to the error structure. > > * > > @@ -1029,8 +1025,6 @@ static struct mlx5_flow * > > flow_dv_prepare(const struct rte_flow_attr *attr __rte_unused, > > const struct rte_flow_item items[] __rte_unused, > > const struct rte_flow_action actions[] __rte_unused, > > - uint64_t *item_flags __rte_unused, > > - uint64_t *action_flags __rte_unused, > > struct rte_flow_error *error) > > { > > uint32_t size =3D sizeof(struct mlx5_flow); > > diff --git a/drivers/net/mlx5/mlx5_flow_tcf.c > > b/drivers/net/mlx5/mlx5_flow_tcf.c > > index 719fb10632..483e490843 100644 > > --- a/drivers/net/mlx5/mlx5_flow_tcf.c > > +++ b/drivers/net/mlx5/mlx5_flow_tcf.c > > @@ -664,20 +664,15 @@ flow_tcf_create_pedit_mnl_msg(struct nlmsghdr > > *nl, > > * > > * @param[in,out] actions > > * actions specification. > > - * @param[in,out] action_flags > > - * actions flags > > - * @param[in,out] size > > - * accumulated size > > + * > > * @return > > * Max memory size of one TC-pedit action > > */ > > static int > > -flow_tcf_get_pedit_actions_size(const struct rte_flow_action **actions= , > > - uint64_t *action_flags) > > +flow_tcf_get_pedit_actions_size(const struct rte_flow_action **actions= ) > > { > > int pedit_size =3D 0; > > int keys =3D 0; > > - uint64_t flags =3D 0; > >=20 > > pedit_size +=3D SZ_NLATTR_NEST + /* na_act_index. */ > > SZ_NLATTR_STRZ_OF("pedit") + > > @@ -686,45 +681,35 @@ flow_tcf_get_pedit_actions_size(const struct > > rte_flow_action **actions, > > switch ((*actions)->type) { > > case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC: > > keys +=3D NUM_OF_PEDIT_KEYS(IPV4_ADDR_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_IPV4_SRC; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST: > > keys +=3D NUM_OF_PEDIT_KEYS(IPV4_ADDR_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_IPV4_DST; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC: > > keys +=3D NUM_OF_PEDIT_KEYS(IPV6_ADDR_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_IPV6_SRC; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST: > > keys +=3D NUM_OF_PEDIT_KEYS(IPV6_ADDR_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_IPV6_DST; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_TP_SRC: > > /* TCP is as same as UDP */ > > keys +=3D NUM_OF_PEDIT_KEYS(TP_PORT_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_TP_SRC; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_TP_DST: > > /* TCP is as same as UDP */ > > keys +=3D NUM_OF_PEDIT_KEYS(TP_PORT_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_TP_DST; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_TTL: > > keys +=3D NUM_OF_PEDIT_KEYS(TTL_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_TTL; > > break; > > case RTE_FLOW_ACTION_TYPE_DEC_TTL: > > keys +=3D NUM_OF_PEDIT_KEYS(TTL_LEN); > > - flags |=3D MLX5_FLOW_ACTION_DEC_TTL; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC: > > keys +=3D NUM_OF_PEDIT_KEYS(ETHER_ADDR_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_MAC_SRC; > > break; > > case RTE_FLOW_ACTION_TYPE_SET_MAC_DST: > > keys +=3D NUM_OF_PEDIT_KEYS(ETHER_ADDR_LEN); > > - flags |=3D MLX5_FLOW_ACTION_SET_MAC_DST; > > break; > > default: > > goto get_pedit_action_size_done; > > @@ -740,7 +725,6 @@ flow_tcf_get_pedit_actions_size(const struct > > rte_flow_action **actions, > > /* TCA_PEDIT_KEY_EX + HTYPE + CMD */ > > (SZ_NLATTR_NEST + SZ_NLATTR_DATA_OF(2) + > > SZ_NLATTR_DATA_OF(2)); > > - (*action_flags) |=3D flags; > > (*actions)--; > > return pedit_size; > > } > > @@ -1415,11 +1399,9 @@ flow_tcf_validate(struct rte_eth_dev *dev, > > */ > > static int > > flow_tcf_get_items_and_size(const struct rte_flow_attr *attr, > > - const struct rte_flow_item items[], > > - uint64_t *item_flags) > > + const struct rte_flow_item items[]) > > { > > int size =3D 0; > > - uint64_t flags =3D 0; > >=20 > > size +=3D SZ_NLATTR_STRZ_OF("flower") + > > SZ_NLATTR_NEST + /* TCA_OPTIONS. */ > > @@ -1436,7 +1418,6 @@ flow_tcf_get_items_and_size(const struct > > rte_flow_attr *attr, > > size +=3D SZ_NLATTR_TYPE_OF(uint16_t) + /* Ether type. > > */ > > SZ_NLATTR_DATA_OF(ETHER_ADDR_LEN) * 4; > > /* dst/src MAC addr and mask. */ > > - flags |=3D MLX5_FLOW_LAYER_OUTER_L2; > > break; > > case RTE_FLOW_ITEM_TYPE_VLAN: > > size +=3D SZ_NLATTR_TYPE_OF(uint16_t) + /* Ether type. > > */ > > @@ -1444,33 +1425,28 @@ flow_tcf_get_items_and_size(const struct > > rte_flow_attr *attr, > > /* VLAN Ether type. */ > > SZ_NLATTR_TYPE_OF(uint8_t) + /* VLAN prio. > > */ > > SZ_NLATTR_TYPE_OF(uint16_t); /* VLAN ID. */ > > - flags |=3D MLX5_FLOW_LAYER_OUTER_VLAN; > > break; > > case RTE_FLOW_ITEM_TYPE_IPV4: > > size +=3D SZ_NLATTR_TYPE_OF(uint16_t) + /* Ether type. > > */ > > SZ_NLATTR_TYPE_OF(uint8_t) + /* IP proto. */ > > SZ_NLATTR_TYPE_OF(uint32_t) * 4; > > /* dst/src IP addr and mask. */ > > - flags |=3D MLX5_FLOW_LAYER_OUTER_L3_IPV4; > > break; > > case RTE_FLOW_ITEM_TYPE_IPV6: > > size +=3D SZ_NLATTR_TYPE_OF(uint16_t) + /* Ether type. > > */ > > SZ_NLATTR_TYPE_OF(uint8_t) + /* IP proto. */ > > SZ_NLATTR_TYPE_OF(IPV6_ADDR_LEN) * 4; > > /* dst/src IP addr and mask. */ > > - flags |=3D MLX5_FLOW_LAYER_OUTER_L3_IPV6; > > break; > > case RTE_FLOW_ITEM_TYPE_UDP: > > size +=3D SZ_NLATTR_TYPE_OF(uint8_t) + /* IP proto. */ > > SZ_NLATTR_TYPE_OF(uint16_t) * 4; > > /* dst/src port and mask. */ > > - flags |=3D MLX5_FLOW_LAYER_OUTER_L4_UDP; > > break; > > case RTE_FLOW_ITEM_TYPE_TCP: > > size +=3D SZ_NLATTR_TYPE_OF(uint8_t) + /* IP proto. */ > > SZ_NLATTR_TYPE_OF(uint16_t) * 4; > > /* dst/src port and mask. */ > > - flags |=3D MLX5_FLOW_LAYER_OUTER_L4_TCP; > > break; > > default: > > DRV_LOG(WARNING, > > @@ -1480,7 +1456,6 @@ flow_tcf_get_items_and_size(const struct > > rte_flow_attr *attr, > > break; > > } > > } > > - *item_flags =3D flags; > > return size; > > } > >=20 > > @@ -1497,11 +1472,9 @@ flow_tcf_get_items_and_size(const struct > > rte_flow_attr *attr, > > * Maximum size of memory for actions. > > */ > > static int > > -flow_tcf_get_actions_and_size(const struct rte_flow_action actions[], > > - uint64_t *action_flags) > > +flow_tcf_get_actions_and_size(const struct rte_flow_action actions[]) > > { > > int size =3D 0; > > - uint64_t flags =3D 0; > >=20 > > size +=3D SZ_NLATTR_NEST; /* TCA_FLOWER_ACT. */ > > for (; actions->type !=3D RTE_FLOW_ACTION_TYPE_END; actions++) { > > @@ -1513,35 +1486,28 @@ flow_tcf_get_actions_and_size(const struct > > rte_flow_action actions[], > > SZ_NLATTR_STRZ_OF("mirred") + > > SZ_NLATTR_NEST + /* TCA_ACT_OPTIONS. */ > > SZ_NLATTR_TYPE_OF(struct tc_mirred); > > - flags |=3D MLX5_FLOW_ACTION_PORT_ID; > > break; > > case RTE_FLOW_ACTION_TYPE_JUMP: > > size +=3D SZ_NLATTR_NEST + /* na_act_index. */ > > SZ_NLATTR_STRZ_OF("gact") + > > SZ_NLATTR_NEST + /* TCA_ACT_OPTIONS. */ > > SZ_NLATTR_TYPE_OF(struct tc_gact); > > - flags |=3D MLX5_FLOW_ACTION_JUMP; > > break; > > case RTE_FLOW_ACTION_TYPE_DROP: > > size +=3D SZ_NLATTR_NEST + /* na_act_index. */ > > SZ_NLATTR_STRZ_OF("gact") + > > SZ_NLATTR_NEST + /* TCA_ACT_OPTIONS. */ > > SZ_NLATTR_TYPE_OF(struct tc_gact); > > - flags |=3D MLX5_FLOW_ACTION_DROP; > > break; > > case RTE_FLOW_ACTION_TYPE_COUNT: > > break; > > case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: > > - flags |=3D MLX5_FLOW_ACTION_OF_POP_VLAN; > > goto action_of_vlan; > > case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN: > > - flags |=3D MLX5_FLOW_ACTION_OF_PUSH_VLAN; > > goto action_of_vlan; > > case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID: > > - flags |=3D MLX5_FLOW_ACTION_OF_SET_VLAN_VID; > > goto action_of_vlan; > > case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP: > > - flags |=3D MLX5_FLOW_ACTION_OF_SET_VLAN_PCP; > > goto action_of_vlan; > > action_of_vlan: > > size +=3D SZ_NLATTR_NEST + /* na_act_index. */ > > @@ -1563,8 +1529,7 @@ flow_tcf_get_actions_and_size(const struct > > rte_flow_action actions[], > > case RTE_FLOW_ACTION_TYPE_DEC_TTL: > > case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC: > > case RTE_FLOW_ACTION_TYPE_SET_MAC_DST: > > - size +=3D flow_tcf_get_pedit_actions_size(&actions, > > - &flags); > > + size +=3D flow_tcf_get_pedit_actions_size(&actions); > > break; > > default: > > DRV_LOG(WARNING, > > @@ -1574,7 +1539,6 @@ flow_tcf_get_actions_and_size(const struct > > rte_flow_action actions[], > > break; > > } > > } > > - *action_flags =3D flags; > > return size; > > } > >=20 > > @@ -1610,10 +1574,6 @@ flow_tcf_nl_brand(struct nlmsghdr *nlh, uint32_t > > handle) > > * Pointer to the list of items. > > * @param[in] actions > > * Pointer to the list of actions. > > - * @param[out] item_flags > > - * Pointer to bit mask of all items detected. > > - * @param[out] action_flags > > - * Pointer to bit mask of all actions detected. > > * @param[out] error > > * Pointer to the error structure. > > * > > @@ -1625,7 +1585,6 @@ static struct mlx5_flow * > > flow_tcf_prepare(const struct rte_flow_attr *attr, > > const struct rte_flow_item items[], > > const struct rte_flow_action actions[], > > - uint64_t *item_flags, uint64_t *action_flags, > > struct rte_flow_error *error) > > { > > size_t size =3D sizeof(struct mlx5_flow) + > > @@ -1635,8 +1594,8 @@ flow_tcf_prepare(const struct rte_flow_attr *attr= , > > struct nlmsghdr *nlh; > > struct tcmsg *tcm; > >=20 > > - size +=3D flow_tcf_get_items_and_size(attr, items, item_flags); > > - size +=3D flow_tcf_get_actions_and_size(actions, action_flags); > > + size +=3D flow_tcf_get_items_and_size(attr, items); > > + size +=3D flow_tcf_get_actions_and_size(actions); > > dev_flow =3D rte_zmalloc(__func__, size, MNL_ALIGNTO); > > if (!dev_flow) { > > rte_flow_error_set(error, ENOMEM, > > diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c > > b/drivers/net/mlx5/mlx5_flow_verbs.c > > index ab58c04db5..453c89e347 100644 > > --- a/drivers/net/mlx5/mlx5_flow_verbs.c > > +++ b/drivers/net/mlx5/mlx5_flow_verbs.c > > @@ -1217,11 +1217,9 @@ flow_verbs_validate(struct rte_eth_dev *dev, > > * The size of the memory needed for all actions. > > */ > > static int > > -flow_verbs_get_actions_and_size(const struct rte_flow_action actions[]= , > > - uint64_t *action_flags) > > +flow_verbs_get_actions_and_size(const struct rte_flow_action actions[]= ) > > { > > int size =3D 0; > > - uint64_t detected_actions =3D 0; > >=20 > > for (; actions->type !=3D RTE_FLOW_ACTION_TYPE_END; actions++) { > > switch (actions->type) { > > @@ -1229,34 +1227,27 @@ flow_verbs_get_actions_and_size(const struct > > rte_flow_action actions[], > > break; > > case RTE_FLOW_ACTION_TYPE_FLAG: > > size +=3D sizeof(struct ibv_flow_spec_action_tag); > > - detected_actions |=3D MLX5_FLOW_ACTION_FLAG; > > break; > > case RTE_FLOW_ACTION_TYPE_MARK: > > size +=3D sizeof(struct ibv_flow_spec_action_tag); > > - detected_actions |=3D MLX5_FLOW_ACTION_MARK; > > break; > > case RTE_FLOW_ACTION_TYPE_DROP: > > size +=3D sizeof(struct ibv_flow_spec_action_drop); > > - detected_actions |=3D MLX5_FLOW_ACTION_DROP; > > break; > > case RTE_FLOW_ACTION_TYPE_QUEUE: > > - detected_actions |=3D MLX5_FLOW_ACTION_QUEUE; > > break; > > case RTE_FLOW_ACTION_TYPE_RSS: > > - detected_actions |=3D MLX5_FLOW_ACTION_RSS; > > break; > > case RTE_FLOW_ACTION_TYPE_COUNT: > > #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42) || \ > > defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45) > > size +=3D sizeof(struct ibv_flow_spec_counter_action); > > #endif > > - detected_actions |=3D MLX5_FLOW_ACTION_COUNT; > > break; > > default: > > break; > > } > > } > > - *action_flags =3D detected_actions; > > return size; > > } > >=20 > > @@ -1274,83 +1265,54 @@ flow_verbs_get_actions_and_size(const struct > > rte_flow_action actions[], > > * The size of the memory needed for all items. > > */ > > static int > > -flow_verbs_get_items_and_size(const struct rte_flow_item items[], > > - uint64_t *item_flags) > > +flow_verbs_get_items_and_size(const struct rte_flow_item items[]) > > { > > int size =3D 0; > > - uint64_t detected_items =3D 0; > >=20 > > for (; items->type !=3D RTE_FLOW_ITEM_TYPE_END; items++) { > > - int tunnel =3D !!(detected_items & > > MLX5_FLOW_LAYER_TUNNEL); > > - > > switch (items->type) { > > case RTE_FLOW_ITEM_TYPE_VOID: > > break; > > case RTE_FLOW_ITEM_TYPE_ETH: > > size +=3D sizeof(struct ibv_flow_spec_eth); > > - detected_items |=3D tunnel ? > > MLX5_FLOW_LAYER_INNER_L2 : > > - > > MLX5_FLOW_LAYER_OUTER_L2; > > break; > > case RTE_FLOW_ITEM_TYPE_VLAN: > > size +=3D sizeof(struct ibv_flow_spec_eth); > > - detected_items |=3D > > - tunnel ? (MLX5_FLOW_LAYER_INNER_L2 | > > - MLX5_FLOW_LAYER_INNER_VLAN) : > > - (MLX5_FLOW_LAYER_OUTER_L2 | > > - MLX5_FLOW_LAYER_OUTER_VLAN); > > break; > > case RTE_FLOW_ITEM_TYPE_IPV4: > > size +=3D sizeof(struct ibv_flow_spec_ipv4_ext); > > - detected_items |=3D tunnel ? > > - MLX5_FLOW_LAYER_INNER_L3_IPV4 > > : > > - > > MLX5_FLOW_LAYER_OUTER_L3_IPV4; > > break; > > case RTE_FLOW_ITEM_TYPE_IPV6: > > size +=3D sizeof(struct ibv_flow_spec_ipv6); > > - detected_items |=3D tunnel ? > > - MLX5_FLOW_LAYER_INNER_L3_IPV6 > > : > > - > > MLX5_FLOW_LAYER_OUTER_L3_IPV6; > > break; > > case RTE_FLOW_ITEM_TYPE_UDP: > > size +=3D sizeof(struct ibv_flow_spec_tcp_udp); > > - detected_items |=3D tunnel ? > > - MLX5_FLOW_LAYER_INNER_L4_UDP > > : > > - > > MLX5_FLOW_LAYER_OUTER_L4_UDP; > > break; > > case RTE_FLOW_ITEM_TYPE_TCP: > > size +=3D sizeof(struct ibv_flow_spec_tcp_udp); > > - detected_items |=3D tunnel ? > > - MLX5_FLOW_LAYER_INNER_L4_TCP : > > - > > MLX5_FLOW_LAYER_OUTER_L4_TCP; > > break; > > case RTE_FLOW_ITEM_TYPE_VXLAN: > > size +=3D sizeof(struct ibv_flow_spec_tunnel); > > - detected_items |=3D MLX5_FLOW_LAYER_VXLAN; > > break; > > case RTE_FLOW_ITEM_TYPE_VXLAN_GPE: > > size +=3D sizeof(struct ibv_flow_spec_tunnel); > > - detected_items |=3D MLX5_FLOW_LAYER_VXLAN_GPE; > > break; > > #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT > > case RTE_FLOW_ITEM_TYPE_GRE: > > size +=3D sizeof(struct ibv_flow_spec_gre); > > - detected_items |=3D MLX5_FLOW_LAYER_GRE; > > break; > > case RTE_FLOW_ITEM_TYPE_MPLS: > > size +=3D sizeof(struct ibv_flow_spec_mpls); > > - detected_items |=3D MLX5_FLOW_LAYER_MPLS; > > break; > > #else > > case RTE_FLOW_ITEM_TYPE_GRE: > > size +=3D sizeof(struct ibv_flow_spec_tunnel); > > - detected_items |=3D MLX5_FLOW_LAYER_TUNNEL; > > break; > > #endif > > default: > > break; > > } > > } > > - *item_flags =3D detected_items; > > return size; > > } > >=20 > > @@ -1365,10 +1327,6 @@ flow_verbs_get_items_and_size(const struct > > rte_flow_item items[], > > * Pointer to the list of items. > > * @param[in] actions > > * Pointer to the list of actions. > > - * @param[out] item_flags > > - * Pointer to bit mask of all items detected. > > - * @param[out] action_flags > > - * Pointer to bit mask of all actions detected. > > * @param[out] error > > * Pointer to the error structure. > > * > > @@ -1380,15 +1338,13 @@ static struct mlx5_flow * > > flow_verbs_prepare(const struct rte_flow_attr *attr __rte_unused, > > const struct rte_flow_item items[], > > const struct rte_flow_action actions[], > > - uint64_t *item_flags, > > - uint64_t *action_flags, > > struct rte_flow_error *error) > > { > > uint32_t size =3D sizeof(struct mlx5_flow) + sizeof(struct ibv_flow_a= ttr); > > struct mlx5_flow *flow; > >=20 > > - size +=3D flow_verbs_get_actions_and_size(actions, action_flags); > > - size +=3D flow_verbs_get_items_and_size(items, item_flags); > > + size +=3D flow_verbs_get_actions_and_size(actions); >=20 > I think the function name should be changed since it only returns the siz= e. >=20 > > + size +=3D flow_verbs_get_items_and_size(items); >=20 > I think the function name should be changed since it only returns the siz= e. Agree. I have to rebase the code anyway as VXLAN has been merged. Will change it. Thanks, Yongseok