From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4D1A242CF9; Mon, 19 Jun 2023 15:57:47 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 234AE40E0F; Mon, 19 Jun 2023 15:57:47 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2058.outbound.protection.outlook.com [40.107.223.58]) by mails.dpdk.org (Postfix) with ESMTP id 4F71E40DF8 for ; Mon, 19 Jun 2023 15:57:45 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=is/qWvb6GQqS9xuqmmSpe2GSZ0vtLbvi/k6StgmUiVnTtlZDhSZshABgHQn/9h2NK9K1fNF4UzBQ2O/gNUCte/FAec1YR3YC9tl1TatLxtn1PhgbP53FH0mx5zrgagnhhH36FzXZUTIVMo96x5NEPZUpq5ccU/7hGCfuTByE69x7/CXNX1A1DuI4/9g5LOKONydXFUrSlzPP7Xvcu90ahVoPQ1LCb1qVlMNAVwqnWw9vxwLgr5/3TcTuCaIdhCBksOs+zutg1/hEsQwYcG6045C+caffMfAUR1ZD1LH/Ifc4QwuLQcPR1bIUVFmbGdXzORQogfTEJLF3QtYkVj32ow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=F5e7sFGAXrIb8LeKOJKNjqufxzH/p3IUVckobm4fUpQ=; b=NObzNWqOCUzBt/T8SV1b5LkiBk/iDwBCIg0oJj0LJqM3gkCgFCTTWp2rNJa417vROz5G1kedUfnVnYKbn3E3t4+rdWvjOj49npOzrsmhqbw2Izbn9Vjcx5MsboPAu5ikpfUg7lxCjFjTJBwaC6mKfKtMVnmeyXXv9rQHIBD5jde2PfE+c/qXDoBcBNRJc2CuZ8yVnna/Wlk9Gqljge3wt399wXWe+yz/FUOGYX7vWbj4+J7p1N3pMHywAoPM/B0VXWqsYgF0m8OBcdgr529qMY+/21iXgY12sjwYD5q/fIbDty4PvzohmejipMQdfvcelBCt8gs6k3rqOa2jGkR77Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=F5e7sFGAXrIb8LeKOJKNjqufxzH/p3IUVckobm4fUpQ=; b=ovFuweADdoceUw5GbMS2GhfdysdjwhfctuUvNVd/OQxEjnDJhKt+ieZVsW6mbbpn+ZhXMF5MrCivrYhnVhzFovaCPU+MKG/rEvm0YI5oi5FVKbLn0vGyiCiemhrhrCLIGrGaDbJZqxTZHz2GZgUIWeri79djjGGwEhOqmTgP21tmvIl871yfiMCpjAyQoZ3pNWAfCz6rqYv7m3iWwflrFjlM0jbgS6TiWtNAsXtSiKVRLa+94ehYn43o4voxG1owJFksP+QcwPv4yX6S2JnKBzkewftQsd3ZH8dxbovcNOe75PnC1VD8Vq0MRlMZG1fYhxkFBWHeGGnW8KbCoNvGCA== Received: from DM6PR12MB3753.namprd12.prod.outlook.com (2603:10b6:5:1c7::18) by DM4PR12MB5915.namprd12.prod.outlook.com (2603:10b6:8:68::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.37; Mon, 19 Jun 2023 13:57:42 +0000 Received: from DM6PR12MB3753.namprd12.prod.outlook.com ([fe80::ab87:3bac:b8e:a23d]) by DM6PR12MB3753.namprd12.prod.outlook.com ([fe80::ab87:3bac:b8e:a23d%3]) with mapi id 15.20.6500.036; Mon, 19 Jun 2023 13:57:42 +0000 From: Slava Ovsiienko To: David Marchand , "dev@dpdk.org" , Ali Alnubani CC: "NBU-Contact-Thomas Monjalon (EXTERNAL)" , "i.maximets@ovn.org" , Aman Singh , Yuying Zhang , Matan Azrad , Ori Kam , Suanming Mou , David Christensen , Ruifeng Wang , Bruce Richardson , Konstantin Ananyev , Andrew Rybchenko , Ferruh Yigit Subject: RE: [RFC PATCH v2] ethdev: advertise flow restore in mbuf Thread-Topic: [RFC PATCH v2] ethdev: advertise flow restore in mbuf Thread-Index: AQHZn4/q4yjq34bH206uYS/Sk7699K+SLDGQ Date: Mon, 19 Jun 2023 13:57:42 +0000 Message-ID: References: <20230505103102.2912297-1-david.marchand@redhat.com> <20230615134701.3392784-1-david.marchand@redhat.com> In-Reply-To: <20230615134701.3392784-1-david.marchand@redhat.com> Accept-Language: en-US Content-Language: en-US X-Mentions: alialnu@nvidia.com X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DM6PR12MB3753:EE_|DM4PR12MB5915:EE_ x-ms-office365-filtering-correlation-id: a168e605-de56-4853-1a85-08db70cd26c4 x-ld-processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: sGVhbdoVggJQc3LcYOROxZ8iZdfEUHG/5WFvBEoZVNcPZABf797E9+7Gc0yrzl6uxXLBNaGkmMm0wZ+33s8lUo2W/77F/t3jPzp986olWpdPOcXZdxtG7Elj40Ok7SxqlhNFTZX2hRrd9j3ulwCcThO8MMIbiU4XvnQBYYDqfPscn/QH1IZ7tPnmvmmNTm7MKQN7AhEqDxoolkflAeY/2bxtl0+Kjkx6R+hATu7q6u/Vbag+wBJF5ffVdBwnqJtgjWSovcbta7mIh8alJ8IMhVpezOBXscVGS0xFCgXvw7hOExMyY2eCKVtCBkAQkQnTb0CDZh+LN2aQxBF2GTUULxTE+WnoNYQh30v3Z8wTjtGtSS7aRHQ+22YuliTOBDjiEoSbAnOK7Fo7KwO1F1wuiA29Oxd+Fh8PGRNwWRBHDTKI6Y+4CxAf3Lar184o6yAslHEh+BIr0SLjElejmagmsx8NfjIur85KaCofabrYNysWuaYyS3SiMhuOdKX5nu5z3rk1niMT8cKyxyUg4vCFF/7ewc6fmgamAUwVCRMKcJY5nwIZ9XXZX4LRzsM3QbSda+6fuceubP7qKfL5VWb3IHAERZGKuvpsssaj2vP4bO0uWabA6pT6AECVPR1AmrVtGUr71uGGZXyFKX0CkiVaz/690bkFluNNDbUU/84LYxs= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR12MB3753.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(4636009)(376002)(136003)(39860400002)(396003)(366004)(346002)(451199021)(478600001)(6506007)(53546011)(966005)(71200400001)(7696005)(38070700005)(7416002)(52536014)(5660300002)(86362001)(2906002)(30864003)(33656002)(6636002)(76116006)(4326008)(110136005)(54906003)(55016003)(8936002)(8676002)(41300700001)(66556008)(66446008)(66476007)(66946007)(316002)(64756008)(122000001)(38100700002)(83380400001)(186003)(26005)(9686003)(579004); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?mEHRFwA5E4V1z9bFFZAuKY61pSyS6zOFV9eqLPQF/RaT8NYS9lTQ1Tx4cpIh?= =?us-ascii?Q?MoO4Dj0Jm4dCmolT6PLTL0aL+oqJ4YKsTNFdDhF5R++32boXCjX1lOBCASPG?= =?us-ascii?Q?K2lcX/bB9nF23nGnXNcVutRMtfiQxGCwSNBs0oOiW7ZEjeGnCBzUmHwHf5ee?= =?us-ascii?Q?Jv5/IibNRyYi0gZwI/KEcZBKZ3K97jmfwCnm0O10FJncWR+dbzfKoTc9NK0f?= =?us-ascii?Q?o37LgavXH36CkU5wRlQSj+0WJyog4YwbScrRCzfeT+w9Q2GpYmsv45QQhC5N?= =?us-ascii?Q?3xWuKA0KDrXQy0hNumZ6mb/KtXdVko6JBjBHy5/ftB6Lx89iREiYFLPfUDHs?= =?us-ascii?Q?j1qTp1GaHn6Ri0MSKOiPTDyopRm8BZCbpDN/hS7xZpCobfn0hzWeWEkN9g+G?= =?us-ascii?Q?QzdAz1MEJXbp1bSZo7dzDqxJ5RA1daAgMgWULGEzIvfkNfKp5xrxKsHujJZB?= =?us-ascii?Q?vI/ED2FxeQLvvgCOfLCvPkxCpf0izCgT4xi3SZ1TMdkjsjvMFgHcAQA2LnQc?= =?us-ascii?Q?wS+7fPhRcFJDbn3Md7R3QnXm8mQIFK4mkS63nCKsMqViWGKaTedW9G0hKL1d?= =?us-ascii?Q?VlpQqI7dEjA0oDJsGudTyqkoBF23OX1ximnn2dvi75KS/bO9MYU8Si60QJV1?= =?us-ascii?Q?KlpOxiWr59o5aDb2r+pfby+ip5CERYdoitHr9DT+o9x+pfkufUsVEgBa6OBQ?= =?us-ascii?Q?Fw8B8O7u+VSyigmKno/TkmQxmOc1UVzNhOK77eDS0Uwarr4wa0kXtxtKiRou?= =?us-ascii?Q?3Tfv0FLQYNdZAafiJDaK/jfaCPtzpIohTN57kNcH7gANH57iw8qI7IryI1ib?= =?us-ascii?Q?mmFmcuyG8Zr10A+bYrI3UP+w5OCqncJ672ZoEg15n7I8Lkugc8AbuVxAP1m4?= =?us-ascii?Q?zbBhHWF0Lt/jqqc0BsAW94YTNYmKmrkZdAG07ke/nuaFLVX+Hub5IuOj+AJc?= =?us-ascii?Q?plMb6Iim6sJPd3mqeqOv1nUJ7uYFTiDm1aZ1MrC2qrFJE1ZXBzx3CytniPk1?= =?us-ascii?Q?64DTVi1jH8H83bvkIf2t2ki5ln4ysSUuSZN2KCRaZZhSs2BUxiarWCb59csq?= =?us-ascii?Q?7dCuR8ehAzMep4BBuRrQhQa/OBdFLwy6cCVtgFC6t0vbg1k/UrUI87aOEkC3?= =?us-ascii?Q?pXyGjkG2takaPrSpCSj/HjtSDUt5sZ4ldqGllRxLf+CuY3mzz9egWTavjdof?= =?us-ascii?Q?+DWRNehPwM7d+6kFbze+DrNVAlOP6jQYwRkLMy3zXbojhv5ALbE8NMOfyb4j?= =?us-ascii?Q?OLGVXFkbwwcQMhjQ2iHwQK6nsuuTSkEtW8+x0mXYqAObMlwCUWVlMqha1AL8?= =?us-ascii?Q?GT4/JEiw+uaKQHcdrWJRHlZ7RuGAf7MsgNX4ePsj3cwRV0BjCpJvGjgH4FYw?= =?us-ascii?Q?Z2Kzn6ackxaR1scW/r07+7i+jbnJKCGGit9hUf5i7zsScH5yoW8Fya12IY4j?= =?us-ascii?Q?mSXbYCPH9/PDyAhlsOGJl21p+tR/ERaip2ZOfc3CgaBZhi8NV5Y1p+CEu6IA?= =?us-ascii?Q?Ma8t7jfrHPn6eqX6JcsGkFv4FziFmbgO659AuQq5caqsyzDe1OS+L4f5JaXE?= =?us-ascii?Q?WCEN0DvX/h60Qc5NpS5rW/8prldqN1B9WAN/qOMJ?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB3753.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a168e605-de56-4853-1a85-08db70cd26c4 X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Jun 2023 13:57:42.3707 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: bZCQe8WRvgWvupXjDY+waRmk5vnidaKJmtO08Vjb0ORUnbtVOXj0KPJ/CnDFfKDiYLb99cj/jJ/ZB40E29eZ4g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB5915 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Hi, My primary concern is vectorized rx_burst performance impact. @Ali Alnubani, could we conduct the performance check, at least with SSE (x= 86) and Neon (BF2/3) archs? With best regards, Slava > -----Original Message----- > From: David Marchand > Sent: Thursday, June 15, 2023 4:47 PM > To: dev@dpdk.org > Cc: NBU-Contact-Thomas Monjalon (EXTERNAL) ; > i.maximets@ovn.org; Aman Singh ; Yuying > Zhang ; Matan Azrad ; Slava > Ovsiienko ; Ori Kam ; Suanming > Mou ; David Christensen > ; Ruifeng Wang ; Bruce > Richardson ; Konstantin Ananyev > ; Andrew Rybchenko > ; Ferruh Yigit > Subject: [RFC PATCH v2] ethdev: advertise flow restore in mbuf >=20 > As reported by Ilya [1], unconditionally calling > rte_flow_get_restore_info() impacts an application performance for driver= s > that do not provide this ops. > It could also impact processing of packets that require no call to > rte_flow_get_restore_info() at all. >=20 > Register a dynamic mbuf flag when an application negotiates tunnel metada= ta > delivery (calling rte_eth_rx_metadata_negotiate() with > RTE_ETH_RX_METADATA_TUNNEL_ID). >=20 > Drivers then advertise that metadata can be extracted by setting this dyn= amic > flag in each mbuf. >=20 > The application then calls rte_flow_get_restore_info() only when required= . >=20 > Link: http://inbox.dpdk.org/dev/5248c2ca-f2a6-3fb0-38b8- > 7f659bfa40de@ovn.org/ > Signed-off-by: David Marchand > --- > Changes since RFC v1: > - rebased, > - updated vectorized datapath functions for net/mlx5, > - moved dynamic flag register to rte_eth_rx_metadata_negotiate() and > hid rte_flow_restore_info_dynflag_register() into ethdev internals, >=20 > --- > app/test-pmd/util.c | 9 +++-- > drivers/net/mlx5/mlx5.c | 2 + > drivers/net/mlx5/mlx5.h | 5 ++- > drivers/net/mlx5/mlx5_flow.c | 47 +++++++++++++++++++++--- > drivers/net/mlx5/mlx5_rx.c | 2 +- > drivers/net/mlx5/mlx5_rx.h | 1 + > drivers/net/mlx5/mlx5_rxtx_vec_altivec.h | 16 ++++---- > drivers/net/mlx5/mlx5_rxtx_vec_neon.h | 6 +-- > drivers/net/mlx5/mlx5_rxtx_vec_sse.h | 6 +-- > drivers/net/mlx5/mlx5_trigger.c | 4 +- > drivers/net/sfc/sfc_dp.c | 14 +------ > lib/ethdev/rte_ethdev.c | 5 +++ > lib/ethdev/rte_flow.c | 29 +++++++++++++++ > lib/ethdev/rte_flow.h | 18 ++++++++- > lib/ethdev/rte_flow_driver.h | 6 +++ > lib/ethdev/version.map | 1 + > 16 files changed, 130 insertions(+), 41 deletions(-) >=20 > diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c index > f9df5f69ef..5aa69ed545 100644 > --- a/app/test-pmd/util.c > +++ b/app/test-pmd/util.c > @@ -88,18 +88,20 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, > struct rte_mbuf *pkts[], > char print_buf[MAX_STRING_LEN]; > size_t buf_size =3D MAX_STRING_LEN; > size_t cur_len =3D 0; > + uint64_t restore_info_dynflag; >=20 > if (!nb_pkts) > return; > + restore_info_dynflag =3D rte_flow_restore_info_dynflag(); > MKDUMPSTR(print_buf, buf_size, cur_len, > "port %u/queue %u: %s %u packets\n", port_id, queue, > is_rx ? "received" : "sent", (unsigned int) nb_pkts); > for (i =3D 0; i < nb_pkts; i++) { > - int ret; > struct rte_flow_error error; > struct rte_flow_restore_info info =3D { 0, }; >=20 > mb =3D pkts[i]; > + ol_flags =3D mb->ol_flags; > if (rxq_share > 0) > MKDUMPSTR(print_buf, buf_size, cur_len, "port %u, ", > mb->port); > @@ -107,8 +109,8 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, > struct rte_mbuf *pkts[], > eth_type =3D RTE_BE_TO_CPU_16(eth_hdr->ether_type); > packet_type =3D mb->packet_type; > is_encapsulation =3D RTE_ETH_IS_TUNNEL_PKT(packet_type); > - ret =3D rte_flow_get_restore_info(port_id, mb, &info, &error); > - if (!ret) { > + if ((ol_flags & restore_info_dynflag) !=3D 0 && > + rte_flow_get_restore_info(port_id, mb, &info, > &error) =3D=3D 0) { > MKDUMPSTR(print_buf, buf_size, cur_len, > "restore info:"); > if (info.flags & RTE_FLOW_RESTORE_INFO_TUNNEL) { > @@ -153,7 +155,6 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, > struct rte_mbuf *pkts[], > " - pool=3D%s - type=3D0x%04x - length=3D%u - > nb_segs=3D%d", > mb->pool->name, eth_type, (unsigned int) mb- > >pkt_len, > (int)mb->nb_segs); > - ol_flags =3D mb->ol_flags; > if (ol_flags & RTE_MBUF_F_RX_RSS_HASH) { > MKDUMPSTR(print_buf, buf_size, cur_len, > " - RSS hash=3D0x%x", > diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index > a75fa1b7f0..58fde3af22 100644 > --- a/drivers/net/mlx5/mlx5.c > +++ b/drivers/net/mlx5/mlx5.c > @@ -2347,6 +2347,7 @@ const struct eth_dev_ops mlx5_dev_ops =3D { > .get_monitor_addr =3D mlx5_get_monitor_addr, > .count_aggr_ports =3D mlx5_count_aggr_ports, > .map_aggr_tx_affinity =3D mlx5_map_aggr_tx_affinity, > + .rx_metadata_negotiate =3D mlx5_flow_rx_metadata_negotiate, > }; >=20 > /* Available operations from secondary process. */ @@ -2372,6 +2373,7 @@ > const struct eth_dev_ops mlx5_dev_sec_ops =3D { > .get_module_eeprom =3D mlx5_get_module_eeprom, > .count_aggr_ports =3D mlx5_count_aggr_ports, > .map_aggr_tx_affinity =3D mlx5_map_aggr_tx_affinity, > + .rx_metadata_negotiate =3D mlx5_flow_rx_metadata_negotiate, > }; >=20 > /* Available operations in flow isolated mode. */ diff --git > a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index > 021049ad2b..bf464613f0 100644 > --- a/drivers/net/mlx5/mlx5.h > +++ b/drivers/net/mlx5/mlx5.h > @@ -1745,6 +1745,7 @@ struct mlx5_priv { > unsigned int lb_used:1; /* Loopback queue is referred to. */ > uint32_t mark_enabled:1; /* If mark action is enabled on rxqs. */ > uint32_t num_lag_ports:4; /* Number of ports can be bonded. */ > + uint32_t tunnel_enabled:1; /* If tunnel offloading is enabled on rxqs. > +*/ > uint16_t domain_id; /* Switch domain identifier. */ > uint16_t vport_id; /* Associated VF vport index (if any). */ > uint32_t vport_meta_tag; /* Used for vport index match ove VF LAG. > */ @@ -2154,7 +2155,9 @@ int mlx5_flow_query_counter(struct rte_eth_dev > *dev, struct rte_flow *flow, int mlx5_flow_dev_dump_ipool(struct > rte_eth_dev *dev, struct rte_flow *flow, > FILE *file, struct rte_flow_error *error); #endif -void > mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev); > +int mlx5_flow_rx_metadata_negotiate(struct rte_eth_dev *dev, > + uint64_t *features); > +void mlx5_flow_rxq_dynf_set(struct rte_eth_dev *dev); > int mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts, > uint32_t nb_contexts, struct rte_flow_error *error); > int mlx5_validate_action_ct(struct rte_eth_dev *dev, diff --git > a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index > eb1d7a6be2..19e567401b 100644 > --- a/drivers/net/mlx5/mlx5_flow.c > +++ b/drivers/net/mlx5/mlx5_flow.c > @@ -1796,6 +1796,38 @@ flow_rxq_flags_clear(struct rte_eth_dev *dev) > priv->sh->shared_mark_enabled =3D 0; > } >=20 > +static uint64_t mlx5_restore_info_dynflag; > + > +int > +mlx5_flow_rx_metadata_negotiate(struct rte_eth_dev *dev, uint64_t > +*features) { > + struct mlx5_priv *priv =3D dev->data->dev_private; > + uint64_t supported =3D 0; > + > + if (!is_tunnel_offload_active(dev)) { > + supported |=3D RTE_ETH_RX_METADATA_USER_FLAG; > + supported |=3D RTE_ETH_RX_METADATA_USER_MARK; > + if ((*features & RTE_ETH_RX_METADATA_TUNNEL_ID) !=3D 0) { > + DRV_LOG(DEBUG, > + "tunnel offload was not activated, consider > setting dv_xmeta_en=3D%d", > + MLX5_XMETA_MODE_MISS_INFO); > + } > + } else { > + supported |=3D RTE_ETH_RX_METADATA_TUNNEL_ID; > + if ((*features & RTE_ETH_RX_METADATA_TUNNEL_ID) !=3D 0 && > + mlx5_restore_info_dynflag =3D=3D 0) > + mlx5_restore_info_dynflag =3D > rte_flow_restore_info_dynflag(); > + } > + > + if (((*features & supported) & RTE_ETH_RX_METADATA_TUNNEL_ID) > !=3D 0) > + priv->tunnel_enabled =3D 1; > + else > + priv->tunnel_enabled =3D 0; > + > + *features &=3D supported; > + return 0; > +} > + > /** > * Set the Rx queue dynamic metadata (mask and offset) for a flow > * > @@ -1803,11 +1835,15 @@ flow_rxq_flags_clear(struct rte_eth_dev *dev) > * Pointer to the Ethernet device structure. > */ > void > -mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev) > +mlx5_flow_rxq_dynf_set(struct rte_eth_dev *dev) > { > struct mlx5_priv *priv =3D dev->data->dev_private; > + uint64_t mark_flag =3D RTE_MBUF_F_RX_FDIR_ID; > unsigned int i; >=20 > + if (priv->tunnel_enabled) > + mark_flag |=3D mlx5_restore_info_dynflag; > + > for (i =3D 0; i !=3D priv->rxqs_n; ++i) { > struct mlx5_rxq_priv *rxq =3D mlx5_rxq_get(dev, i); > struct mlx5_rxq_data *data; > @@ -1826,6 +1862,7 @@ mlx5_flow_rxq_dynf_metadata_set(struct > rte_eth_dev *dev) > data->flow_meta_offset =3D > rte_flow_dynf_metadata_offs; > data->flow_meta_port_mask =3D priv->sh- > >dv_meta_mask; > } > + data->mark_flag =3D mark_flag; > } > } >=20 > @@ -11560,12 +11597,10 @@ mlx5_flow_tunnel_get_restore_info(struct > rte_eth_dev *dev, > uint64_t ol_flags =3D m->ol_flags; > const struct mlx5_flow_tbl_data_entry *tble; > const uint64_t mask =3D RTE_MBUF_F_RX_FDIR | > RTE_MBUF_F_RX_FDIR_ID; > + struct mlx5_priv *priv =3D dev->data->dev_private; >=20 > - if (!is_tunnel_offload_active(dev)) { > - info->flags =3D 0; > - return 0; > - } > - > + if (priv->tunnel_enabled =3D=3D 0) > + goto err; > if ((ol_flags & mask) !=3D mask) > goto err; > tble =3D tunnel_mark_decode(dev, m->hash.fdir.hi); diff --git > a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c index > a2be523e9e..71c4638251 100644 > --- a/drivers/net/mlx5/mlx5_rx.c > +++ b/drivers/net/mlx5/mlx5_rx.c > @@ -857,7 +857,7 @@ rxq_cq_to_mbuf(struct mlx5_rxq_data *rxq, struct > rte_mbuf *pkt, > if (MLX5_FLOW_MARK_IS_VALID(mark)) { > pkt->ol_flags |=3D RTE_MBUF_F_RX_FDIR; > if (mark !=3D RTE_BE32(MLX5_FLOW_MARK_DEFAULT)) { > - pkt->ol_flags |=3D RTE_MBUF_F_RX_FDIR_ID; > + pkt->ol_flags |=3D rxq->mark_flag; > pkt->hash.fdir.hi =3D > mlx5_flow_mark_get(mark); > } > } > diff --git a/drivers/net/mlx5/mlx5_rx.h b/drivers/net/mlx5/mlx5_rx.h inde= x > 52c35c83f8..3514edd84e 100644 > --- a/drivers/net/mlx5/mlx5_rx.h > +++ b/drivers/net/mlx5/mlx5_rx.h > @@ -136,6 +136,7 @@ struct mlx5_rxq_data { > struct mlx5_uar_data uar_data; /* CQ doorbell. */ > uint32_t cqn; /* CQ number. */ > uint8_t cq_arm_sn; /* CQ arm seq number. */ > + uint64_t mark_flag; /* ol_flags to set with marks. */ > uint32_t tunnel; /* Tunnel information. */ > int timestamp_offset; /* Dynamic mbuf field for timestamp. */ > uint64_t timestamp_rx_flag; /* Dynamic mbuf flag for timestamp. */ > diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h > b/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h > index 14ffff26f4..4d0d05c376 100644 > --- a/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h > +++ b/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h > @@ -296,15 +296,15 @@ rxq_cq_decompress_v(struct mlx5_rxq_data *rxq, > volatile struct mlx5_cqe *cq, > const __vector unsigned char fdir_all_flags =3D > (__vector unsigned char) > (__vector unsigned int){ > - RTE_MBUF_F_RX_FDIR | > RTE_MBUF_F_RX_FDIR_ID, > - RTE_MBUF_F_RX_FDIR | > RTE_MBUF_F_RX_FDIR_ID, > - RTE_MBUF_F_RX_FDIR | > RTE_MBUF_F_RX_FDIR_ID, > - RTE_MBUF_F_RX_FDIR | > RTE_MBUF_F_RX_FDIR_ID}; > + RTE_MBUF_F_RX_FDIR | rxq- > >mark_flag, > + RTE_MBUF_F_RX_FDIR | rxq- > >mark_flag, > + RTE_MBUF_F_RX_FDIR | rxq- > >mark_flag, > + RTE_MBUF_F_RX_FDIR | rxq- > >mark_flag}; > __vector unsigned char fdir_id_flags =3D > (__vector unsigned char) > (__vector unsigned int){ > - RTE_MBUF_F_RX_FDIR_ID, > RTE_MBUF_F_RX_FDIR_ID, > - RTE_MBUF_F_RX_FDIR_ID, > RTE_MBUF_F_RX_FDIR_ID}; > + rxq->mark_flag, rxq->mark_flag, > + rxq->mark_flag, rxq->mark_flag}; > /* Extract flow_tag field. */ > __vector unsigned char ftag0 =3D > vec_perm(mcqe1, > zero, > flow_mark_shuf); > @@ -632,8 +632,8 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq, > RTE_MBUF_F_RX_FDIR, RTE_MBUF_F_RX_FDIR}; > __vector unsigned char fdir_id_flags =3D > (__vector unsigned char)(__vector unsigned int){ > - RTE_MBUF_F_RX_FDIR_ID, RTE_MBUF_F_RX_FDIR_ID, > - RTE_MBUF_F_RX_FDIR_ID, RTE_MBUF_F_RX_FDIR_ID}; > + rxq->mark_flag, rxq->mark_flag, > + rxq->mark_flag, rxq->mark_flag}; > __vector unsigned char flow_tag, invalid_mask; >=20 > flow_tag =3D (__vector unsigned char) > diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h > b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h > index 75e8ed7e5a..91c85bec6d 100644 > --- a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h > +++ b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h > @@ -231,9 +231,9 @@ rxq_cq_decompress_v(struct mlx5_rxq_data *rxq, > volatile struct mlx5_cqe *cq, > vdupq_n_u32(RTE_MBUF_F_RX_FDIR); > const uint32x4_t fdir_all_flags =3D > vdupq_n_u32(RTE_MBUF_F_RX_FDIR > | > - RTE_MBUF_F_RX_FDIR_ID); > + rxq->mark_flag); > uint32x4_t fdir_id_flags =3D > - > vdupq_n_u32(RTE_MBUF_F_RX_FDIR_ID); > + vdupq_n_u32(rxq->mark_flag); > uint32x4_t invalid_mask, ftag; >=20 > __asm__ volatile > @@ -446,7 +446,7 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq, > if (rxq->mark) { > const uint32x4_t ft_def =3D > vdupq_n_u32(MLX5_FLOW_MARK_DEFAULT); > const uint32x4_t fdir_flags =3D > vdupq_n_u32(RTE_MBUF_F_RX_FDIR); > - uint32x4_t fdir_id_flags =3D > vdupq_n_u32(RTE_MBUF_F_RX_FDIR_ID); > + uint32x4_t fdir_id_flags =3D vdupq_n_u32(rxq->mark_flag); > uint32x4_t invalid_mask; >=20 > /* Check if flow tag is non-zero then set > RTE_MBUF_F_RX_FDIR. */ diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h > b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h > index b282f8b8e6..0766952255 100644 > --- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h > +++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h > @@ -214,9 +214,9 @@ rxq_cq_decompress_v(struct mlx5_rxq_data *rxq, > volatile struct mlx5_cqe *cq, >=20 > _mm_set1_epi32(RTE_MBUF_F_RX_FDIR); > const __m128i fdir_all_flags =3D >=20 > _mm_set1_epi32(RTE_MBUF_F_RX_FDIR | > - > RTE_MBUF_F_RX_FDIR_ID); > + rxq->mark_flag); > __m128i fdir_id_flags =3D > - > _mm_set1_epi32(RTE_MBUF_F_RX_FDIR_ID); > + _mm_set1_epi32(rxq->mark_flag); >=20 > /* Extract flow_tag field. */ > __m128i ftag0 =3D > @@ -442,7 +442,7 @@ rxq_cq_to_ptype_oflags_v(struct mlx5_rxq_data *rxq, > __m128i cqes[4], > if (rxq->mark) { > const __m128i pinfo_ft_mask =3D _mm_set1_epi32(0xffffff00); > const __m128i fdir_flags =3D > _mm_set1_epi32(RTE_MBUF_F_RX_FDIR); > - __m128i fdir_id_flags =3D > _mm_set1_epi32(RTE_MBUF_F_RX_FDIR_ID); > + __m128i fdir_id_flags =3D _mm_set1_epi32(rxq->mark_flag); > __m128i flow_tag, invalid_mask; >=20 > flow_tag =3D _mm_and_si128(pinfo, pinfo_ft_mask); diff --git > a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c index > bbaa7d2aa0..7bdb897612 100644 > --- a/drivers/net/mlx5/mlx5_trigger.c > +++ b/drivers/net/mlx5/mlx5_trigger.c > @@ -1282,8 +1282,8 @@ mlx5_dev_start(struct rte_eth_dev *dev) > dev->data->port_id); > goto error; > } > - /* Set a mask and offset of dynamic metadata flows into Rx queues. > */ > - mlx5_flow_rxq_dynf_metadata_set(dev); > + /* Set dynamic fields and flags into Rx queues. */ > + mlx5_flow_rxq_dynf_set(dev); > /* Set flags and context to convert Rx timestamps. */ > mlx5_rxq_timestamp_set(dev); > /* Set a mask and offset of scheduling on timestamp into Tx queues. > */ diff --git a/drivers/net/sfc/sfc_dp.c b/drivers/net/sfc/sfc_dp.c index > 9f2093b353..2b0a1d749d 100644 > --- a/drivers/net/sfc/sfc_dp.c > +++ b/drivers/net/sfc/sfc_dp.c > @@ -11,6 +11,7 @@ > #include > #include >=20 > +#include > #include > #include >=20 > @@ -135,12 +136,8 @@ sfc_dp_ft_ctx_id_register(void) > .size =3D sizeof(uint8_t), > .align =3D __alignof__(uint8_t), > }; > - static const struct rte_mbuf_dynflag ft_ctx_id_valid =3D { > - .name =3D "rte_net_sfc_dynflag_ft_ctx_id_valid", > - }; >=20 > int field_offset; > - int flag; >=20 > SFC_GENERIC_LOG(INFO, "%s() entry", __func__); >=20 > @@ -156,15 +153,8 @@ sfc_dp_ft_ctx_id_register(void) > return -1; > } >=20 > - flag =3D rte_mbuf_dynflag_register(&ft_ctx_id_valid); > - if (flag < 0) { > - SFC_GENERIC_LOG(ERR, "%s() failed to register ft_ctx_id > dynflag", > - __func__); > - return -1; > - } > - > + sfc_dp_ft_ctx_id_valid =3D rte_flow_restore_info_dynflag(); > sfc_dp_ft_ctx_id_offset =3D field_offset; > - sfc_dp_ft_ctx_id_valid =3D UINT64_C(1) << flag; >=20 > SFC_GENERIC_LOG(INFO, "%s() done", __func__); >=20 > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index > 7317015895..2884bc4f45 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -30,6 +30,7 @@ > #include "rte_ethdev.h" > #include "rte_ethdev_trace_fp.h" > #include "ethdev_driver.h" > +#include "rte_flow_driver.h" > #include "ethdev_profile.h" > #include "ethdev_private.h" > #include "ethdev_trace.h" > @@ -6441,6 +6442,10 @@ rte_eth_rx_metadata_negotiate(uint16_t port_id, > uint64_t *features) > return -EINVAL; > } >=20 > + if ((*features & RTE_ETH_RX_METADATA_TUNNEL_ID) !=3D 0 && > + rte_flow_restore_info_dynflag_register(NULL) < 0) > + *features &=3D ~RTE_ETH_RX_METADATA_TUNNEL_ID; > + > if (*dev->dev_ops->rx_metadata_negotiate =3D=3D NULL) > return -ENOTSUP; > ret =3D eth_err(port_id, > diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index > d41963b42e..5731b90642 100644 > --- a/lib/ethdev/rte_flow.c > +++ b/lib/ethdev/rte_flow.c > @@ -1441,6 +1441,35 @@ rte_flow_get_restore_info(uint16_t port_id, > NULL, rte_strerror(ENOTSUP)); > } >=20 > +static struct { > + const struct rte_mbuf_dynflag desc; > + uint64_t value; > +} flow_restore_info_dynflag =3D { > + .desc =3D { .name =3D "RTE_MBUF_F_RX_RESTORE_INFO", }, }; > + > +uint64_t > +rte_flow_restore_info_dynflag(void) > +{ > + return flow_restore_info_dynflag.value; } > + > +int > +rte_flow_restore_info_dynflag_register(uint64_t *flag) { > + if (flow_restore_info_dynflag.value =3D=3D 0) { > + int offset =3D > +rte_mbuf_dynflag_register(&flow_restore_info_dynflag.desc); > + > + if (offset < 0) > + return -1; > + flow_restore_info_dynflag.value =3D RTE_BIT64(offset); > + } > + if (*flag) > + *flag =3D rte_flow_restore_info_dynflag(); > + > + return 0; > +} > + > int > rte_flow_tunnel_action_decap_release(uint16_t port_id, > struct rte_flow_action *actions, diff --git > a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index > dec454275f..261d95378b 100644 > --- a/lib/ethdev/rte_flow.h > +++ b/lib/ethdev/rte_flow.h > @@ -5128,7 +5128,23 @@ rte_flow_tunnel_match(uint16_t port_id, > struct rte_flow_error *error); >=20 > /** > - * Populate the current packet processing state, if exists, for the give= n mbuf. > + * On reception of a mbuf from HW, a call to > +rte_flow_get_restore_info() may be > + * required to retrieve some metadata. > + * This function returns the associated mbuf ol_flags. > + * > + * Note: the dynamic flag is registered during a call to > + * rte_eth_rx_metadata_negotiate() with > RTE_ETH_RX_METADATA_TUNNEL_ID. > + * > + * @return > + * The offload flag indicating rte_flow_get_restore_info() must be cal= led. > + */ > +__rte_experimental > +uint64_t > +rte_flow_restore_info_dynflag(void); > + > +/** > + * If a mbuf contains the rte_flow_restore_info_dynflag() flag in > +ol_flags, > + * populate the current packet processing state. > * > * One should negotiate tunnel metadata delivery from the NIC to the HW. > * @see rte_eth_rx_metadata_negotiate() diff --git > a/lib/ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h index > 356b60f523..a28448fc3b 100644 > --- a/lib/ethdev/rte_flow_driver.h > +++ b/lib/ethdev/rte_flow_driver.h > @@ -376,6 +376,12 @@ struct rte_flow_ops { const struct rte_flow_ops * > rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error); >=20 > +/** > + * Register mbuf dynamic flag for rte_flow_get_restore_info. > + */ > +int > +rte_flow_restore_info_dynflag_register(uint64_t *flag); > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index > 1a33d72668..0031be32bf 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -311,6 +311,7 @@ EXPERIMENTAL { > rte_flow_async_action_list_handle_destroy; > rte_flow_async_action_list_handle_query_update; > rte_flow_async_actions_update; > + rte_flow_restore_info_dynflag; > }; >=20 > INTERNAL { > -- > 2.40.1