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 3199942CB8; Wed, 14 Jun 2023 18:46:39 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1A45540FAE; Wed, 14 Jun 2023 18:46:39 +0200 (CEST) Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2062.outbound.protection.outlook.com [40.107.95.62]) by mails.dpdk.org (Postfix) with ESMTP id 88D8940E0F for ; Wed, 14 Jun 2023 18:46:37 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nmRk2c3CdIbDuMIK6hFmb9JeP0qrQhNpK2u/eq7S5PaBB4sVxMFwVgLwSxqETByLeXAOT4T8c7QWv/h/jgr8k7lkfFl+XlcDQM2c4j8zY2H7DIhJyE4acHaW+WFkuJ1ADIQ8UzzvHHzMeZBJrFInUiBO8eW4xVcKItQokhnF3hO6BSxt7Kofep16Q9yD7V2OpIPxFbPWiBfp4vMtoj2tbdB6rWAwZk4+ZC3O8jct2f/gck4Ru+YRTgHWuChUj3OycAgkTQuMH9BfUtgkOs7oYr6aS4QJsnJsQtIgbVxP1C3ZeOPIZIE6svVE5tBHUW8VC7UKoQezGl9PCmHu/ot5Ig== 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=T+hpzND63Jjaz8CssebY0UTDAI5Xba7s2aagBr471Lo=; b=ImVI9GgGpxXmnu7NCw7SRPyvshq1ttc+jEwwjFzkFrz3ntATBC+2R+myqaNMvFTryquzz9MrEJG2joOZrJpEVGk/bJ88WUdjhYg+29bHxg8rRJR9XdcnoLr9Ab+2hMQVQzFal1g4eSjkgah0MB5qU1PUNVnQrA3sslnUajrdM9QGEXGO0nAfZgS94SSBvL7S7wKAOLQv8hvRWVMmmKJdMwDoF2Vvc3/i16nQg14iFiigEdpa/eCAvZBDQKSIDEm8qpFF9pvyJc0J2Kjf32Qdu8OJFhy38nw7A6E34xdXMqYzaoi+ICymOfBtWIZNkn9O4ttpW6LflHHMzKltHq0Mkw== 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=T+hpzND63Jjaz8CssebY0UTDAI5Xba7s2aagBr471Lo=; b=ndkjpisyBnVNbRRj2P2EahJCYvxbqIQoaczB1vI3gU56ZmSgfePtXXmIIgeTl2cSW2hGp5Ic3Pls6seVErt2iq3/+odbuXv0zMqsqNCTjz9lmfm1U370C8+2K76FUIgIWvI9fb0J5lpcNFh/cIxgg4leBIiY7R5ItcHhRzpaX355xdKqAnJnCDn7rMtpi/nhS8bzYiFKZM8EUG4J6ikAzSRQ3Fi70r3GaRo3QE4+xqFfiq5Oiq7WIH0bn1HudOGw1rDi9bBMEjLW0e7d/X48Z7x7waf8vXdBjp0TO5GJafX8gkyHxA/dIph/BFzgXuDIoofKbNG8oxbr4ghkVe73ng== Received: from DM6PR12MB3753.namprd12.prod.outlook.com (2603:10b6:5:1c7::18) by PH7PR12MB8014.namprd12.prod.outlook.com (2603:10b6:510:27c::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.36; Wed, 14 Jun 2023 16:46:35 +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.6477.037; Wed, 14 Jun 2023 16:46:35 +0000 From: Slava Ovsiienko To: David Marchand , "dev@dpdk.org" CC: "NBU-Contact-Thomas Monjalon (EXTERNAL)" , "i.maximets@ovn.org" , Aman Singh , Yuying Zhang , Matan Azrad , Andrew Rybchenko , Ferruh Yigit , Ori Kam Subject: RE: [RFC PATCH] ethdev: advertise flow restore in mbuf Thread-Topic: [RFC PATCH] ethdev: advertise flow restore in mbuf Thread-Index: AQHZfzy8v7kaVYYA5EipxrJPEvrW/q+KuLQw Date: Wed, 14 Jun 2023 16:46:34 +0000 Message-ID: References: <20230505103102.2912297-1-david.marchand@redhat.com> In-Reply-To: <20230505103102.2912297-1-david.marchand@redhat.com> Accept-Language: en-US Content-Language: en-US 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_|PH7PR12MB8014:EE_ x-ms-office365-filtering-correlation-id: 86982b4b-bd3f-4b0c-5799-08db6cf6ea2e 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: lOHxTiHFyDBvGP903So+YyPY92bUC1m0tvvhOBQ13SmbOONPodxoIXHjaEg4ZzO5Y1lFLZ5I/fME62k8wdyGCvhiPpJDf3WiyJUNVKefhmO1o08VAaLp6/N7ivAqBusR1oJtj1DcqIIbhvNMbHWZfLiWhTnXv2frGvNJyyCIwS6UCPNcWYLrHOR1esU3uyyULOsKHH4TTa6jVQ8EyWTYgQnkmXxi/vcZ/anqkUD4WzM40Cq0mGCV9vOwDNqdrW0sIMyXbBX2p+y9eM4CS1aRhFsEmsVgNV16VojgphjDxERDP5g4gYJlVFalPa5D8IbSOZgaeLaVanjUFuHQ8+3UKx8fA6k9GYJaRjUQm1XVYAOzmZBqb5aS3VlKLmqylafQp3kp45kn+mrAgruxOzscE+dSnnWAMPx8NfdKSLTibruLI9U9MMwJMZp+/UTFbiWYfL8/gTHoqE6WwFu2dKLhkz/YhukZUqmzS1MHuwgmpRGykmrBGDQpb42EKu+zb0oWR11SD2xhKEWCUzQYHD0nZTgUPQIkHj9iNtejH1UAJ9p5jIlIiW8LfVIySG7GEM76JUx3qenv2XsoPfMzp8JKgTpmnCOD8qy4hxX2jAMWZmYM5sN8H8abGihh47Zys7pTvPrwv5qSRogu/iHpGRykZ/aMZygdV/gUsL7iTj1oRbQ= 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)(39860400002)(136003)(366004)(346002)(396003)(376002)(451199021)(71200400001)(7696005)(122000001)(66946007)(30864003)(76116006)(41300700001)(2906002)(64756008)(66446008)(66476007)(66556008)(110136005)(33656002)(5660300002)(52536014)(38100700002)(8676002)(38070700005)(54906003)(316002)(86362001)(4326008)(55016003)(478600001)(8936002)(6506007)(966005)(53546011)(9686003)(26005)(107886003)(186003)(83380400001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?pHohapjWbpnWnRfXobYZPJrMqozDNeYqLoVMq+yCIJMRm4mPBYMJ/gyzOD35?= =?us-ascii?Q?13pZ1CZbNtrKQSQDNPf6mzOgCR4tab5gWJBVTWL2NlsOLcnkcvJGZXT+PErD?= =?us-ascii?Q?2iE6JptkR06d4FoEzewFg8lDvMiIHbU20SK+w2QYJMdiZ4WmAz+q4qROp6Fh?= =?us-ascii?Q?2bfwqO6LVCULR2zI/aP60LUJf/WRINgxhMcAYzl+DKj6Zn1E+pifo5hJUpTL?= =?us-ascii?Q?yTxcIEp8nZXfJ/NvSuR/DuT1J7CbQJpKledS8vbQwkca2j4V0QU0JYia8ChP?= =?us-ascii?Q?Q0t/+eVRM06yN3EVICGRe8A3DsG8k7NEdL3hQGkQk5ixpCwGW/mpRtaGCa+b?= =?us-ascii?Q?pCz8s0to1vv5vITdplB78ZgP81Pt96E+ovCRsUpKWfxGXiaR8mL4othnkPFe?= =?us-ascii?Q?KnRqK+m8PS7J1okVFI6oVG8wvyEAuDemLw26e/tSg9STWnGYvJ5hc9eVcmQ0?= =?us-ascii?Q?LVLlouWi+veGn+bEaP3cw1lGlb67msbAYelC1FOIjw/bUbS9HeL45KLsF4hr?= =?us-ascii?Q?/H1qPFZPQjwUfO4zt2uzCT2tT0htjwfZrv2rubvGIzig3T2AooyG8dIgbroo?= =?us-ascii?Q?BBzAyW+8ZL5GdnlZ02wgXNRGbyOlL6ZUBDcdH/TT6HWVnozXMzmfOeNwBgJ5?= =?us-ascii?Q?Oq1QRzG3tEDC7VsmAYpbKU3pmAZ4QORlABVBp2EK6Ze8NivAeq8SlIyTrApq?= =?us-ascii?Q?nF9szHKC7UzznpdLp88m1wpD74Y/NbJ0pA0W/IHpaBP02LIYa5yI9h9hDkc2?= =?us-ascii?Q?fFxd6lnZ3treCKUHq0dinYb5ErqT781mn46W+dfZuQVtB2hgtgH+L6+Q5JPf?= =?us-ascii?Q?y+Dc75KYHaq9GFMiYv2svOPK4PdBNZs43HJ4D+C1M5HNiXWoJz+Pyx1EKftX?= =?us-ascii?Q?wwtElERkv6mIsH7bDrqoe4NHe3+4QxG1F5/SbTb+MfxRpLty3BpnPX80L832?= =?us-ascii?Q?6OErz/pVUTPCuxmhEVkJQj06Twvl4jd5BFz0Fum4rPbNgpPafsGCRoUCYUte?= =?us-ascii?Q?nWduOf2X1mo26wlNruORtndEWz8mYWieX6Oyo0bxaoQAmb6nD878kZTfirXw?= =?us-ascii?Q?FgTx3ueqmOAGWxmsSR2pwI71Nyw1U2VLna72xB/XC1KeZ6oenMXSvAjQwlh9?= =?us-ascii?Q?4NbI/9UImrHjl5zk03bFElh9gaMLK/CyqQ8F1zlt0O7qSA60uMhPK/XH5Y7H?= =?us-ascii?Q?54HzbpOYqkUQat7x4n44n/fEznwYvnHwXo1b2Pifz2rTqlOQZDcrlAd7djDS?= =?us-ascii?Q?wRVQABB5sLhuG54H7rdVe94Gxx64yjHrQGjiakTr94bfaLCEr6f1P7Rk7rm8?= =?us-ascii?Q?aMRcZBk/lO9N126tVQP4lQYxFvFER6YWz9r+Zqd15rO3Pjgj0zthV7lfUL0I?= =?us-ascii?Q?gKUGXQYzBkaaSlbeoqGdngVocB/9GT+otj3Zm0wVHbSlI8d61RsXeEJm80FY?= =?us-ascii?Q?B5K1IQyoTNKUux1gMWGp9pl/kL9kH8q6A2zjzS4bZBh+NgaFwEjikYa2nGmP?= =?us-ascii?Q?Dxaw94bOq4NU8op54Q7lL4tDsiPJlniac+5pPuqqaX2pY9sFaFPURxvcJ0c6?= =?us-ascii?Q?iAV9wwcg5qpMLtDHwKkQQ/VmRXebwAUegwvDDgdV?= 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: 86982b4b-bd3f-4b0c-5799-08db6cf6ea2e X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Jun 2023 16:46:34.9581 (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: SPK1RKXbKSFGttOpEluE0rK6/CfTtNQeZAIZu2wVKsRnFk//FzjjM5752wKLok0++rTHGdl2Kf61/4ZRngyVVg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8014 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, David It looks like a good application datapath optimization, as for me. But I see some concerns: 1. Are we sure the PMD should register the flag, not application? IIRC, usually application registers needed flags/fields and PMDs just follo= w. + if (!sh->tunnel_hub && sh->config.dv_miss_info) { + err =3D mlx5_flow_restore_info_register(); + if (err) { + DRV_LOG(ERR, "Could not register mbuf dynflag for r= te_flow_get_restore_info"); + goto error; + } 2. This might have some general mlx5 Rx datapath performance impact (very m= inor though) It introduces extra memory access (instead of immed value). We should test = thoroughly. @@ -857,7 +857,7 @@ rxq_cq_to_mbuf(struct mlx5_rxq_data *rxq, struct rte_m= buf *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(ma= rk); } } 3. RTE_MBUF_F_RX_FDIR_ID is also handled in vectorized rx_burst() routines. Please, see: - mlx5_rxtx_vec_altivec.h - mlx5_rxtx_vec_neon.h - mlx5_rxtx_vec_sse.h This code must be updated, and it also might have some general (regardless = of using tunnel offload=20 - for all cases) performance impact. With best regards, Slava > -----Original Message----- > From: David Marchand > Sent: Friday, May 5, 2023 1:31 PM > To: dev@dpdk.org > Cc: NBU-Contact-Thomas Monjalon (EXTERNAL) ; > i.maximets@ovn.org; Aman Singh ; Yuying > Zhang ; Matan Azrad ; Slava > Ovsiienko ; Andrew Rybchenko > ; Ferruh Yigit ; Ori > Kam > Subject: [RFC PATCH] 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 > Advertise in mbuf (via a dynamic flag) whether the driver has more metada= ta > to provide via rte_flow_get_restore_info(). > The application can then call it only when required. >=20 > Link: http://inbox.dpdk.org/dev/5248c2ca-f2a6-3fb0-38b8- > 7f659bfa40de@ovn.org/ > Signed-off-by: David Marchand > --- > Note: I did not test this RFC patch yet but I hope we can resume and mayb= e > conclude on the discussion for the tunnel offloading API. >=20 > --- > app/test-pmd/util.c | 9 +++++---- > drivers/net/mlx5/linux/mlx5_os.c | 14 ++++++++++---- > drivers/net/mlx5/mlx5.h | 3 ++- > drivers/net/mlx5/mlx5_flow.c | 26 ++++++++++++++++++++------ > drivers/net/mlx5/mlx5_rx.c | 2 +- > drivers/net/mlx5/mlx5_rx.h | 1 + > drivers/net/mlx5/mlx5_trigger.c | 4 ++-- > drivers/net/sfc/sfc_dp.c | 9 ++------- > lib/ethdev/ethdev_driver.h | 8 ++++++++ > lib/ethdev/rte_flow.c | 29 +++++++++++++++++++++++++++++ > lib/ethdev/rte_flow.h | 19 ++++++++++++++++++- > lib/ethdev/version.map | 4 ++++ > 12 files changed, 102 insertions(+), 26 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/linux/mlx5_os.c > b/drivers/net/mlx5/linux/mlx5_os.c > index 980234e2ac..e6e3784013 100644 > --- a/drivers/net/mlx5/linux/mlx5_os.c > +++ b/drivers/net/mlx5/linux/mlx5_os.c > @@ -575,11 +575,17 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv) > goto error; > } > #endif > - if (!sh->tunnel_hub && sh->config.dv_miss_info) > + if (!sh->tunnel_hub && sh->config.dv_miss_info) { > + err =3D mlx5_flow_restore_info_register(); > + if (err) { > + DRV_LOG(ERR, "Could not register mbuf dynflag for > rte_flow_get_restore_info"); > + goto error; > + } > err =3D mlx5_alloc_tunnel_hub(sh); > - if (err) { > - DRV_LOG(ERR, "mlx5_alloc_tunnel_hub failed err=3D%d", err); > - goto error; > + if (err) { > + DRV_LOG(ERR, "mlx5_alloc_tunnel_hub failed > err=3D%d", err); > + goto error; > + } > } > if (sh->config.reclaim_mode =3D=3D MLX5_RCM_AGGR) { > mlx5_glue->dr_reclaim_domain_memory(sh->rx_domain, 1); > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index > 9eae692037..77cdc802da 100644 > --- a/drivers/net/mlx5/mlx5.h > +++ b/drivers/net/mlx5/mlx5.h > @@ -2116,7 +2116,8 @@ 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_restore_info_register(void); > +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 > d0275fdd00..715b7d327d 100644 > --- a/drivers/net/mlx5/mlx5_flow.c > +++ b/drivers/net/mlx5/mlx5_flow.c > @@ -1779,6 +1779,20 @@ 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_restore_info_register(void) > +{ > + int err =3D 0; > + > + if (mlx5_restore_info_dynflag =3D=3D 0) { > + if > (rte_flow_restore_info_dynflag_register(&mlx5_restore_info_dynflag) < 0) > + err =3D ENOMEM; > + } > + return err; > +} > + > /** > * Set the Rx queue dynamic metadata (mask and offset) for a flow > * > @@ -1786,7 +1800,7 @@ 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; > unsigned int i; > @@ -1809,6 +1823,9 @@ 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 RTE_MBUF_F_RX_FDIR_ID; > + if (is_tunnel_offload_active(dev)) > + data->mark_flag |=3D mlx5_restore_info_dynflag; > } > } >=20 > @@ -11453,11 +11470,8 @@ mlx5_flow_tunnel_get_restore_info(struct > rte_eth_dev *dev, > const struct mlx5_flow_tbl_data_entry *tble; > const uint64_t mask =3D RTE_MBUF_F_RX_FDIR | > RTE_MBUF_F_RX_FDIR_ID; >=20 > - if (!is_tunnel_offload_active(dev)) { > - info->flags =3D 0; > - return 0; > - } > - > + if ((ol_flags & mlx5_restore_info_dynflag) =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_trigger.c b/drivers/net/mlx5/mlx5_trig= ger.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..8b2dbea325 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,13 @@ sfc_dp_ft_ctx_id_register(void) > return -1; > } >=20 > - flag =3D rte_mbuf_dynflag_register(&ft_ctx_id_valid); > - if (flag < 0) { > + if (rte_flow_restore_info_dynflag_register(&sfc_dp_ft_ctx_id_valid) < > +0) { > SFC_GENERIC_LOG(ERR, "%s() failed to register ft_ctx_id > dynflag", > __func__); > return -1; > } >=20 > 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/ethdev_driver.h b/lib/ethdev/ethdev_driver.h inde= x > 2c9d615fb5..6c17d84d1b 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -1949,6 +1949,14 @@ __rte_internal > int > rte_eth_ip_reassembly_dynfield_register(int *field_offset, int *flag); >=20 > +/** > + * @internal > + * Register mbuf dynamic flag for rte_flow_get_restore_info. > + */ > +__rte_internal > +int > +rte_flow_restore_info_dynflag_register(uint64_t *flag); > + >=20 > /* > * Legacy ethdev API used internally by drivers. > diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index > 69e6e749f7..10cd9d12ba 100644 > --- a/lib/ethdev/rte_flow.c > +++ b/lib/ethdev/rte_flow.c > @@ -1401,6 +1401,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 > 713ba8b65c..5ce2db4bbd 100644 > --- a/lib/ethdev/rte_flow.h > +++ b/lib/ethdev/rte_flow.h > @@ -4918,7 +4918,24 @@ 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 the probing of the first > +device > + * that requires it. If this function returns a non 0 value, this value > +won't > + * change for the rest of the life of the application. > + * > + * @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/version.= map > b/lib/ethdev/version.map index 357d1a88c0..bf5668e928 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -299,6 +299,9 @@ EXPERIMENTAL { > rte_flow_action_handle_query_update; > rte_flow_async_action_handle_query_update; > rte_flow_async_create_by_index; > + > + # added in 23.07 > + rte_flow_restore_info_dynflag; > }; >=20 > INTERNAL { > @@ -328,4 +331,5 @@ INTERNAL { > rte_eth_representor_id_get; > rte_eth_switch_domain_alloc; > rte_eth_switch_domain_free; > + rte_flow_restore_info_dynflag_register; > }; > -- > 2.40.0