From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0083.outbound.protection.outlook.com [104.47.1.83]) by dpdk.org (Postfix) with ESMTP id B30D05424 for ; Mon, 5 Nov 2018 08:20:48 +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=O3bt4pGO/GhBJPcuRZfhShFIdVsiem0v7RLiW/qTmFw=; b=PBhQfb5z2Rg2C7D1LqXuvO7MkyFB4RZY8UsKTz9o9+c0J6Pj3n3mcNk4WaDqs0jLzWrxg8kvPDLbK/unoBP92eltpPH6m6G9mL3Id+sfBiGeGR/wLqe2XqrNFCD9a+Ine76QcK6mOcNu5vL/Fl+ildBChNrf3rwVZV4qFi15Pao= Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com (52.134.72.27) by DB3PR0502MB4076.eurprd05.prod.outlook.com (52.134.66.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.30; Mon, 5 Nov 2018 07:20:47 +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 07:20:47 +0000 From: Yongseok Koh To: Shahaf Shuler CC: "dev@dpdk.org" , Ori Kam , Yongseok Koh Thread-Topic: [PATCH v2 3/3] net/mlx5: remove flags setting from flow preparation Thread-Index: AQHUdNgSSYth6STsQ06BUuIakiejTA== Date: Mon, 5 Nov 2018 07:20:47 +0000 Message-ID: <20181105072032.42374-4-yskoh@mellanox.com> References: <20181102210801.28370-1-yskoh@mellanox.com> <20181105072032.42374-1-yskoh@mellanox.com> In-Reply-To: <20181105072032.42374-1-yskoh@mellanox.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: BYAPR07CA0030.namprd07.prod.outlook.com (2603:10b6:a02:bc::43) 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; DB3PR0502MB4076; 6:FGUSvpRDtnccGD/kzNMumQOpypsRrQ2pvBjZb2ewmaxW0bHMISqwqQ4IO7Vc68j4jLURLsDJQCKgddcd/yNLqnAAffLoI+5SOmn2xJ9WdjrkOVegWV9f6UpAxmsxfwCtbd9PyIkQiTgmZfnijBTlZvMfACSsl6n1eTJ9H/t/Ms6ocaaNVVvHp4lh8tvP02PUJE+OR1mLhY/gtEjXlvFp86rjcozA7XeYM+W9CfKCvpLYPSR2wbXo5l5umkoTVG4RqJXBZ4rIY8WMVYeIww0ytAZoi4LbbLrpIejZamWnM/bbC5WcqECUg7UF3/iT6D096oYJAkpmyz6Nx4YchA7fMwMvfHl/6KDInIDq3nkFcJKxom5IcUOKPYaa1dMOcngB/qoQBeNE1kYWxmIrarzKP6nd/ExkeOTarvGl+2i0rHzDft+VNXl6S/VhOO7ZRqsnyup8RheYqdCSnLJPCq87Qw==; 5:oOUrJIgbqzfzKt4bwcbXJiZATpOcKm5VIE3dof2ZupmTEclOcrcN5y9ep83xM2jqTyDmGdgWzQ1IIqve352nSNBX9ij4nAxU0+N9Pmy8T0RefJIc7r+sGPX63e8ce1HXKwI4c3uA5TWPHKy8OTRjeXpoD5WpDdSEcM54G+yESJQ=; 7:Q5Flzis1xbwvdYFP7QlcSTHITVlKiJCQz4PAP5vhTuDghNVQuW6JH6j6CGqhopTSaehBtb1c6NMlJ/YpJig6K+wyzmy9CLJAblTt8+bC0mIy5ObdQeB0l7uOyBl29Y95Vd5zqM7J75hbCxZDfMYBig== x-ms-office365-filtering-correlation-id: b580b2c5-7908-4d75-c6a8-08d642ef34a5 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:DB3PR0502MB4076; x-ms-traffictypediagnostic: DB3PR0502MB4076: 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)(10201501046)(3002001)(93006095)(93001095)(3231382)(944501410)(52105095)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:DB3PR0502MB4076; BCL:0; PCL:0; RULEID:; SRVR:DB3PR0502MB4076; x-forefront-prvs: 08476BC6EF x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(346002)(376002)(366004)(396003)(136003)(39860400002)(51234002)(189003)(199004)(66066001)(106356001)(25786009)(446003)(11346002)(97736004)(256004)(14454004)(105586002)(14444005)(68736007)(6512007)(53946003)(2900100001)(2906002)(53936002)(3846002)(6116002)(1076002)(37006003)(6506007)(386003)(52116002)(99286004)(36756003)(4744004)(7736002)(305945005)(6486002)(316002)(6436002)(54906003)(186003)(4326008)(102836004)(86362001)(71190400001)(71200400001)(81166006)(81156014)(486006)(8676002)(6862004)(6636002)(5660300001)(478600001)(107886003)(575784001)(476003)(2616005)(8936002)(76176011)(26005); DIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR0502MB4076; H:DB3PR0502MB3980.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: MmjePiicq3+dV4k6HYkVQCtk9QEU/Pu1PnNj17q325Fc2EzyvwJY3F6Z6hpcgGv5LTFCzGyvBYcvxKsyXzr/kaakwmz06N2mQrTJIUfOJS5QqpK2998bs1cYE9Po3MHY5b28XQsRJSOjoyGbFBT7apBfZAOn6Q+6JXwAokHK6efEE4EXT/avtXhkzwX1RQIbiu6fKnou/j2WqRuIsM77tikDcp2hGc9AaGB4YuvRgkqapPEY7e+xaAyHpGMSH75BdTOv7+rG8/jcmZpxFCxmQqUj/Y3zJMgxs1h7gEC1xXAJAmma1eSa9tWqSIBeWOf5StCgHfovHpVcMLrDzqJ7wi/EigLFOZDBDjcMJWs7Kjk= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: b580b2c5-7908-4d75-c6a8-08d642ef34a5 X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Nov 2018 07:20:47.1462 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0502MB4076 Subject: [dpdk-dev] [PATCH v2 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 07:20:49 -0000 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(). 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 | 39 +++++++---------------- drivers/net/mlx5/mlx5_flow_verbs.c | 64 +++++-----------------------------= ---- 5 files changed, 37 insertions(+), 113 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index be2cc6b93f..3c2ac4b377 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -1663,8 +1663,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; @@ -1792,16 +1790,19 @@ flow_drv_validate(struct rte_eth_dev *dev, * calculates the size of memory required for device flow, allocates the m= emory, * initializes the device flow and returns the pointer. * + * @note + * This function initializes device flow structure such as dv, tcf or ve= rbs in + * struct mlx5_flow. However, it is caller's responsibility to initializ= e the + * rest. For example, adding returning device flow to flow->dev_flow lis= t and + * setting backward reference to the flow should be done out of this fun= ction. + * 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. * @@ -1809,12 +1810,10 @@ flow_drv_validate(struct rte_eth_dev *dev, * Pointer to device flow on success, otherwise NULL and rte_ernno is se= t. */ 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; @@ -1822,8 +1821,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 /** @@ -1832,6 +1830,12 @@ flow_drv_prepare(struct rte_flow *flow, * translates a generic flow into a driver flow. flow_drv_prepare() must * precede. * + * @note + * dev_flow->layers could be filled as a result of parsing during transl= ation + * if needed by flow_drv_apply(). dev_flow->flow->actions can also be fi= lled + * if necessary. As a flow can have multiple dev_flows by RSS flow expan= sion, + * flow->actions could be overwritten even though all the expanded dev_f= lows + * have the same actions. * * @param[in] dev * Pointer to the rte dev structure. @@ -1895,7 +1899,7 @@ flow_drv_apply(struct rte_eth_dev *dev, struct rte_fl= ow *flow, * Flow driver remove API. This abstracts calling driver specific function= s. * Parent flow (rte_flow) should have driver type (drv_type). It removes 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. @@ -2026,8 +2030,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; @@ -2070,16 +2072,10 @@ flow_list_create(struct rte_eth_dev *dev, struct ml= x5_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 2a3ce44b0b..51ab47fe44 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -302,8 +302,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_d= v.c index 8b4d5956ba..7909615360 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 stru= ct 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 ee614b3f1d..fb817b2311 100644 --- a/drivers/net/mlx5/mlx5_flow_tcf.c +++ b/drivers/net/mlx5/mlx5_flow_tcf.c @@ -2370,24 +2370,21 @@ flow_tcf_validate(struct rte_eth_dev *dev, } =20 /** - * Calculate maximum size of memory for flow items of Linux TC flower and - * extract specified items. + * Calculate maximum size of memory for flow items of Linux TC flower. * + * @param[in] attr + * Pointer to the flow attributes. * @param[in] items * Pointer to the list of items. - * @param[out] item_flags - * Pointer to the detected items. * * @return * Maximum size of memory for items. */ static int -flow_tcf_get_items_and_size(const struct rte_flow_attr *attr, - const struct rte_flow_item items[], - uint64_t *item_flags) +flow_tcf_get_items_size(const struct rte_flow_attr *attr, + 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. */ @@ -2404,7 +2401,6 @@ flow_tcf_get_items_and_size(const struct rte_flow_att= r *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. */ @@ -2412,37 +2408,31 @@ flow_tcf_get_items_and_size(const struct rte_flow_a= ttr *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_DATA_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; case RTE_FLOW_ITEM_TYPE_VXLAN: size +=3D SZ_NLATTR_TYPE_OF(uint32_t); - flags |=3D MLX5_FLOW_LAYER_VXLAN; break; default: DRV_LOG(WARNING, @@ -2452,7 +2442,6 @@ flow_tcf_get_items_and_size(const struct rte_flow_att= r *attr, break; } } - *item_flags =3D flags; return size; } =20 @@ -2668,10 +2657,6 @@ flow_tcf_nl_brand(struct nlmsghdr *nlh, uint32_t han= dle) * 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. * @@ -2683,7 +2668,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 RTE_ALIGN_CEIL @@ -2692,12 +2676,13 @@ flow_tcf_prepare(const struct rte_flow_attr *attr, MNL_ALIGN(sizeof(struct nlmsghdr)) + MNL_ALIGN(sizeof(struct tcmsg)); struct mlx5_flow *dev_flow; + uint64_t action_flags =3D 0; struct nlmsghdr *nlh; struct tcmsg *tcm; uint8_t *sp, *tun =3D NULL; =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_size(attr, items); + size +=3D flow_tcf_get_actions_and_size(actions, &action_flags); dev_flow =3D rte_zmalloc(__func__, size, MNL_ALIGNTO); if (!dev_flow) { rte_flow_error_set(error, ENOMEM, @@ -2706,7 +2691,7 @@ flow_tcf_prepare(const struct rte_flow_attr *attr, return NULL; } sp =3D (uint8_t *)(dev_flow + 1); - if (*action_flags & MLX5_FLOW_ACTION_VXLAN_ENCAP) { + if (action_flags & MLX5_FLOW_ACTION_VXLAN_ENCAP) { sp =3D RTE_PTR_ALIGN (sp, alignof(struct flow_tcf_tunnel_hdr)); tun =3D sp; @@ -2718,7 +2703,7 @@ flow_tcf_prepare(const struct rte_flow_attr *attr, (sizeof(struct flow_tcf_vxlan_encap), MNL_ALIGNTO); #endif - } else if (*action_flags & MLX5_FLOW_ACTION_VXLAN_DECAP) { + } else if (action_flags & MLX5_FLOW_ACTION_VXLAN_DECAP) { sp =3D RTE_PTR_ALIGN (sp, alignof(struct flow_tcf_tunnel_hdr)); tun =3D sp; @@ -2747,9 +2732,9 @@ flow_tcf_prepare(const struct rte_flow_attr *attr, .tcm =3D tcm, }, }; - if (*action_flags & MLX5_FLOW_ACTION_VXLAN_DECAP) + if (action_flags & MLX5_FLOW_ACTION_VXLAN_DECAP) dev_flow->tcf.tunnel->type =3D FLOW_TCF_TUNACT_VXLAN_DECAP; - else if (*action_flags & MLX5_FLOW_ACTION_VXLAN_ENCAP) + else if (action_flags & MLX5_FLOW_ACTION_VXLAN_ENCAP) dev_flow->tcf.tunnel->type =3D FLOW_TCF_TUNACT_VXLAN_ENCAP; /* * Generate a reasonably unique handle based on the address of the diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flo= w_verbs.c index 43fcd0d29e..699cc88c8c 100644 --- a/drivers/net/mlx5/mlx5_flow_verbs.c +++ b/drivers/net/mlx5/mlx5_flow_verbs.c @@ -1209,23 +1209,18 @@ flow_verbs_validate(struct rte_eth_dev *dev, =20 /** * Calculate the required bytes that are needed for the action part of the= verbs - * flow, in addtion returns bit-fields with all the detected action, in or= der to - * avoid another interation over the actions. + * flow. * * @param[in] actions * Pointer to the list of actions. - * @param[out] action_flags - * Pointer to the detected actions. * * @return * 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_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) { @@ -1233,128 +1228,89 @@ flow_verbs_get_actions_and_size(const struct rte_f= low_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 /** * Calculate the required bytes that are needed for the item part of the v= erbs - * flow, in addtion returns bit-fields with all the detected action, in or= der to - * avoid another interation over the actions. + * flow. * - * @param[in] actions + * @param[in] items * Pointer to the list of items. - * @param[in, out] item_flags - * Pointer to the detected items. * * @return * 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_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 @@ -1369,10 +1325,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. * @@ -1384,15 +1336,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_attr)= ; 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_size(actions); + size +=3D flow_verbs_get_items_size(items); flow =3D rte_calloc(__func__, 1, size, 0); if (!flow) { rte_flow_error_set(error, ENOMEM, --=20 2.11.0